2010-08-03 67 views
0

我有一个表具有一个软外键,根据表中的另一个值将表中的记录链接到许多其他表之一。为了证明:SQL设计建议:一个FK列,许多表引用

TableOfTables:ID,表名

HistoryTable:身份证,TableOfTableId,NumberedTableId等..

表1:身份证,等等

表2:ID等..

表3:身份证,等等

TableOfTables包含在数据库中(表1,表2,表3,...),每个编号的表中的记录。 HistoryTable具有该表的外键(TableOfTableId)。它还有一个NumberedTableId列,它是对编号表的Id列的引用。

现在,这工作得很好,但NumberedTableId和编号表的Id列之间没有参照完整性。现在据我所知,你不能创建一种有条件的外键,它可以根据某些条件指向不同的表......那么在这里获得引用完整性的最好方法是什么?

我能想到的唯一两件事情是在HistoryTable中有大量可为空的NumberedTableId列,每个列都有一个外键给特定的编号表,其余的列填充为空......丑陋的,或者为每个编号的表有一个单独的HistoryTable ...这将意味着很多HistoryTables,因为我们的数据库中有许多编号表。

这里我最好的选择是什么?历史记录表实际上是一个记录表,它记录了编号表中的变化以及谁更改了值,它不用于审计之外的任何其他用途,也不用于我们的程序读取,但我不喜欢没有完整的参照完整性。

我在这里有什么选择?任何解决方案都需要能够使用Entity Framework 4.0。

感谢

+0

唯一干净的答案是:重新构建您的解决方案。使用一个表引用多个其他表的方法是一种巨大的SQL代码异味....清理它! – 2010-08-03 05:03:07

回答

1

其实,有三个选项(你提到的两个,但我会在这里重申他们)

  1. 多FK列有一个检查约束来强制执行给定行只能有一个FK值。
  2. 多个历史记录表
  3. 单个历史记录表,包含来自地狱的触发器以强制引用完整性(源表和历史记录表上的触发器)。

有没有干净的答案。我对这个问题的解决方法是使用外键和级联更新和删除为每个当前数据表提供历史记录表。这至少可以避免单个表格上的瓶颈,允许参照完整性,并且对其他开发人员来说很明显。