Database design 额外的表还是非特定的外键?
系统中有几种类型的对象,每种类型的对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计注释表?我可以想出几个选择:Database design 额外的表还是非特定的外键?,database-design,foreign-keys,normalization,Database Design,Foreign Keys,Normalization,系统中有几种类型的对象,每种类型的对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计注释表?我可以想出几个选择: 一个注释表,每个对象类型(ObjectAID、ObjectBID等)有一个FK列 多个注释表,每种对象类型一个(ObjectAComments、ObjectBComments等) 一个泛型FK(ParentObjectID),另一列指示类型(“ObjectA”) 你会选择哪一个?有没有更好的方法我没有想到?设计模式使可注释(缺少更好的词)表遵循标准继承建模模
你会选择哪一个?有没有更好的方法我没有想到?设计模式使可注释(缺少更好的词)表遵循标准继承建模模式之一是否可行?如果是这样,您可以让注释表的FK指向公共父表。@Hank Gay 比如:
- 反对者
- 父ID
- 反对票
- 父ID
- 评论
- 父ID
- 父ID
ObjectAID
等ParentID
成为父母的PK和FK。这会让你觉得:
家长
ParentID
ObjectA
ParentID
(FK和PK)
ColumnFromA不为空
ObjectB
ParentID
(FK和PK)
ColumnFromB不为空
注释将保持不变。然后您只需要约束ID生成,这样您就不会意外地得到一个ObjectA
行和一个ObjectB
行,这两个行都指向相同的父行
行;最简单的方法是使用与父对象
用于ObjectA
和ObjectB
相同的序列(或任何序列)
您还可以看到许多具有以下内容的模式:
家长
ID
子类鉴别器
ColumnFromA(可为空)
ColumnFromB(可为空)
注释将保持不变。但是现在,如果不编写触发器或在不同的层上执行,就无法强制执行所有业务约束(子类的属性都可以为null)。请小心使用不完全指向一个表的通用外键。如果必须对一个类型拆分where条件并指向多个不同的表,则查询性能会显著降低。如果您只有几个类型,并且类型的数量不会增加,那么在不同的表中使用单独的可为null的外键是可以的,但是如果您有更多的类型,最好使用不同的数据模型(如@palmsey的建议).我喜欢做的一件事是创建一个单独的表,将通用/通用表链接到所有个性化表
因此,对于对象Foo和Bar,然后是对Foo和Bar的注释,您将有如下内容:
- 福
- Foo ID(主键)
- 酒吧
- 酒吧ID(PK)
- 评论
- 注释ID(主键)
- 评论文本
- 美食评论
- Foo ID(主键FK)
- 注释ID(主键FK)
- 酒吧评论
- 酒吧ID(PK FK)
- 注释ID(主键FK)
这一结构:
让您有一个通用的注释表
不需要具有表继承的DB
不会用注释相关信息污染Foo和Bar表
允许您将注释附加到多个对象(可能需要)
允许您将其他属性附加到Foo/Bar的连接处,并根据需要进行注释
仍然保留与标准(即:快速、简单、可靠)外键的关系