我想确保这是处理某种情况的最佳方式。
假设我有三个主要表格,我会保持它们的通用性。它们都有主键,它们都是独立引用的表。
表1
PK
VarChar Data
表2
PK
VarChar Data
表3
PK
VarChar Data
以下是该方案,我希望用户能够对上述每个表中的特定行进行评论。但我不想创建一堆评论表。所以现在我就像这样处理它。
有一个注释表有三个外键列,每个列都引用上面的主表。存在一个约束,即只能对这些列中的一个进行评估。
CommentTable
PK
FK to Table1
FK to Table2
FK to Table3
VarChar Comment
FK to Users
我的问题:这是处理这种情况的最佳方法吗?是否存在通用外键?或者我应该为每个主表有一个单独的注释表..即使数据结构完全相同?或者每个映射表是否是更好的解决方案?
答案 0 :(得分:2)
我的问题:这是处理这种情况的最佳方法吗?
具有CHECK的多个FK只允许其中一个非NULL,这是一种合理的方法,特别是对于像这种情况一样的相对较少的表。
另一种方法是从公共“父”表中“继承”Table 1, 2 and 3
,然后将注释连接到父级。
是否存在通用外键?
如果你的意思是一个FK可以从一个表跳到另一个表,那么没有。
假设所有3个FK属于同一类型 1 ,理论上可以通过保留外键值和引用的表名 2 来实现类似的东西,然后通过它强制执行触发器,但声明性约束应该优先于它,即使以稍微多一点的存储空间为代价。
如果您的DBMS完全支持“虚拟”或“计算”列,那么您可以执行类似于上面的操作,但不是使用触发器,而是根据FK值和表生成3个计算列名称。在任何给定时间,这些计算列中只有一列是非NULL的,您可以像使用物理列一样使用“普通”FK。
但是,当存在许多“可连接”表并且您的DBMS在存储NULL时不节俭时,所有这些都是有意义的。只有3个,或者甚至当有更多,但你的DBMS在每个NULL字段上只花费一个位时,几乎没有什么好处。
或者我应该为每个主表都有一个单独的注释表,即使数据结构完全相同?
“数据结构”并不是唯一重要的事情。 如果你碰巧有不同的约束(例如,一个FK适用于其中一个但不适用于另一个),即使列相同,也可以保证单独的表。
但是,我猜这不是这种情况。
或者每个映射表是否都是更好的解决方案?
我不完全确定“映射表”是什么意思,但你可以这样做:
不幸的是,这会允许单个注释连接到多个表(或根本没有表),并且本身就是你已经拥有的复杂功能。
所有的说法和做法,你原来的解决方案可能还不错。
1 或者您愿意将其存储为字符串并与转换一起生存,您应该不愿意这样做。
2 在实践中,这实际上并不是一个名称(如在字符串中) - 它将是一个整数(或DBMS支持它的枚举),其中一个是众所周知的标识表的预定义值。
答案 1 :(得分:2)
感谢所有帮助人员,我能够在我的同事的帮助下制定解决方案。而不是多个映射表我决定只使用一个。
此映射表包含一组注释,因此它没有主键。并且每个组行链接回评论。因此,您可以拥有多个相同的组ID。一对多就是这种关系。