【发布时间】:2023-03-18 18:19:01
【问题描述】:
我想要一个数据库表来保存带有修订历史的数据(如维基百科上的页面)。我认为一个好主意是有两列来标识行:(name, version)。所以示例表如下所示:
TABLE PERSONS:
id: int,
name: varchar(30),
version: int,
... // some data assigned to that person.
因此,如果用户想要更新人员的数据,他们不会进行更新 - 相反,他们会创建一个具有相同 name 但不同 version 值的新 PERSONS 行。向用户显示的数据(对于给定的name)是具有最高version 的数据。
我有第二个表,比如 DOGS,它引用了 PERSONS 表中的人员:
TABLE DOGS:
id: int,
name: varchar(30),
owner_name: varchar(30),
...
显然,owner_name 是对 PERSONS.name 的引用,但我不能将其声明为外键(在 MS SQL Server 中),因为 PERSONS.name 不是唯一的!
问题:那么,在 MS SQL Server 2008 中,我应该如何确保数据库完整性(即,对于每只 DOG,PERSONS 中至少存在一行,这样它的 PERSON.name = = DOG.owner_name)?
我正在寻找最优雅的解决方案——我知道我可以在 PERSONS 表上使用触发器,但这并不像我想要的那样具有声明性和优雅性。有什么想法吗?
其他信息
上面的设计有以下优点,如果我需要,我可以“记住”一个人当前的id(或(name, version)对),并且我确信该行中的数据永远不会改变。这很重要,例如如果我将这个人的数据作为文档的一部分然后打印出来,并且在 5 年内有人可能想要打印一份完全不变的副本(例如,使用与今天相同的数据),那么这对他们来说将很容易做到.
也许您可以想出一个完全不同的设计来实现相同的目的,并且可以更轻松地执行其完整性(最好使用外键或其他约束)?
编辑:感谢迈克尔·加图索的回答,我发现了另一种描述这种关系的方式。有两种解决方案,我将其发布为答案。请投票选出你更喜欢哪一个。
【问题讨论】:
标签: sql sql-server foreign-keys unique