(多表中)存在一对多关系,确保至少有1条记录

时间:2015-01-22 13:02:10

标签: sql tsql

您将如何在以下场景中设计表格。

我有两对一对多的关系表。

Table A - One
Table B - Many

这种关系不会给我 在数据库级别上保护B表中至少有1条记录。

此外,表A应该知道表B中的最后一个标识符(基于任何规则)。

我怎么能完成这样的任务?

1 个答案:

答案 0 :(得分:1)

外键将在表B中,这将保证每一行在表A中都有相应的行。在一对一的关系中,表A中可能有一个冗余的FK以保证反向,但是对于一对多,这是不可能的。

几年前,当我设计一种维护数据版本的方法时,我遇到了类似的要求。表A将是静态或不变的数据(或者只是可能改变但不需要跟踪的数据),并且表B包含改变时的每个数据版本。我的解决方案是通过视图强制所有DML访问表。实际上有两个主要视图,一个执行一对多连接,提供了数据更改的完整历史记录。这有一个“无所事事”触发器,使其只读(一个不能改变历史记录)。另一个是静态数据的一对一连接,只有当前版本。这提供了“现在”存在的数据。所有DML都经历了这个观点。

插入行时,触发器会将预期字段插入两个表中。更新行时,更新静态字段(如果已更改),并将版本化数据作为新行插入。删除被处理为软删除。

关键是,没有办法只插入静态表。即使新行的所有版本化字段都包含NULL,这些字段仍然插入到版本化表中。因此,表A(我的静态表)中的行不可能在表B(我的版本化表)中没有至少一个相应的行。