数据库映射 - 多个外键

时间:2012-12-12 14:36:20

标签: database database-design data-modeling

我想确保这是处理某种情况的最佳方式。

假设我有三个主要表格,我会保持它们的通用性。它们都有主键,它们都是独立引用的表。

表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

我的问题:这是处理这种情况的最佳方法吗?是否存在通用外键?或者我应该为每个主表有一个单独的注释表..即使数据结构完全相同?或者每个映射表是否是更好的解决方案?

2 个答案:

答案 0 :(得分:2)

  

我的问题:这是处理这种情况的最佳方法吗?

具有CHECK的多个FK只允许其中一个非NULL,这是一种合理的方法,特别是对于像这种情况一样的相对较少的表。

另一种方法是从公共“父”表中“继承”Table 1, 2 and 3,然后将注释连接到父级。

查看herehere了解详情。

  

是否存在通用外键?

如果你的意思是一个FK可以从一个表跳到另一个表,那么没有。

假设所有3个FK属于同一类型 1 ,理论上可以通过保留外键值和引用的表名 2 来实现类似的东西,然后通过它强制执行触发器,但声明性约束应该优先于它,即使以稍微多一点的存储空间为代价。

如果您的DBMS完全支持“虚拟”或“计算”列,那么您可以执行类似于上面的操作,但不是使用触发器,而是根据FK值和表生成3个计算列名称。在任何给定时间,这些计算列中只有一列是非NULL的,您可以像使用物理列一样使用“普通”FK。

但是,当存在许多“可连接”表并且您的DBMS在存储NULL时不节俭时,所有这些都是有意义的。只有3个,或者甚至当有更多,但你的DBMS在每个NULL字段上只花费一个位时,几乎没有什么好处。

  

或者我应该为每个主表都有一个单独的注释表,即使数据结构完全相同?

“数据结构”并不是唯一重要的事情。 如果你碰巧有不同的约束(例如,一个FK适用于其中一个但不适用于另一个),即使列相同,也可以保证单独的表。

但是,我猜这不是这种情况。

  

或者每个映射表是否都是更好的解决方案?

我不完全确定“映射表”是什么意思,但你可以这样做:

enter image description here

不幸的是,这会允许单个注释连接到多个表(或根本没有表),并且本身就是你已经拥有的复杂功能。

所有的说法和做法,你原来的解决方案可能还不错。


1 或者您愿意将其存储为字符串并与转换一起生存,您应该不愿意这样做。

2 在实践中,这实际上并不是一个名称(如在字符串中) - 它将是一个整数(或DBMS支持它的枚举),其中一个是众所周知的标识表的预定义值。

答案 1 :(得分:2)

感谢所有帮助人员,我能够在我的同事的帮助下制定解决方案。而不是多个映射表我决定只使用一个。

此映射表包含一组注释,因此它没有主键。并且每个组行链接回评论。因此,您可以拥有多个相同的组ID。一对多就是这种关系。

Database Group Table Concept