Tengo una pregunta de "mejores prácticas" para un escenario.Asignación de Hibernación: de una columna a varias tablas
Escenario: Las entidades múltiples en un DB, por ejemplo, Document, BlogPost, Wiki pueden ser compartidas por individuos. En lugar de crear una tabla de acciones para cada entidad, se crea una sola tabla de Acciones. El problema es cómo asignar la tabla de acciones con diferentes entidades.
Tengo tres opciones, indique cuál es la mejor opción y si hay una mejor opción.
Opción 1: crear recursos compartidos de mesa como:
SHARES
id (unique)
entityId (non DB enforced FK to DOCUMENTS, WIKIS, POSTS etc.)
entityType
sharedBy
sharedWith
sharedDate
Aquí, entityId será una FK a documentId, wikiId, postID etc., etc., y se entityType identidad de qué tipo es el entityId.
Esto tiene problemas en el modelado de hibernación, al crear Compartir a la cartografía de entidad, como share.getDocument() o share.getWiki(), etc.
Opción 2: crear recursos compartidos de mesa que sólo se ejerce en la cuota información, y luego crear tablas de resolución que relacionen la acción con la entidad.
SHARES
id(PK)
sharedBy
sharedWith
sharedDate
shareType (helper field for searches)
SHARES_DOCUMENTS
share_id (unique ID and FK, one to one with SHARES)
document_id (FK to DOCUMENTS)
SHARES_POST
share_id (unique ID and FK, one to one with SHARES)
post_id (FK to POSTS)
more share tables here.
Así, hibernación sabia, Compartir puede tener de uno a uno para cada uno de los tipos de acciones (como share.getDocument(), share.getPost(), y shareType identificará el que la relación es 'activa')
opción 3 al igual que en la opción 1, pero crear columnas individuales en lugar de entidad Identificación
SHARES
id (unique ID)
documentId (FK to DOCUMENTS, nullable)
postId (FK to POSTS, nullable)
wikiId (FK to WIKIS, nullable)
sharedBy
sharedWith
sharedDate
sharedType
Aquí, cada columna podría ser asignada a la respectiva entidad, pero son anulables. sharedType puede identificar qué relación es 'activa'.
Entonces, la pregunta es, qué práctica es la mejor, tanto en la base de datos como en el mapeo de hibernación (y eventual consulta, en cuanto al rendimiento).
Gracias M. Más bien
Tenga una mirada en http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html –
Gracias, veremos esto. Pero, ¿es esto realmente un problema de herencia? O la herencia se puede usar para resolverlo. Si cada una de las tablas de resolución tuviera información adicional derivada, entonces podrían calificar para la herencia, pero solo contienen una relación con diferentes entidades. Además, la mayoría de los ejemplos/documentación de herencia no intentan hacer un solo enlace de columna a diferentes entidades. Realmente tienen campos independientes que los definen más. –
En un segundo pensamiento, las relaciones con diferentes entidades 'las definen más'. Examinaré varias clases con la opción de tabla única y veré cómo funciona. –