Отношение к составному внешнему ключу в одной колонке - PullRequest
1 голос
/ 20 февраля 2012

Я добавил столбец 'version' в таблицу, которая должна быть частью первичного ключа таблицы, но у меня есть связи по внешнему ключу с таблицами, которые не содержат версию. (И не должен) Я уверен, что получу хотя бы один ответ, объясняющий, почему это невозможно, я понимаю, почему я не могу создать здесь отношения. Я ищу элегантный / безболезненный способ обойти это. Мне нужно поведение, состоящее в том, что основная таблица может добавлять версии, в то время как «другая таблица» остается связанной со всеми из них. Это фактически отношение «многие ко многим» без таблицы соединений. (Однако на практике только одна «версия» основной таблицы для данного ключа активна в любой момент времени.) Я планирую обеспечить собственную ссылочную целостность, используя сочетание проверочных ограничений и триггеров ... но есть ли лучший способ ? Спасибо

Таблица

TableID (uniqueidentifier) - PRIMARY KEY
Version (int) - PRIMARY KEY
...

OTHERTABLE

OtherTableID (int) - PRIMARY KEY
TableID (uniqueidentifier)
...

Ответы [ 4 ]

2 голосов
/ 20 февраля 2012

Я думаю, что было бы лучше разделить TABLE на две таблицы: одну с данными, которые никогда не меняются (которые могут быть только самим идентификатором), и одну с данными, которые должны быть версионированы.OTHERTABLE будет иметь внешний ключ к первому.

(Я должен упомянуть, что мы использовали этот подход там, где я работаю, и он иногда вызывал досадные осложнения, особенно когда мы хотели изменить нашумы о том, какие поля должны быть версионированы. Это действительно не идеально. Но другие подходы имеют тенденцию приводить даже к большим проблемам.)

1 голос
/ 20 февраля 2012

Если я правильно понимаю ваши спецификации:

Parent
======
ParentID (uniqueidentifier) - PRIMARY KEY
...


OtherTable
==========
OtherTableID (int) - PRIMARY KEY
ParentID (int) -  FOREIGN KEY
...

ParentVersion
=============
ParentID (int) - PRIMARY KEY FOREIGN KEY
Version (int) - PRIMARY KEY

И если вам нужна активная версия для каждого родителя, еще одна таблица:

ParentActiveVersion
=============
ParentID (int) - PRIMARY KEY 
Version (int) 
FOREIGN KEY (ParentID, Version)
  REFERENCES ParentVersion(ParentID, Version)
0 голосов
/ 20 февраля 2012

Немного неаккуратно, но все, что здесь будет, - на основе комментария @ ypercube - могут ли все другие таблицы быть построены так, чтобы ссылаться на версию 1 (используя вычисляемый столбец, чтобы заставить 1 появляться в столбце в каждой из этих таблиц)

0 голосов
/ 20 февраля 2012

Отказ от ответственности: Следующее действительно для SQL Server. Я не претендую на другие СУБД.

Не включайте его в PK, просто добавьте UNIQUE INDEX в эти два поля, чтобы обеспечить уникальность:

CREATE UNIQUE INDEX ix_MyIndexName ON TABLE(TableID, Version)

Вам не нужно трогать существующие ключи, но это будет держать дубликаты значений вне таблицы.

Если в будущем вы решите ссылаться на оба этих поля одновременно (и вы используете SQL Server), то при необходимости вы также можете использовать уникальный индекс в качестве цели для внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...