본문 바로가기

문과 코린이의, [C#] 기록/문과 코린이의, [SQL] 기록

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (1:1관계)

반응형

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (1:1관계)

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (1:1관계)

 


 

 

RDBMS Modeling 기초 - 인프런 | 강의

본 강좌는 데이터베이스 설계 이론을 실습 위주로 쉽게 풀어냈습니다. 책 등을 통해서 경험하신 분들은 대부분 데이터베이스 이론이 어렵다고 느끼고 포기하신 경험들이 있을 겁니다. 저도 그

www.inflearn.com


1. 1대 1 관계 (1)

- 1:1 관계란, 어느 쪽 당사자의 입장에서 상대를 보더라도, 반드시 단 하나씩 관계를 가지는 것을 이야기한다.

 ex. 신랑-신부 관계 (부부관계)


1) 문제를 발생시키는 관계 형성

- 만약 지금까지 1:M관계를 맺었던 방식으로, 이 신랑-신부 관계를 만들어본다면?

Data Diagram

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관계는 아래와 같은 형태로 구성되어야 한다.

Data Diagram

// 신랑 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)

- 관공서 문서자료 사례


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형