Ich hatte Probleme beim Modellieren eines elektrischen Schaltplans in SQL. Die Struktur, die ich erfassen möchte, ist
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
Dabei steht "inst" für "instance".
Zum Beispiel könnte ich als part
LM358 Operationsverstärker mit pin
s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT und V CC haben . Ich könnte diesen Teil dann auf einen Schaltplan setzen und a part_inst
und 8
pin_inst
s erstellen .
Ich ignorierte Datenfelder und versuchte zunächst, ein Schema zu erstellen
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
);
Das Hauptproblem bei diesem Schema ist, dass a pin_inst
möglicherweise an a part_inst
mit gebunden ist, part_id=1
aber es pin
hat part_id=2
.
Ich möchte dieses Problem eher auf Datenbankebene als auf Anwendungsebene vermeiden. Also habe ich meine Primärschlüssel geändert, um dies durchzusetzen. Ich habe die geänderten Zeilen mit markiert --
.
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 --
);
Mein Problem mit dieser Methode ist, dass sie die Primärschlüssel verschmutzt: Überall, wo ich auf a verweise, part_inst
muss ich sowohl das part_inst_id
als auch das verfolgen
part_id
. Gibt es eine andere Möglichkeit, die Einschränkung durchzusetzen,
pin_inst.part_inst.part_id = pin_inst.pin.part_id
ohne übermäßig ausführlich zu sein?
pin_inst_id
Redundanz entfernen . Sie können den(part_inst_id, part_id, pin_id)
als Primärschlüssel verwenden.