Ho riscontrato qualche problema a modellare uno schema elettrico in SQL. La struttura che vorrei catturare è
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
dove "inst" è l'abbreviazione di "istanza".
Ad esempio, potrei avere un part
amplificatore operazionale LM358 con pin
s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT e V CC . Potrei quindi posizionare questa parte su uno schema, creando a part_inst
e 8
pin_inst
s.
Ignorando i campi di dati, il mio tentativo iniziale di uno schema è stato
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
);
Il problema principale con questo schema è che a pin_inst
potrebbe essere legato a a part_inst
con part_id=1
ma pin
ha part_id=2
.
Vorrei evitare questo problema a livello di database anziché a livello di applicazione. Quindi, ho modificato le mie chiavi primarie per imporlo. Ho contrassegnato le righe modificate con --
.
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 --
);
La mia lamentela con questo metodo è che inquina le chiavi primarie: dovunque mi riferisca a part_inst
, devo tenere traccia sia di
part_inst_id
che di part_id
. Esiste un altro modo per applicare il vincolo
pin_inst.part_inst.part_id = pin_inst.pin.part_id
senza essere eccessivamente prolisso?
pin_inst_id
ridondanza. È possibile utilizzare la(part_inst_id, part_id, pin_id)
chiave primaria.