ฉันพบปัญหาในการสร้างแบบจำลองวงจรไฟฟ้าใน SQL โครงสร้างที่ฉันต้องการจะจับคือ
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
โดยที่ "inst" สั้นสำหรับ "อินสแตนซ์"
ยกตัวอย่างเช่นผมอาจจะมีเป็นpart
LM358 op-amp กับpin
s 1OUT, 1IN-, 1in + GND, 2in + 2IN-, 2OUT และ V CC จากนั้นฉันอาจวางส่วนนี้ลงบนแผนผังสร้างpart_inst
และ 8
pin_inst
วินาที
ละเว้นเขตข้อมูลความพยายามครั้งแรกของฉันที่ schema คือ
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
);
ปัญหาหลักคีมานี้ก็คือว่าpin_inst
อาจจะมีการเชื่อมโยงกับpart_inst
ที่มีpart_id=1
แต่มีpin
part_id=2
ฉันต้องการหลีกเลี่ยงปัญหานี้ในระดับฐานข้อมูลมากกว่าระดับแอปพลิเคชัน ดังนั้นฉันจึงปรับเปลี่ยนคีย์หลักเพื่อบังคับใช้ --
ฉันทำเครื่องหมายสายการเปลี่ยนแปลงกับ
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 --
);
จับฉันด้วยวิธีนี้ก็คือว่ามันเป็นมลพิษคีย์หลัก: ทุกที่ฉันหมายถึงpart_inst
ฉันต้องติดตามทั้งใน
และpart_inst_id
part_id
มีวิธีอื่นอีกpin_inst.part_inst.part_id = pin_inst.pin.part_id
ไหมที่ฉันจะบังคับใช้ข้อ จำกัด
โดยไม่ใช้คำพูดมากเกินไป?
pin_inst_id
ที่ซ้ำซ้อนได้เช่นกัน คุณสามารถใช้(part_inst_id, part_id, pin_id)
เป็นคีย์หลัก