У мене виникли проблеми з моделюванням електричної схеми в SQL. Я хотів би захопити цю структуру
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
де "inst" - "екземпляр".
Наприклад, у мене може бути як part
підсилювач LM358 з pin
s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT і V CC . Тоді я можу розмістити цю частину на схемі, створивши а 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)
як основний ключ.