Я хочу иметь таблицу базы данных, которая хранит данные с историей изменений (например, страницы в Википедии). Я подумал, что хорошей идеей будет иметь два столбца, которые идентифицируют строку: (name, version)
. Таким образом, пример таблицы будет выглядеть так:
TABLE PERSONS:
id: int,
name: varchar(30),
version: int,
... // some data assigned to that person.
Таким образом, если пользователи хотят обновить личные данные, они не делают ОБНОВЛЕНИЕ - вместо этого они создают новую строку ЧЕЛОВЕК с тем же name
, но другим version
значением. Данные, отображаемые пользователю (для заданных name
) - это данные с самым высоким version
.
У меня есть вторая таблица, скажем, СОБАКИ, которая ссылается на людей в таблице ЛИЦ:
TABLE DOGS:
id: int,
name: varchar(30),
owner_name: varchar(30),
...
Очевидно, owner_name
является ссылкой на PERSONS.name
, но я не могу объявить его как внешний ключ (в MS SQL Server), потому что PERSONS.name
не уникален!
Вопрос : Как тогда, в MS SQL Server 2008, я должен обеспечить целостность базы данных (т. Е. Что для каждого СОБАКА существует как минимум одна строка в ЧЕЛОВЕКАХ, так что ее ЛИЦО.name == DOG.owner_name)
Я ищу самое элегантное решение - я знаю, что могу использовать триггеры в таблице PERSONS, но это не так декларативно и элегантно, как хотелось бы. Есть идеи?
Дополнительная информация
Приведенный выше дизайн имеет следующее преимущество: я могу «запомнить» текущую id
(или (name, version)
пару) человека, и я уверен, что данные в этой строке никогда не изменятся. Это важно, например, если я помещу данные этого человека как часть документа, который затем будет напечатан, и через 5 лет кто-то захочет распечатать его копию без изменений (например, с теми же данными, что и сегодня), тогда это будет очень легко сделать .
Может быть, вы можете придумать совершенно другой дизайн, который достигает той же цели, и его целостность может быть обеспечена легче (предпочтительно с внешними ключами или другими ограничениями)?
Редактировать: Благодаря ответу Майкла Гаттузо, я обнаружил другой способ описать эти отношения. Есть два решения, которые я разместил в качестве ответов. Пожалуйста, проголосуйте, какой вам больше нравится.