Tôi gặp một số rắc rối khi mô hình hóa sơ đồ điện trong SQL. Cấu trúc tôi muốn nắm bắt là
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
trong đó "inst" là viết tắt của "dụ".
Ví dụ: tôi có thể có một part
op-amp pin
LM58 với s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT và V CC . Sau đó tôi có thể đặt phần này trên sơ đồ, tạo một part_inst
và 8
pin_inst
giây.
Bỏ qua các trường dữ liệu, nỗ lực ban đầu của tôi tại một lược đồ là
create table parts (
part_id bigserial primary key
);
create table pins (
pin_id bigserial primary key,
part_id bigint not null references parts
);
create table part_insts (
part_inst_id bigserial primary key,
part_id bigint not null references parts
);
create table pin_insts (
pin_inst_id bigserial primary key,
part_inst_id bigint not null references part_insts,
pin_id bigint not null references pins
);
Vấn đề chính với schema này là một pin_inst
có thể được gắn với một part_inst
với part_id=1
nhưng nó pin
có part_id=2
.
Tôi muốn tránh vấn đề này ở cấp cơ sở dữ liệu hơn là cấp ứng dụng. Vì vậy, tôi đã sửa đổi các khóa chính của mình để thực thi điều đó. Tôi đánh dấu các dòng thay đổi với --
.
create table parts (
part_id bigserial primary key
);
create table pins (
pin_id bigserial, --
part_id bigint not null references parts,
primary key (pin_id, part_id) --
);
create table part_insts (
part_inst_id bigserial, --
part_id bigint not null references parts,
primary key (part_inst_id, part_id) --
);
create table pin_insts (
pin_inst_id bigserial primary key,
part_inst_id bigint not null, --
pin_id bigint not null, --
part_id bigint not null references parts, --
foreign key (part_inst_id, part_id) references part_insts, --
foreign key (pin_id, part_id) references pins --
);
Điều hấp dẫn của tôi với phương pháp này là nó làm ô nhiễm các khóa chính: Ở mọi nơi tôi đề cập đến part_inst
, tôi cần theo dõi cả hai
part_inst_id
và part_id
. Có cách nào khác để tôi có thể thực thi các ràng buộc
pin_inst.part_inst.part_id = pin_inst.pin.part_id
mà không quá dài dòng không?
pin_inst_id
cái dư thừa. Bạn có thể sử dụng(part_inst_id, part_id, pin_id)
khóa chính.