数据库设计选择多个可能的外表之一

时间:2013-01-18 22:57:10

标签: database database-design schema

假设我有两个或更多不同的对象,每个对象都由DB中的表表示。称这些文章,书籍等。现在说我想为每个对象添加一个评估功能。注释在每个对象中的行为都完全相同,所以理想情况下我想在一个表中表示它们。

但是,我不知道这样做的好方法。我知道如何做到这一点的方式是:

  • 为每个对象创建一个评论表。所以有Article_comments,Book_comments等。每个都有一个到适当对象的外键列。
  • 创建一个全局注释表。有一个引用“书”或“文章”的comment_type。每个可以为空的对象都有一个外键列,并使用comment_type来确定要使用的外键。

每次添加新对象时,上述任何一种方法都需要更新模型/ db。还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我个人认为你的第一个选择是最好的,但是我会把这个选项用于样式点:

评论对他们有自然的结构。您有第一条评论,也许评论评论。这真的是评论之树。

如果您为每个指向注释树根的对象添加了一个字段,该怎么办?然后你可以说,“检索文章123的评论树。”,你可以取根,然后根据一个评论表构建树。

注意:我仍然最喜欢选项1。 =)

答案 1 :(得分:0)

还有另一种策略:从一个公用表中继承 1 不同类型的“可评论”对象,然后将注释连接到该表:

enter image description here

所有3种策略都是有效的,并且各有利弊:

  1. 单独的注释表很干净,但需要在DML和可能的客户端代码中重复。此外,除非你采用某种形式的继承,否则不可能在它们上强制使用公共密钥,这就引出了一个问题:为什么不直接(3)直接进入?
  2. 一个包含多个FK的注释表将有很多NULL(可能存在或者可能不存在存储和缓存方面的问题),并且每当有一种新的“可注释”对象时,需要向注释表添加一个新列。添加到数据库中。顺便说一下,你不一定需要comment_type - 它可以推断来自哪个字段是非NULL。
  3. 当前关系DBMS不直接支持继承,它带来了自己的engineering tradeoffs集。从好的方面来说,它可以轻松添加新类型的可评论对象,而无需更改模型的其余部分。

  4. 1 Aka。类别,子类化,泛化层次结构...有关继承的更多信息,请查看ERwin Methods Guide的“子类型关系”部分。