Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL - Thiết kế Supertype / Subtype

Trước khi bắt đầu, tôi muốn chỉ ra rằng "gas" mô tả nhiên liệu hoặc một loại động cơ, không phải một loại sedan. Hãy suy nghĩ kỹ trước khi bạn tiếp tục đi theo con đường này. (Ngữ nghĩa quan trọng trong thiết kế cơ sở dữ liệu hơn hầu hết mọi người nghĩ.)

Những gì bạn muốn làm là khá đơn giản, nhưng không nhất thiết phải dễ dàng. Điểm quan trọng trong kiểu thiết kế supertype / subtype này (còn được gọi là vòng cung độc quyền) là không thể có hàng về xe sedan tham chiếu đến hàng về xe bán tải, v.v.

MySQL làm cho mã dài hơn, bởi vì nó không thực thi các ràng buộc KIỂM TRA. Bạn thật may mắn; trong ứng dụng của bạn, các ràng buộc CHECK có thể được thay thế bằng các bảng bổ sung và các ràng buộc khóa ngoại. Nhận xét đề cập đến SQL ở trên họ.

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');

Đây là loại điều tôi có thể triển khai như một ràng buộc KIỂM TRA trên các nền tảng khác. Bạn có thể làm điều đó khi ý nghĩa của các mã là rõ ràng đối với người dùng. Tôi hy vọng người dùng biết hoặc tìm ra rằng 's' là dành cho bán nguyệt và 'c' là dành cho ô tô, nếu không chế độ xem / mã ứng dụng sẽ ẩn mã khỏi người dùng.

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)
);

Ràng buộc UNIQUE cho phép cặp cột {veh_id, veh_type_code} là mục tiêu của tham chiếu khóa ngoại. Điều đó có nghĩa là hàng "ô tô" không thể tham chiếu đến hàng "bán", thậm chí do nhầm lẫn.

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)
);

Một cái gì đó khác mà tôi sẽ triển khai dưới dạng ràng buộc KIỂM TRA trên các nền tảng khác. (Xem bên dưới.)

insert into veh_type_is_car values ('c');

Chỉ có một hàng.

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)
);

Giá trị mặc định cho veh_type_code, cùng với tham chiếu khóa ngoại tới veh_type_is_car, đảm bảo rằng các hàng này trong bảng này có thể chỉ về ô tô và có thể chỉ phương tiện tham khảo là ô tô. Trên các nền tảng khác, tôi chỉ khai báo cột veh_type_code là 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');

Nếu bạn phải tạo các bảng bổ sung tham chiếu đến xe sedan, chẳng hạn như gas_sedans, diesel_sedans, v.v., thì bạn cần tạo các bảng một hàng tương tự như "veh_type_is_car" và đặt tham chiếu khóa ngoại cho chúng.

Trong quá trình sản xuất, tôi sẽ thu hồi quyền trên các bảng cơ sở và sử dụng

  • các chế độ xem có thể cập nhật để thực hiện chèn và cập nhật hoặc
  • các thủ tục được lưu trữ để thực hiện việc chèn và cập nhật.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL GROUP_CONCAT với COLUMN SPLIT

  2. MySQL ERROR 1005 (HY000):Không thể tạo bảng 'foo. # Sql-12c_4' (errno:150)

  3. Cách lấy bản ghi cuối cùng trong mỗi nhóm trong MySQL

  4. Chọn nếu tồn tại khác chèn?

  5. Có một lệnh MySQL để triển khai một cái gì đó như bảng thả ngoại trừ t1, b2 không?