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)是否会将孩子和家长之间的关系限制为一对一而不是一对多?或者,我是不是误解了?你可能也对:。也许对你的问题是一个很好的参考。