В моем понимании причина уникального ограничения на ID,[Type]
заключается в том, что в таблицах подробностей указывается ID,[Type]
как внешний ключ.Обычно родительская таблица должна иметь уникальное ограничение на столбцы, используемые для внешнего ключа.Например, таблица в вопросе может иметь 2 таблицы подробностей:
CREATE TABLE dbo.CARS(
....
vehicle_id INT NOT NULL,
[Type] VARCHAR(5) NOT NULL,
CONSTRAINT CAR_CHK_TYPE CHECK [Type]='Car',
CONSTRAINT CAR_FK_VEHICLE FOREIGN KEY (vehicle_id,[Type]) REFERENCES Vehincle(id,[Type]));
CREATE TABLE dbo.TRUCKS(
....
vehicle_id INT NOT NULL,
[Type] VARCHAR(5) NOT NULL,
CONSTRAINT CAR_CHK_TYPE CHECK [Type]='Truck',
CONSTRAINT CAR_FK_VEHICLE FOREIGN KEY (vehicle_id,[Type]) REFERENCES Vehincle(id,[Type]));
Таким образом, Cars
будет иметь сведения только о типе Car
, тогда как TRUCKS
только о Truck
.
Такой дизайн используется, чтобы избежать полиморфных отношений, например
CREATE TABLE dbo.VEHICLE (
...,
ref_id INT NOT NULL,
-- PK of 'master' table
ref_name VARCHAR(20) NOT NULL,
-- here we put 'truck' or 'car', so we virtually have 2 parents;
-- in this case we cannot use FK constraint, the only thing that may
-- somehow enforce the logical constraint is writing a trigger
Обновление
Ваше обновленное определение таблицы выглядит хорошо для меня.Я предполагаю, что образец таблицы изначально был разработан для Oracle, а затем портирован на SQLServer.В Oracle это уникальное ограничение и первичный ключ могут использовать один и тот же индекс, поэтому штраф за наличие ограничений PK и Unique отсутствует.