【发布时间】:2012-01-10 19:08:56
【问题描述】:
我有一个关于场景的“最佳实践”问题。
场景: 数据库中的多个实体,例如 Document、BlogPost、Wiki 可以由个人共享。不是为每个实体创建一个共享表,而是创建一个共享表。问题是,如何将共享表映射到不同的实体?
我有三个选项,请告知哪个选项最好,如果有更好的选项。
选项1: 创建表共享为:
SHARES
id (unique)
entityId (non DB enforced FK to DOCUMENTS, WIKIS, POSTS etc.)
entityType
sharedBy
sharedWith
sharedDate
这里,entityId 将是 documentId、wikiId、postId 等的 FK,entityType 将标识 entityId 的类型。
这在 Hibernate 建模中存在问题,在创建 Share 到实体映射时,例如 share.getDocument() 或 share.getWiki() 等。
选项 2: 创建只保存共享信息的表 Shares,然后创建将共享绑定到实体的解析表。
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.
因此,在休眠方面,Share 可以为每种共享类型一对一地设置(例如 share.getDocument()、share.getPost(),并且 shareType 将识别哪个关系是“活动的”)
选项 3 类似于选项 1,但创建单独的列而不是实体 id
SHARES
id (unique ID)
documentId (FK to DOCUMENTS, nullable)
postId (FK to POSTS, nullable)
wikiId (FK to WIKIS, nullable)
sharedBy
sharedWith
sharedDate
sharedType
在这里,每一列都可以映射到各自的实体,但它们可以为空。 sharedType 可以识别哪个关系是“活跃的”。
所以,问题是,哪种做法最好,无论是数据库方面还是休眠映射(以及最终查询,性能方面)。
谢谢 M.宁可
【问题讨论】:
-
谢谢,会调查的。但这真的是继承问题吗?或者可以使用继承来解决它。如果每个解析表都有额外的派生信息,那么它们就有资格继承,但它们只包含与不同实体的关系。此外,大多数继承示例/文档不会尝试将单个列链接到不同的实体。它们确实具有独立的字段,可以进一步定义它们。
-
再想一想,与不同实体的关系确实“进一步定义了它们”。我将使用单表选项研究多个类,看看它是如何工作的。
-
就像一个魅力。这个链接对于如何使用继承映射的注解也很有帮助。codeidol.com/java/netbeans/Entity-Inheritance/…