SQL에서 전기 회로도를 모델링하는 데 문제가 발생했습니다. 내가 캡처하고 싶은 구조는
part ←────────── pin
↑ ↑
part_inst ←───── pin_inst
여기서 "inst"는 "instance"의 줄임말입니다.
예를 들어, s 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT 및 V CC 가 part
있는 LM358 연산 증폭기 가있을 수 있습니다 . 그런 다음이 부품을 회로도에 배치하여 a 및 8을
만들 수 있습니다.pin
part_inst
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)
기본 키로 사용할 수 있습니다 .