Sql a";评论「;关系数据库中的表
假设您想要为某个web应用程序构建一个数据库。该数据库已经包含许多表,将来可能需要对其进行扩展 此外,您希望最终用户能够对数据库中的任何类型的对象进行注释 我想找到一个足够通用的解决方案,这样我就不必每次在数据库中添加新表时都对其进行扩展 我想到了以下几点: 表名:注释 列: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 文本:文本 日期:日期
- id:注释的id
- user\u id:发表评论的用户的id
- object\u table\u name:注释对象所在的表
- object_id:object_table_name表中已注释对象的id
- 文本:文本
- 日期:日期
谢谢。-您混合了数据和元数据,这不是最好的设计模式。它们应该分开 然而,由于评论似乎并不十分重要,您的解决方案是可以的。最糟糕的情况是,你可能会失去对你的对象的评论 一些数据库,最著名的是,
PostgreSQL
,只支持这样的情况
更新:
如果您想对每个表中的单个记录进行注释,可以使用这样的表
object\u table\u name
如果重命名表,则不必更改,因为它是数据,而不是元数据
您不能编写本机SQL查询来获取任何表的记录的注释(查询开发时还不知道),尽管您可以构建动态查询来实现这一点
在这种情况下,您必须保持数据和元数据的同步(UPDATE
comment表,当您RENAME
它们所引用的表时)。第一个是DML
语句(更改数据),第二个是DDL
(更改元数据)
还要确保所有的主键
具有相同的类型(与对象id
相同)。阅读相关内容。
你可以把整个数据库都做成这样。但那样的话,处理这些数据就麻烦了
为什么不为每个应该支持注释的数据库实体放置一个注释属性呢?通过这种方式,您可以在一个查询中获得所需的所有数据,许多数据库GUI程序将为您提供SQL中的完整代码完成,这将防止在使用字符串操作时容易发生的错误。这样,代码就严重依赖于过程代码,这对于数据库系统来说是不正确的。您可以在单独的表中枚举表名,这样名称的更改就不会对系统产生任何重大影响。只需更新枚举表
虽然您正在远离引用完整性,但我可以看到另一种实现您所需的方法。我通常更喜欢将注释保留在它们所应用的行中。假设您的数据库有效地存储空的VARCHAR字段,那么您不应该为此支付罚金。当您实现这种方法时,实际上没有任何东西可以“扩展”,注释的维护成为您已经用来更新行的查询的一部分 单注释表方法的唯一优点是,它允许在注释之间轻松搜索不同类型的数据库条目。这不是更干净吗 表注释集
- id
- id
- 注释集\u id->注释集的外键
- 用户id
- 日期
- 文本
- 注释集\u id->注释集的外键
- 注释集\u id->注释集的外键
foo
或bar
。@Quassnoi为什么?外键可以为null,或者注释集可以为空。那么为什么要使用它们呢?另外,如何确保foo
和bar
都不引用相同的注释集
?您不能。基本上,每个可注释实体都可以指向包含注释的注释集。您可以通过引用null或空的注释集来表示给定实体没有注释。这对我来说是个好主意。我可以在代码中处理数据一致性问题,这应该不是问题。您需要保留这些注释的历史记录吗?我想不出创建任何类型的单独注释表的另一个主要原因。每个(object\u table\u name,object\u id)对可能有多个注释吗?如果始终为1:1,则只需将注释作为额外列包含在对象\u表\u名称本身中即可。如果是1:N,那么一个单独的