系统中有几种类型的对象,每种对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计评论表?我能想到几个选择:
- 一个评论表,每个对象类型(ObjectAID、ObjectBID 等)都有一个 FK 列
- 多个注释表,每个对象类型一个(ObjectAComments、ObjectBComments 等)
- 一个通用 FK (ParentObjectID) 与另一列指示类型 ("ObjectA")
你会选择哪个?有没有更好的方法我没有想到?
系统中有几种类型的对象,每种对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计评论表?我能想到几个选择:
你会选择哪个?有没有更好的方法我没有想到?
设计模式是否可行,以便可注释(因为没有更好的词)表遵循标准继承建模模式之一?如果是这样,您可以让注释表的 FK 指向公共父表。
@palmsey
差不多,但是我最常看到的那种模式的变化摆脱了ObjectAID
et al。ParentID
成为 PK 和 FK 到Parents
。这会让你得到类似的东西:
Parents
ParentID
ObjectA
ParentID
(FK 和 PK)ColumnFromA NOT NULL
ObjectB
ParentID
(FK 和 PK)ColumnFromB NOT NULL
Comments
将保持不变。然后你只需要约束 ID 生成,这样你就不会意外地得到ObjectA
一行和ObjectB
一行都指向同一Parents
行的结果;最简单的方法是使用与Parents
forObjectA
和. 相同的序列(或其他序列) ObjectB
。
您还会看到很多类似的模式:
Parents
ID
SubclassDiscriminator
ColumnFromA (nullable)
ColumnFromB (nullable)
并将Comments
保持不变。但是现在您不能在不编写触发器或在不同层执行它的情况下强制执行所有业务约束(子类的属性都可以为空)。
@汉克盖伊
所以像:
小心不指向一个表的通用外键。如果您必须拆分类型上的 where 条件并指向多个不同的表,查询性能会显着下降。如果您只有几种类型,并且类型的数量不会增加,则可以为不同的表设置单独的可为空的外键,但如果您有更多类型,则最好提出不同的数据模型(例如@palmsey 的建议)。
我喜欢做的一件事是有一个单独的表格,将通用/通用表格链接到所有个性化表格。
因此,对于对象 Foo 和 Bar,然后对 Foo 和 Bar 进行评论,您会得到如下内容:
这种结构: