2012-12-12 117 views
2

我想确保这是处理特定场景的最佳方法。数据库映射 - 多个外键

比方说,我有三个主表我会保持它们的通用性。它们都有主键,它们都是独立的表,没有任何引用。

表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

我会去用这种方法 - OK,你有三个FK列,只有其中之一是将有一个价值。但是通过这种方法,您**可以**通过设置适当的外键约束来强制引用完整性。如果你有一个* generic * FK(例如一个FK *类型的列),那么你就无法做到这一点 - 并且能够强制引用完整性在数据库设计范围内比“保存”一列更重要或两个.... –

回答

2

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

该映射表包含一组注释,所以它没有主键。并且每个组行都链接回评论。所以你可以有多个相同的组ID。一对多就是关系。

Database Group Table Concept

2

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

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

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

查看herehere了解更多信息。

是否存在通用外键?

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

假设所有3个FKS是同一类型,理论上可以通过保持外国键值和引用的表名,然后执行它通过触发器实现一些类似的,但声明的约束应该是首选在这一点上,即使以稍微多一点的存储空间的价格。

如果您 DBMS完全支持“虚拟”或“计算”栏,那么你可以做一些类似上述的东西,但不是有一个触发,基于FK值和表名3个计算列。这些计算列中只有一个在任何给定时间都是非空值,您可以像使用物理列那样为它们使用“正常”FK。

但是,当有许多“可连接”的表和你的DBMS在存储NULL时不节俭时,所有这些都是有意义的。当只有3个或者甚至比这个多的时候,获得的数据很少,但是您的DBMS仅在每个NULL字段上花费一个位。

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

“数据结构”不是唯一重要的东西。 如果您碰巧有不同的约束约束(例如FK适用于其中一个,但不适用于其他),即使列是相同的,这将保证单独的表。

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

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

我不完全相信你所说的“映射表”的意思,但你可以做这样的事情:

enter image description here

不幸的是,这将允许一个单一的评论将被连接到多于一个表格(或者根本没有表格),并且它本身就是你已经拥有的复杂功能。

说了这么多,你的原始解决方案可能没问题。


或者你愿意将其存储为字符串,并与转换,您应该不愿意干的活。

在实践中,这不会真的是一个名称(如在字符串) - 这将是一个整数与公知的预定值中的一个(或枚举如果DBMS支持的话)识别所述表。