1

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

  1. 一个评论表,每个对象类型(ObjectAID、ObjectBID 等)都有一个 FK 列
  2. 多个注释表,每个对象类型一个(ObjectAComments、ObjectBComments 等)
  3. 一个通用 FK (ParentObjectID) 与另一列指示类型 ("ObjectA")

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

4

5 回答 5

1

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

于 2008-09-02T16:21:37.770 回答
1

@palmsey

差不多,但是我最常看到的那种模式的变化摆脱了ObjectAIDet 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行的结果;最简单的方法是使用与ParentsforObjectA和. 相同的序列(或其他序列) ObjectB

您还会看到很多类似的模式:

  • Parents
    • ID
    • SubclassDiscriminator
    • ColumnFromA (nullable)
    • ColumnFromB (nullable)

并将Comments保持不变。但是现在您不能在不编写触发器或在不同层执行它的情况下强制执行所有业务约束(子类的属性都可以为空)。

于 2008-09-02T16:43:10.823 回答
0

@汉克盖伊

所以像:

  1. 对象A
    • 对象辅助
    • 父母ID
  2. 对象B
    • 对象出价
    • 父母ID
  3. 评论
    • 评论ID
    • 父母ID
  4. 父母
    • 父母ID
于 2008-09-02T16:34:19.080 回答
0

小心不指向一个表的通用外键。如果您必须拆分类型上的 where 条件并指向多个不同的表,查询性能会显着下降。如果您只有几种类型,并且类型的数量不会增加,则可以为不同的表设置单独的可为空的外键,但如果您有更多类型,则最好提出不同的数据模型(例如@palmsey 的建议)。

于 2008-09-02T16:51:07.823 回答
0

我喜欢做的一件事是有一个单独的表格,将通用/通用表格链接到所有个性化表格。

因此,对于对象 Foo 和 Bar,然后对 Foo 和 Bar 进行评论,您会得到如下内容:

    • Foo ID (PK)
  • 酒吧
    • 酒吧 ID (PK)
  • 评论
    • 评论 ID (PK)
    • 评论文字
  • Foo评论
    • Foo ID (PK FK)
    • 评论 ID (PK FK)
  • 酒吧评论
    • 酒吧 ID (PK FK)
    • 评论 ID (PK FK)

这种结构:

  1. 让您拥有一个通用的 Comments 表
  2. 不需要具有表继承的数据库
  3. 不会使用评论相关信息污染 Foo 和 Bar 表
  4. 允许您将评论附加到多个对象(可能是可取的)
  5. 如果需要,允许您将其他属性附加到 Foo/Bar 和 Comment 的连接处。
  6. 仍然保留与标准(即:快速、简单、可靠)外键的关系
于 2008-09-19T22:08:49.137 回答