Преди да започна, искам да отбележа, че "газ" описва или гориво, или вид двигател, а не вид седан. Помислете добре, преди да продължите по този път. (Семантиката е по-важна в дизайна на база данни, отколкото повечето хора си мислят.)
Това, което искате да направите, е доста просто, но не непременно лесно. Важният момент в този вид дизайн на супертип/подтип (известен още като изключителна дъга) е да се направи невъзможно редовете за седани, препращащи към редове за полукамиони и т.н.
MySQL прави кода по-подробен, защото не налага CHECK ограничения. Имате късмет; във вашето приложение ограниченията CHECK могат да бъдат заменени с допълнителни таблици и ограничения за външни ключове. Коментарите се отнасят до SQL по-горе тях.
create table vehicle_types (
veh_type_code char(1) not null,
veh_type_name varchar(10) not null,
primary key (veh_type_code),
unique (veh_type_name)
);
insert into vehicle_types values
('s', 'Semi-truck'), ('c', 'Car');
Това е нещото, което бих могъл да внедря като ограничение CHECK на други платформи. Можете да направите това, когато значението на кодовете е очевидно за потребителите. Очаквам потребителите да знаят или да разберат, че 's' е за полуфиналите, а 'c' е за автомобили, или че изгледите/кодът на приложението ще скрие кодовете от потребителите.
create table vehicles (
veh_id integer not null,
veh_type_code char(1) not null,
other_columns char(1) default 'x',
primary key (veh_id),
unique (veh_id, veh_type_code),
foreign key (veh_type_code) references vehicle_types (veh_type_code)
);
Ограничението UNIQUE позволява на двойката колони {veh_id, veh_type_code} да бъде цел на препратка към външен ключ. Това означава, че ред „кола“ не може да препраща към „полу“ ред, дори по погрешка.
insert into vehicles (veh_id, veh_type_code) values
(1, 's'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c'),
(6, 'c'), (7, 'c');
create table car_types (
car_type char(3) not null,
primary key (car_type)
);
insert into car_types values
('Van'), ('SUV'), ('Sed');
create table veh_type_is_car (
veh_type_car char(1) not null,
primary key (veh_type_car)
);
Нещо друго, което бих внедрил като ограничение CHECK на други платформи. (Вижте по-долу.)
insert into veh_type_is_car values ('c');
Само един ред.
create table cars (
veh_id integer not null,
veh_type_code char(1) not null default 'c',
car_type char(3) not null,
other_columns char(1) not null default 'x',
primary key (veh_id ),
unique (veh_id, veh_type_code, car_type),
foreign key (veh_id, veh_type_code) references vehicles (veh_id, veh_type_code),
foreign key (car_type) references car_types (car_type),
foreign key (veh_type_code) references veh_type_is_car (veh_type_car)
);
Стойността по подразбиране за veh_type_code, заедно с препратката към външния ключ към veh_type_is_car, гарантира, че тези редове в тази таблица могат да бъдат само за автомобили и могат само референтни превозни средства, които са автомобили. На други платформи просто бих декларирал колоната veh_type_code като veh_type_code char(1) not null default 'c' check (veh_type_code = 'c')
.
insert into cars (veh_id, veh_type_code, car_type) values
(2, 'c', 'Van'), (3, 'c', 'SUV'), (4, 'c', 'Sed'),
(5, 'c', 'Sed'), (6, 'c', 'Sed'), (7, 'c', 'Sed');
create table sedan_types (
sedan_type_code char(1) not null,
primary key (sedan_type_code)
);
insert into sedan_types values
('g'), ('d'), ('h'), ('e');
create table sedans (
veh_id integer not null,
veh_type_code char(1) not null,
car_type char(3) not null,
sedan_type char(1) not null,
other_columns char(1) not null default 'x',
primary key (veh_id),
foreign key (sedan_type) references sedan_types (sedan_type_code),
foreign key (veh_id, veh_type_code, car_type) references cars (veh_id, veh_type_code, car_type)
);
insert into sedans (veh_id, veh_type_code, car_type, sedan_type) values
(4, 'c', 'Sed', 'g'), (5, 'c', 'Sed', 'd'), (6, 'c', 'Sed', 'h'),
(7, 'c', 'Sed', 'e');
Ако трябва да създадете допълнителни таблици, които препращат седани, като gas_sedans, diesel_sedans и т.н., тогава трябва да създадете едноредови таблици, подобни на „veh_type_is_car“ и да зададете препратки към външни ключове към тях.
В производството бих отменил разрешенията за базовите таблици и бих използвал
- актуализиращи се изгледи за извършване на вмъквания и актуализации, или
- съхранени процедури за извършване на вмъквания и актуализации.