edit : Ваше описание переменных атрибутов, которые применяются только в зависимости от значений в других атрибутах, представляет собой нереляционный ненормализованный дизайн. СУБД может быть не лучшим решением для хранения данных такого рода. Вероятно, RDF будет хорошим решением для данных, требующих такого уровня гибкости.
Мой предыдущий ответ, касающийся решений СУБД, приведен ниже:
Некоторые люди моделируют гибкие атрибуты с дизайном Entity-Attribute-Value , но это часто слишком неструктурировано, и в итоге вы сталкиваетесь с проблемами целостности данных. Используйте это, только если вам нужно практически неограниченное количество подтипов сущностей.
Другие люди используют Наследование одной таблицы , где вы помещаете все столбцы атрибутов, используемые всеми подтипами, в одну очень широкую таблицу и оставляете их NULL в строках, где атрибут не имеет отношения к подтипу. , Но у этого есть ограничения, потому что таблица может расти слишком широко, и вы теряете возможность делать любые атрибуты обязательными, потому что все они должны быть обнуляемыми.
Если у вас относительно небольшое количество подтипов сущностей, я бы рекомендовал создать зависимую таблицу для каждой группы обязательных атрибутов. Определите первичный ключ зависимой таблицы как внешний ключ к родительской таблице, чтобы получить отношение один к одному.
CREATE TABLE Vehicles (
vehicle_id INT PRIMARY KEY
...attributes common to all vehicles...
);
CREATE TABLE Automobiles (
vehicle_id INT PRIMARY KEY,
...attributes specific to autos...
FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id)
);
Вы также можете обеспечить немного большую целостность данных, кодируя подтип в первичном ключе родительской таблицы. Это означает, что строка в Automobiles
не может ссылаться на мотоцикл в Vehicles
.
CREATE TABLE Vehicles (
vehicle_id INT,
vehicle_type VARCHAR(10),
...attributes common to all vehicles...
PRIMARY KEY (vehicle_id, vehicle_type),
FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type)
);
CREATE TABLE Automobiles (
vehicle_id INT,
vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'),
...attributes specific to autos...
FOREIGN KEY (vehicle_id, vehicle_type)
REFERENCES Vehicles(vehicle_id, vehicle_type)
);
Конечно, вам нужно создавать новую зависимую таблицу каждый раз, когда вы определяете новый подтип, но этот дизайн дает вам гораздо больше структуры для обеспечения целостности данных, атрибутов NOT NULL и так далее.
Единственная часть, которую необходимо применить в логике приложения, - это создание строки в Automobiles
для каждой строки в Vehicles
с vehicle_type
= 'Automobile'.