Является ли хорошей идеей использовать вычисляемый столбец как часть первичного ключа? - PullRequest
7 голосов
/ 04 мая 2010

У меня есть таблица, определенная как:

OrderID bigint NOT NULL,
IDA varchar(50) NULL,
IDB bigint NULL,
[ ... 50 other non relevant columns ...]

Естественным первичным ключом для этой таблицы будет (OrderID, IDA, IDB), но это невозможно, поскольку IDA и IDB могут иметь значение NULL (оба могут быть NULL, но они никогда не определяются одновременно) , Сейчас у меня есть уникальное ограничение на эти 3 столбца.

Теперь мне нужен первичный ключ, чтобы включить репликацию транзакций, и я столкнулся с двумя вариантами:

  • Создайте столбец идентификации и используйте его в качестве первичного ключа
  • Создайте ненулевой вычисляемый столбец C, содержащий либо IDA, либо IDB, либо '', если оба столбца были нулевыми, и используйте (OrderID, C) в качестве моего первичного ключа.

Второй альтернативный очиститель швов, так как мой PK был бы значимым и выполнимым (см. msdn link ), но, поскольку я никогда не видел, чтобы это было сделано где-либо, мне было интересно, если бы они были некоторые минусы этот подход.

1 Ответ

2 голосов
/ 04 мая 2010

Столбцы, которые могут быть нулевыми, не считаются частью ПК, поскольку ПК также должен быть уникальным.

Кроме того, PK никогда не должен быть значимым, потому что значение значения может измениться.

Имеют ли таблица А и В отношение? Посмотрите на модель реляционных данных. В дизайне может быть ошибка.

OrderID должен быть уникальным и, следовательно, достаточным для PK.

...