SQLで電気回路図をモデリングするときに問題が発生しました。キャプチャしたい構造は
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
ここで、「inst」は「instance」の略です。
例えば、私のように持っているかもしれないpart
とのLM358オペアンプpin
の1OUT、1IN-、1IN +、GND、2IN +、2IN-、2OUT、およびV CC。次に、このパーツを回路図に配置して、a part_inst
と8を
作成しpin_inst
ます。
データフィールドを無視して、スキーマでの最初の試みは
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)
を主キーとして使用できます。