Database design 建模-每种类型一张表,还是一张大表?
我正在对一个系统进行建模,该系统将在各种实体类型中拥有“投票权”——Database design 建模-每种类型一张表,还是一张大表?,database-design,schema,normalization,Database Design,Schema,Normalization,我正在对一个系统进行建模,该系统将在各种实体类型中拥有“投票权”——报告,评论,以及集合 这是仅有的三个可以投票的实体,尽管未来可能会有更多 目前,db模式有ReportUpvotes、ReviewUpvotes和CollectionUpvotes 我想知道是否最好将所有这些表合并到一个upvows表中,并带有类型的枚举 在评估此类决策时,我应该考虑什么 就像在软件开发中一样,需求应该强烈地影响您应该做什么 您是否需要能够同时或在一个位置显示所有投票/喜欢 你是否打算增加更多类型的投票 对这两个
报告
,评论
,以及集合
这是仅有的三个可以投票的实体,尽管未来可能会有更多
目前,db模式有ReportUpvotes
、ReviewUpvotes
和CollectionUpvotes
我想知道是否最好将所有这些表合并到一个upvows
表中,并带有类型的枚举
在评估此类决策时,我应该考虑什么 就像在软件开发中一样,需求应该强烈地影响您应该做什么
您是否需要能够同时或在一个位置显示所有投票/喜欢
你是否打算增加更多类型的投票
对这两个问题中的任何一个回答“是”,都会使我倾向于一张桌子
除此之外,就像在软件开发中一样,如果表在结构和用途上非常相似,那么可以将它们“重构”为单个表。出于这个原因,我倾向于使用一个表。在一个表中存储相同类型的实体(upvots)的想法对我来说非常有意义。然而,它可能以不同的方式实现。在球棒的右边,我能说出三种方法
问题中提出的第一个(除非我误解了它)导致多态关联,这种做法通常被认为是不好的。如果我错了,请纠正我的错误,但您似乎希望创建类似以下内容的表:CREATE TABLE upvows(…,type enum('Report','Review',…),entity_id int)
,其中entity_id
指的是基于type
列的值的报告
,审阅
等表。在没有触发器的情况下,无法强制执行此类约束
第二个是独占弧。一种更好的方法(可以强制执行引用完整性),但仍然非常丑陋。如果你走这条路,你会有
CREATE TABLE Upvotes(..., report_id INT , review_id INT, ....,
CONSTRAINT FK_REPORT FOREIGN KEY (report_id) REFERENCES Report(report_id),
CONSTRAINT FK_REPORT FOREIGN KEY (review_id) REFERENCES Review(review_id)
);
首先,您需要确保任何行中只有一个(report\u id、review\u id等)不为null。第二,添加可以向上投票的新实体类型意味着向Upvotes
添加新列
第三种方法是“共同家长”方法。您正在创建一个新表,比如说UpvotableEntity
(坏名称,仅用于说明)。然后将其设为现有ReportUpvotes、ReviewUpNotes和CollectionUpvotes的父表。最后,upvots
表存储upvotable\u entity\u id
是的,第一种方法是我正在考虑的-一个“EntityId”字段,用于查询与枚举对应的任何表。通用的家长方法-您是否介意进一步解释一下,或者甚至一个演示该概念的链接都会很有帮助。此外,我想补充一点,从实用性的角度来看,规范化和强制实施一切不应该是目标本身;想想每一个解决方案的时间和复杂性。太棒了,我刚订购了那本书。感谢您的帮助。通用的家长方法(child.Parentid)是否会将孩子和家长之间的关系限制为一对一而不是一对多?或者,我是不是误解了?你可能也对:。也许对你的问题是一个很好的参考。