Вы можете поместить альтернативу в одну и ту же таблицу следующим образом:
create table Products (
ProductId int identity(1, 1) primary key,
Name nvarchar(200) not null,
Alternate_ProductId int references Products(ProductId),
check (Alternate_ProductId <> ProductId)
);
Обратите внимание, что в SQL Server первичный ключ автоматически кластеризуется, поэтому нет никаких причин для явного указания.Кроме того, по определению первичный ключ не равен NULL, поэтому NOT NULL
является избыточным.
Проверка ограничений позволяет пропускать значения NULL
(в отличие от WHERE
и CASE WHEN
), поэтомунадо беспокоиться о NULL
значениях для Alternate_ProductId
.
Это вызывает проблемы?Ну, это позволяет только один альтернативный продукт, и этого может быть недостаточно.Кроме того, это позволяет создавать цепочки альтернативных продуктов, которые могут стать громоздкими в будущем.