Patrón de diseño para modelar enlaces y relaciones de contenido

Tengo un texto grande en una base de datos que tiene tres componentes principales: el texto completo, los párrafos que componen el texto principal y las palabras (tokens) en cada párrafo.

Para cada uno de estos 3 componentes habrá un determinado contenido vinculado relacionado. Por ejemplo, cada párrafo tendrá una lista de otro contenido de texto que trata sobre el mismo tema del párrafo recopilado de muchos recursos (obras académicas, pensamientos contemporáneos, etc.). Quiero diseñar un modelo de marco de juego para modelar esta asociación entre cada uno de los 3 componentes. con sus propias categorías de contenido relacionadas (obras académicas, pensamientos contemporáneos, etc.)

¿Cómo puedo diseñar un marco de juego limpio? Modelos 1.x que reflejen esta vinculación en una base granular desde el texto principal, a sus párrafos, a los tokens de cada párrafo y la asociación con las categorías de contenido de texto relacionadas. Estoy seguro de que hay un buen patrón de diseño para modelar este escenario. ¿Puede alguien sugerirme una solución limpia?

preguntado el 28 de julio de 12 a las 01:07

2 Respuestas

Le sugiero que almacene el texto una vez en su totalidad y luego tenga una jerarquía de clases flexible para indexar los contenidos.

He puesto las anotaciones de Hibernate solo donde son especiales.

Crea un contenedor para contener el texto en sí y los objetos de la parte:

public class DocumentContainer extends Model {
    // Column definition depends on the DB, here: MySQL
    @Column(columnDefinition="LONGTEXT")
    public String text;

    public Set<DocumentPart> documentParts;
}

Una parte de un documento se define en una región del texto, es de cierto tipo y puede hacer referencia a otras partes de los documentos:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="partType")
public class DocumentPart extends Model {

    Document document;

    // indices over the documents text for this part
    int startIndex;
    int endIndex;

    @Enumerated(EnumType.STRING)
    PartType partType;

    Set<DocumentPart> referencedParts;
}

public enum PartType {
    DOCUMENT, PARAGRAPH, TOKEN
}

Un párrafo sería entonces, por ejemplo:

@Entity
@DiscriminatorValue("PARAGRAPH")
public class Paragraph extends DocumentPart {
     Set<Token> tokens;
}

De esta manera, es flexible con respecto a los tipos de regiones que tiene sobre su documento y puede conservar todo el documento (incluida la puntuación, etc.).

Respondido 28 Jul 12, 11:07

gracias. esto me da algunas buenas ideas para empezar. Intentaré inspirarme en el modelo que presentaste y volveré si necesito más discusión. Gracias - Othman

Por lo que has escrito, podrías ir con...

@Entity
public class Document extends Model {
    public List<Paragraph> paragraphs;
}

    @Entity clase pública Párrafo extiende Modelo { lista pública de palabras; citas de listas públicas; }

@Entity
public class Citation extends Model {
    public String type;
    public URL linkedResource; // is resource external?
    public List<Document> // is resource internal to this system?
}

No tenía claro el enlace de la cita, por lo que le he dado 2 opciones. Podrías ir con cualquiera, o ambos.

Respondido 28 Jul 12, 19:07

Veo que no usaste la anotación de hibernación en los modelos de Playframework. no son necesarios? - Othman

sí lo son. pero solo necesita anotar las clases como @Entity. Los campos se definirán automáticamente, si no los especifica. - Codemwnci

creo que lista los campos en los modelos necesitan alguna anotación de hibernación específica para funcionar. Recuerdo que tuve problemas para declarar List en los modelos de reproducción y recuerde que requieren una anotación de hibernación complicada si no me equivoco. solía tener algunos errores en el juego quejándome de anotaciones incorrectas para la Lista archivados en modelos. - Othman

Nunca he tenido un problema con esto. Aunque puedo usar ArrayList en lugar de List. - Codemwnci

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.