Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql a";评论「;关系数据库中的表_Sql_Design Patterns - Fatal编程技术网

Sql a";评论「;关系数据库中的表

Sql a";评论「;关系数据库中的表,sql,design-patterns,Sql,Design Patterns,假设您想要为某个web应用程序构建一个数据库。该数据库已经包含许多表,将来可能需要对其进行扩展 此外,您希望最终用户能够对数据库中的任何类型的对象进行注释 我想找到一个足够通用的解决方案,这样我就不必每次在数据库中添加新表时都对其进行扩展 我想到了以下几点: 表名:注释 列: id:注释的id user\u id:发表评论的用户的id object\u table\u name:注释对象所在的表 object_id:object_table_name表中已注释对象的id 文本:文本 日期:日期

假设您想要为某个web应用程序构建一个数据库。该数据库已经包含许多表,将来可能需要对其进行扩展

此外,您希望最终用户能够对数据库中的任何类型的对象进行注释

我想找到一个足够通用的解决方案,这样我就不必每次在数据库中添加新表时都对其进行扩展

我想到了以下几点:

表名:注释

  • id:注释的id
  • user\u id:发表评论的用户的id
  • object\u table\u name:注释对象所在的表
  • object_id:object_table_name表中已注释对象的id
  • 文本:文本
  • 日期:日期
这个表解决了我的问题,唯一困扰我的是它的关系方面相当弱(例如,我不能将object_id设置为外键)。 此外,如果有一天我需要重命名一个表,我将不得不更改注释表中所有相关的条目

你认为这个解决方案怎么样?有没有设计模式可以帮助我


谢谢。-

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

然而,由于评论似乎并不十分重要,您的解决方案是可以的。最糟糕的情况是,你可能会失去对你的对象的评论

一些数据库,最著名的是,
PostgreSQL
,只支持这样的情况

更新:

如果您想对每个表中的单个记录进行注释,可以使用这样的表

object\u table\u name
如果重命名表,则不必更改,因为它是数据,而不是元数据

您不能编写本机SQL查询来获取任何表的记录的注释(查询开发时还不知道),尽管您可以构建动态查询来实现这一点

在这种情况下,您必须保持数据和元数据的同步(
UPDATE
comment表,当您
RENAME
它们所引用的表时)。第一个是
DML
语句(更改数据),第二个是
DDL
(更改元数据)

还要确保所有的
主键
具有相同的类型(与
对象id
相同)。

阅读相关内容。 你可以把整个数据库都做成这样。但那样的话,处理这些数据就麻烦了


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

您可以在单独的表中枚举表名,这样名称的更改就不会对系统产生任何重大影响。只需更新枚举表


虽然您正在远离引用完整性,但我可以看到另一种实现您所需的方法。

我通常更喜欢将注释保留在它们所应用的行中。假设您的数据库有效地存储空的VARCHAR字段,那么您不应该为此支付罚金。当您实现这种方法时,实际上没有任何东西可以“扩展”,注释的维护成为您已经用来更新行的查询的一部分

单注释表方法的唯一优点是,它允许在注释之间轻松搜索不同类型的数据库条目。

这不是更干净吗

注释集

  • id
注释

  • id
  • 注释集\u id->注释集的外键
  • 用户id
  • 日期
  • 文本
现有表格foo

  • 注释集\u id->注释集的外键
现有表格

  • 注释集\u id->注释集的外键

假设使用MS SQL,并且如您所建议的,如果卷相对较小,则可能值得探索。我过去曾成功地使用过它们,它们似乎是一个永久的固定装置。

我认为OP希望用户对行(用户的对象)进行评论,而不是对数据库对象(如表或索引)进行评论。@Larry:你可能是对的,尽管从帖子中看不太明显:)是的,很抱歉有歧义。我需要对表中的行进行注释。因此,除非您对数据进行注释,否则您将无法将数据插入
foo
bar
。@Quassnoi为什么?外键可以为null,或者注释集可以为空。那么为什么要使用它们呢?另外,如何确保
foo
bar
都不引用相同的
注释集
?您不能。基本上,每个可注释实体都可以指向包含注释的注释集。您可以通过引用null或空的注释集来表示给定实体没有注释。这对我来说是个好主意。我可以在代码中处理数据一致性问题,这应该不是问题。您需要保留这些注释的历史记录吗?我想不出创建任何类型的单独注释表的另一个主要原因。每个(object\u table\u name,object\u id)对可能有多个注释吗?如果始终为1:1,则只需将注释作为额外列包含在对象\u表\u名称本身中即可。如果是1:N,那么一个单独的