我有一个有关最佳实践的问题。
场景: 数据库中有多个实体,例如文档、博客文章和维基,可以由个人共享。而不是为每个实体创建一个共享表,创建了一个单一的共享表。问题在于,如何将共享表映射到不同的实体?
我有三个选项,请建议哪个选项最好,如果有更好的选项,请告知。 选项1: 创建名为“Shares”的表:
场景: 数据库中有多个实体,例如文档、博客文章和维基,可以由个人共享。而不是为每个实体创建一个共享表,创建了一个单一的共享表。问题在于,如何将共享表映射到不同的实体?
我有三个选项,请建议哪个选项最好,如果有更好的选项,请告知。 选项1: 创建名为“Shares”的表:
SHARES
id (unique)
entityId (non DB enforced FK to DOCUMENTS, WIKIS, POSTS etc.)
entityType
sharedBy
sharedWith
sharedDate
在这里,entityId将成为对documentId、wikiId、postId等的外键,而entityType将确定entityId是什么类型。
这在Hibernate建模中存在问题,在创建共享到实体映射时,例如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.
因此,在Hibernate方面,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 可以确定哪个关系是“活动的”。
因此,问题是,哪种做法最好,无论是数据库方面还是 hibernate 映射(以及最终的查询、性能方面)。
谢谢 M. Rather