2010-11-03 91 views
5

假设您想为某些Web应用程序构建数据库。这个数据库已经包含很多表格,你可能不得不在将来扩展它。关系数据库中“评论”表的最佳实践

此外,您希望最终用户能够评论数据库中的任何类型的对象。

我想找到一个解决方案,这将是足够通用的,这样我就不必每次在数据库中添加一个新表时扩展它。

我想到了以下几点:

表名:发表评论

  • ID:评论的ID
  • USER_ID:的的ID用户发表评论
  • object_table_name:选项卡其中注释对象为
  • object_id:object_table_name表中已注释对象的ID。
  • 文本:文本
  • 日期:依据

此表之类的解决我的问题,是困扰我的唯一的事情是,它的关系方面是比较薄弱(我不能让例如,object_id是一个外键)。 另外如果有一天我需要重新命名一个表,我将不得不改变评论表中的所有有关条目。

您对这个解决方案有什么看法?有设计模式可以帮助我吗?

谢谢.-

+0

你需要保留这些评论的历史记录吗?我想不出创建任何单独的评论表的另一个主要原因。 – jwiscarson 2010-11-03 16:38:20

+0

每对(object_table_name,object_id)对可以有多个注释吗?如果它始终是1:1,那么只需将注释作为额外列包含在object_table_name本身上。如果是1:N,那么需要一个单独的表格。 – 2010-11-03 20:41:40

回答

5

这不是更清洁吗?

comment_set

  • ID

评论

  • ID
  • comment_set_id - >外键comment_set
  • user_id说明
  • 日期
  • 文本

现有表

  • ...
  • comment_set_id - >外键comment_set

现有表酒吧

  • ...
  • comment_set_id - >外键comment_set
+0

因此,除非您发表评论,否则您将无法将数据插入“foo”或“bar”中? – Quassnoi 2010-11-03 16:28:15

+0

@Quassnoi为什么?外键可以为空,或者注释集可以为空。 – 2010-11-03 18:01:20

+0

为什么有他们呢?另外,你如何确保'foo'和'bar'不引用相同的'comment_set'? – Quassnoi 2010-11-03 18:05:38

1

您正在混合数据和元数据,这不是最好的设计模式。他们应该分开。

但是,由于评论似乎不是非常重要,无论如何,你的解决方案是好的。最糟糕的事情可能是失去对你的对象的评论。

一些数据库,最值得注意的是,PostgreSQL,支持COMMENT子句只是为了这样的情况。

更新:

如果你想在每个表中单独记录发表评论,这是确定有这样的表。

object_table_name如果您重命名表,则不必更改,因为它是数据而不是元数据。

你不能编写一个本地SQL查询,它将获取任何表的记录的注释(查询开发时刻不知道),尽管你可以构建动态查询来完成该操作。

在这种情况下,您必须保持数据和元数据同步(UPDATE评论表,当您参照表RENAME时)。第一个是DML声明(更改数据),第二个是DDL(更改元数据)。

还要确保所有PRIMARY KEYs都具有相同的类型(与object_id相同)。

+0

我想OP希望用户评论ROWS(对象到用户),而不是数据库对象,如表或索引。 – 2010-11-03 16:03:47

+0

@Larry:你可能是对的,虽然从帖子中不是那么明显:) – Quassnoi 2010-11-03 16:16:49

+0

是的,抱歉的含糊不清。我需要评论表格的行。 – Alexandre 2010-11-03 16:47:34

0

阅读关于EAV。 你可以使你的整个数据库。但接下来它将会与这些数据一起工作。

为什么你不想为每个应该支持注释的数据库实体放置Comment属性?通过这种方式,您可以在单个查询中获取所需的所有数据,而且许多用于数据库的GUI程序将为您提供SQL中的完整代码完成功能,这将防止在使用字符串操作时很容易发生的错误。这种方式代码严重依赖于程序代码,这对数据库系统来说是不正确的。

0

您可以在单独的表中枚举表名,以便更改名称不会以任何主要方式影响系统。只需更新枚举表。

虽然你是从参照完整性中疏远你的自我,我可以看到另一种方法来实现你想要的。

0

我通常更喜欢保留与他们适用的行的评论。假设你的数据库有效地存储了空的VARCHAR字段,你不应该为此付出代价。当你实现这种方法时,没有什么可以“扩展”的,维护注释成为你已经用来更新行的查询的一部分。

单笔记表方法的唯一好处是它允许在笔记中轻松搜索不同类型的数据库条目。

0

假设MS SQL,并且如果数量相对较小,您似乎建议,那么Extended Properties可能值得探索。过去我已经成功地使用了它们,它们似乎是一个永久的固定装置。