Database design 额外的表还是非特定的外键?

Database design 额外的表还是非特定的外键?,database-design,foreign-keys,normalization,Database Design,Foreign Keys,Normalization,系统中有几种类型的对象,每种类型的对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计注释表?我可以想出几个选择: 一个注释表,每个对象类型(ObjectAID、ObjectBID等)有一个FK列 多个注释表,每种对象类型一个(ObjectAComments、ObjectBComments等) 一个泛型FK(ParentObjectID),另一列指示类型(“ObjectA”) 你会选择哪一个?有没有更好的方法我没有想到?设计模式使可注释(缺少更好的词)表遵循标准继承建模模

系统中有几种类型的对象,每种类型的对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计注释表?我可以想出几个选择:

  • 一个注释表,每个对象类型(ObjectAID、ObjectBID等)有一个FK列
  • 多个注释表,每种对象类型一个(ObjectAComments、ObjectBComments等)
  • 一个泛型FK(ParentObjectID),另一列指示类型(“ObjectA”)

  • 你会选择哪一个?有没有更好的方法我没有想到?

    设计模式使可注释(缺少更好的词)表遵循标准继承建模模式之一是否可行?如果是这样,您可以让注释表的FK指向公共父表。

    @Hank Gay

    比如:

  • ObjectA
    • 反对者
    • 父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的连接处,并根据需要进行注释
  • 仍然保留与标准(即:快速、简单、可靠)外键的关系