Saya mengalami beberapa masalah pemodelan skema listrik dalam SQL. Struktur yang ingin saya tangkap adalah
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
di mana "inst" adalah kependekan dari "instance".
Sebagai contoh, saya mungkin memiliki part
op-amp LM358 dengan pin
s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT, dan V CC . Saya kemudian dapat menempatkan bagian ini pada skema, membuat a part_inst
dan 8
pin_inst
s.
Mengabaikan bidang data, upaya awal saya pada suatu skema adalah
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
);
Masalah utama dengan skema ini adalah bahwa a pin_inst
mungkin terkait part_inst
dengan part_id=1
tetapi pin
memiliki part_id=2
.
Saya ingin menghindari masalah ini pada level database daripada level aplikasi. Jadi, saya memodifikasi kunci utama saya untuk menegakkan itu. Saya menandai baris yang diubah dengan --
.
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 --
);
Keluhan saya dengan metode ini adalah bahwa itu mencemari kunci utama: Di mana pun saya merujuk pada part_inst
, saya harus melacak baik itu
part_inst_id
dan part_id
. Apakah ada cara lain yang bisa saya lakukan untuk menegakkan batasan
pin_inst.part_inst.part_id = pin_inst.pin.part_id
tanpa terlalu bertele-tele?
pin_inst_id
yang merupakan redundansi juga. Anda dapat menggunakan(part_inst_id, part_id, pin_id)
kunci utama.