2010-05-04 1 views
7

У меня есть таблица определяется как:Полезно ли использовать вычисляемый столбец как часть первичного ключа?

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

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

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

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

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

ответ

2

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

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

У таблицы A и B есть отношение? Посмотрите на модель реляционных данных. Возможно, в дизайне может быть ошибка.

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