SQL设计建议:一个FK列,很多表可供参考

时间:2010-08-03 01:49:24

标签: foreign-keys

我有一种情况,我有一个具有软外键的表,可以将表中的记录链接到许多其他表中的一个,具体取决于表中的另一个值。为了证明:

TableOfTables:Id,TableName

HistoryTable:Id,TableOfTableId,NumberedTableId等......

表1:Id等......

表2:Id等......

表3:Id等......

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

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

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

这里我最好的选择是什么?历史表实际上是一个记录表,记录更改和更改编号表中的值,它不用于除审计之外的任何内容,而不是我们的程序根本不读取的,但我不喜欢没有完全参照完整性。

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

由于

1 个答案:

答案 0 :(得分:1)

实际上,有三种选择(你已经提到过两种,但我会在这里重申一下)

  1. 带有检查约束的多个FK列,强制给定行只能有一个FK值。
  2. 多个历史记录表
  3. 单个历史记录表,其中包含来自地狱的触发器以强制执行参照完整性(在源表和历史记录表上触发)。
  4. 没有干净的答案。我解决这个问题的方法是使用外键和级联更新和删除为每个当前数据表创建一个历史表。这至少可以避免单个表上的瓶颈,允许引用完整性,并且对其他开发人员来说很明显。