본문 바로가기

CS ﹒ Algorithm/Database

데이터베이스 (6) 설계 2 - N : 1 관계, 재귀적 관계

 

 

1. N : 1 관계 ?

 

(1) N : 1 관계는 한 쪽이 관계를 맺은 쪽의 여러 객체를 갖는 것을 의미한다.

(2) 가장 흔하게 나타나는 매우 일반적인 관계이다.

 

예시)

부모와 자식 관계, 컴퓨터의 디렉토리 구조, 트리 구조, 반과 학생

 

 

 

 

2. ERD로 알아보는 N : 1 관계

* ERD : Entity Relational Diagrams

 

 

예시 1)

 

 

위 다이어그램에서 하나의 Customer가 여러 Order를 가질 수 있지만 Order는 Customer나 Car 없이는 존재할 수 없다.

이 때 Order는 Customer에게 종속되었다고 표현하며, 이러한 종속 관계로 무결성을 보장할 수 있다.

(부모 없는 데이터는 존재하지 않으므로)

 

 

 

예시 2 )

각 학년은 독립적으로 존재할 수 있으나 반은 학년에 종속된 상태로만 존재할 수 있다.

 

 

 

 

 

3. N : 1 관계에서 키 설계 예시

 

 

각 회사의 데이터가 들어가는 테이블이 있고, 회사의 부서들이 들어가는 테이블이 있다.

여러 회사와 각 부서가 중복될 수 있기 때문에 자식 테이블은 부서ID와 회사ID를 모두 기본키로 지정하여야 한다.

 

 

 

 

 

 

 

4. N : 1 재귀적 관계 예시

 

또 재귀야?

 

만약 밑도 끝도 없이 계속해서 하위 분류가 생겨나야하는 테이블이 있다고 생각해보자.

 

예)

1. 회사가 확장되면서 계속해서 새로운 팀이나 부서가 생겨날 수 있다.

2. 마트에서 상품 데이터를 관리하는데 계속해서 새로운 분류 번호와 분류 번호의 분류 번호가 생겨난다.

3. 폴더 내부에 파일이 있고 또 폴더 또 폴더 .. 끝은 존재하지 않는다.

 

그러면 그 때마다 테이블을 새로 생성해야 할까?

관계형 데이터베이스에서 자식 테이블의 ID를 미리 취할 방법은 없으나 부모 테이블의 ID를 미리 취할 방법은 존재한다.

자식은 언제 태어날지 모르지만 부모는 항상 존재하고 있기 때문이다.

 

해당 원리를 이용하여 한 개의 테이블에서 재귀적으로 계속해서 새로운 부모, 자식 관계를 만들어낼 수 있다.

 

상위 부서 id와 부서 id를 작성할 수 있도록 되어 있기 때문에 언제나 자유롭게 특정 부서의 하위 부서를 생성할 수 있다.

 

* LEFT JOIN인데 사진 자료가 잘못되었다.

 

위 테이블에서 우측이 NULL이라면 최하위 부서라는 의미가 되고, 좌측(상위 부서)이 NUL이라면 최상위 부서라는 의미가 된다.

이처럼 재귀적 관계를 이용하면 하나의 테이블 안에서도 데이터를 무한하게 확장할 수 있다.

 

물론, 이것은 각 데이터가 모두 같은 속성값을 가지고 있을 때 사용하는 방법이다.

 

 

 

이 전체적인 형태처럼 여러갈래로 뻗어가는 모양을 만들 것인지, 우측처럼 하나의 테이블로 모든 부서를 처리할 수 있도록 할 것인지, 절대적으로 옳은 방법은 없다.

결국 상황에 맞게 처리해야할 것이다.