반응형
[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (1:1관계)
1. 1대 1 관계 (1)
- 1:1 관계란, 어느 쪽 당사자의 입장에서 상대를 보더라도, 반드시 단 하나씩 관계를 가지는 것을 이야기한다.
ex. 신랑-신부 관계 (부부관계)
1) 문제를 발생시키는 관계 형성
- 만약 지금까지 1:M관계를 맺었던 방식으로, 이 신랑-신부 관계를 만들어본다면?
a. 신랑 / 신부 값 입력
insert into 신랑
values(1,'홍길동',null),(2,'김길동',null),(3,'박길동',null);
insert into 신부
values(1,'어우동',null),(2,'황진이',null)
select * from 신랑
select * from 신부
b. 신랑 / 신부 full outer join 으로 부부관계 형성
select * from 신랑 a full outer join 신부 b on a.신랑id = b.신랑id
update 신랑 set 신부id = 1 where 신랑id = 1;
update 신부 set 신랑id = 1 where 신부id = 1;
select * from 신랑 a full outer join 신부 b on a.신랑id = b.신랑id
c. 해당 테이블에서 delete불가능
-- 서로 PK-FK 관계를 맺은 신랑 / 신부 id를 삭제할 수 없게 된다.
-- 서로 관계를 가지고 있으므로, 즉 서로가 서로를 부자지간을 형성하므로, 삭제가 불가능한 무한 굴레에 빠지게 된다.
-- 다시말해, delete는 불가능하다는 문제를 발생시킨다.
delete 신랑 where 신랑id = 1;
-- update로 변경은 가능하다.
update 신부 set 신랑id =3 where 신부id = 1;
update 신랑 set 신부id =1 where 신랑id = 3;
select * from 신랑 a full outer join 신부 b on a.신랑id = b.신랑id
2) 올바른 1:1 관계 형성
- 위의 방법은 2개의 테이블이 join되었을 때, 하나의 테이블에 PK가 2개로 구성된다. 이는 올바른 설계가 아니다.
- 따라서 1:1관계는 아래와 같은 형태로 구성되어야 한다.
// 신랑 id와 신부 id는 관계를 형성하며, 같은 값을 가지도록 관계를 형성하며, 신랑 id에 입력되지 않은 값은 신부id에도 입력될 수 없도록 한다.
insert into 신랑1 values(1,'홍길동'),(2,'김길동');
insert into 신부1 values(1,'김나연'),(2,'어우동');
select a.신랑id as 신랑신부id, a.신랑명, b.신부명 from 신랑1 a join 신부1 b on a.신랑id = b.신부id
2. 1대 1 관계 (2)
- 관공서 문서자료 사례
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |
반응형