我在用SQL建模电气原理图时遇到了一些麻烦。我想捕捉的结构是
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
其中“实例”是“实例”的缩写。
例如,作为part
LM358运算放大器,我可能具有pin
s 1OUT,1IN-,1IN +,GND,2IN +,2IN-,2OUT和V CC。然后,我可能将此零件放在原理图上,并创建一个part_inst
和8
pin_inst
s。
忽略数据字段,我最初对模式的尝试是
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
);
这种模式的主要问题是a pin_inst
可能part_inst
与with 绑定在一起,part_id=1
但是pin
has 却绑定了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 --
);
我对这种方法的抱怨是,它污染了主键:在我所指的a处part_inst
,我都需要同时跟踪the
part_inst_id
和the part_id
。我还有另一种方法可以执行约束
pin_inst.part_inst.part_id = pin_inst.pin.part_id
而又不会过于冗长吗?
pin_inst_id
多余的。您可以使用(part_inst_id, part_id, pin_id)
as作为主键。