Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL - Дизайн на супертип/подтип

Преди да започна, искам да отбележа, че "газ" описва или гориво, или вид двигател, а не вид седан. Помислете добре, преди да продължите по този път. (Семантиката е по-важна в дизайна на база данни, отколкото повечето хора си мислят.)

Това, което искате да направите, е доста просто, но не непременно лесно. Важният момент в този вид дизайн на супертип/подтип (известен още като изключителна дъга) е да се направи невъзможно редовете за седани, препращащи към редове за полукамиони и т.н.

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“ и да зададете препратки към външни ключове към тях.

В производството бих отменил разрешенията за базовите таблици и бих използвал

  • актуализиращи се изгледи за извършване на вмъквания и актуализации, или
  • съхранени процедури за извършване на вмъквания и актуализации.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да четете sql заявка към pandas dataframe / python / django

  2. Как да създадете PHP таблица с две колони със стойности от базата данни?

  3. Местоположение на таблиците на базата данни - MySQL - Windows XP

  4. Оптимизация на заявки за използване на MySQL индекс

  5. Актуализирайте първичния ключ Django MySQL