2

假设我有两个或更多完全不同的对象,每个对象都由数据库中的一个表表示。将这些称为文章、书籍等。现在假设我想为这些对象中的每一个添加评论功能。注释在每个对象中的行为完全相同,因此理想情况下,我希望将它们表示在一个表中。

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

  • 为每个对象创建一个注释表。Article_comments、Book_comments 等也是如此。每个都有一个指向相应对象的外键列。
  • 创建一个全局注释表。有一个引用“Book”或“Article”的comment_type。每个对象都有一个可以为空的外键列,并使用 comment_type 来确定要使用的外键。

上述任何一种方式都需要在每次添加新对象时更新模型/数据库。有没有更好的办法?

4

2 回答 2

0

我个人认为您的第一个选项是最好的,但我会将此选项用于样式点:

评论对他们来说有一个自然的结构。你有第一个评论,也许是关于评论的评论。这真的是一棵评论树。

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

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

于 2013-01-18T23:02:16.090 回答
0

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

在此处输入图像描述

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

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

1阿卡。类别、子类化、泛化层次结构...有关继承的更多信息,请查看ERwin 方法指南的“子类型关系”部分。

于 2013-01-18T23:42:16.047 回答