본문 바로가기

DataBase

1:N 관계 / M:N 관계, 식별 관계 / 비식별 관계 - 개념과 예시

 

- 1 : N 관계 -

- 출판사 : 출판한 책
- 가수 : 노래
- 소속사 : 소속된 연예인
- 구단 : 소속된 운동 선수
- A : B 라고 했을 때, A 하나가 B를 여러 개 가지고 있을 수 있다.
    대신 반대는 성립하지 않는다.
    B 하나는 항상 단 하나의 A만 가진다.
    ex)
    A1 ---> B1      /     B1 ---> A1
    A1 ---> B2      /     B2 ---> A1
    A1 ---> B3      /     B3 ---> A1
    A1 ---> B4      /     B4 ---> A1
    A2 ---> B5      /     B5 ---> A2
    A2 ---> B6      /     B6 ---> A2

- 출판사 하나는 여러 책을 출판하고 있다. 반대로 책 한 권은 출판사를 한 곳만 가지고 있다.

- '김영사'라는 출판사 하나는 '사피엔스', '팩트풀니스', '아웃라이어' 등 여러 책을 출간하고 있다. 반대로 '사피엔스'라는 책은 출판사를 '김영사' 하나만 가지고 있을 수 있고, '대통령의 글쓰기'라는 책은 출판사를 '메디치미디어' 하나만 가지고 있고, '아주 작은 습관의 힘'이라는 책은 출판사를 '비즈니스북스' 라는 출판사 한 곳만 가질 수 있다.
- 가수 한 명은 여러 곡을 발매할 수 있다. 반대로 곡 하나는 가수를 한 명(그룹)만 가지고 있을 수 있다.

- '아이유' 라는 가수는 '밤편지', '가을 아침', '팔레트' 등 여러 곡을 가질 수 있음 / 반대로 '이게 아닌데' 라는 노래는 가수를 '존 박' 하나만 가질 수 있고, '다시 사랑한다 말할까' 라는 곡은 가수를 '김동률'이라는 가수 한 명만 가질 수 있음
- 소속사 한 곳은 여러 연예인을 데리고 있을 수 있다. 반대로 연예인 한 명은 소속사를 한 곳만 가질 수 있다.

- '안테나'라는 소속사는 '아이유', '이미주', '정재형' 등 여러 연예인을 데리고 있을 수 있음 / 반대로 '조세호'라는 연예인은 소속사를 '이미지나인컴즈' 한 곳만 가질 수 있고, '양세찬'이라는 연예인은 소속사를 'SM C&C'라는 곳 한 곳만 가질 수 있음

 

- M : N 관계 -

- 영화 : 배우
- 백화점 : 입점 업체
- 은행 : 고객
- 기업 : 주식 소유자
- A : B 라고 했을 때, A 하나는 B를 여러 개 가지고 있다.
    반대로도 마찬가지다.
    B 하나는 A를 여러 개 가지고 있다.
    ex)
    A1 ---> B1      /     B1 ---> A1
    A1 ---> B2      /     B1 ---> A3
    A1 ---> B3      /     B2 ---> A1
    A1 ---> B4      /     B2 ---> A2
    A2 ---> B2      /     B3 ---> A1
    A2 ---> B3      /     B3 ---> A2
    A2 ---> B5      /     B4 ---> A1
    A2 ---> B6      /     B5 ---> A2
    A3 ---> B1      /     B6 ---> A2
    A3 ---> B7      /     B7 ---> A3
- 영화 하나에는 여러 배우들이 출연한다. 배우 한 명은 여러 영화에 출연한다.

- '매트릭스'라는 영화 하나에는 '키아누 리브스', '로렌스 피시번', '캐리 앤 모스' 등이 출연하고, '키아누 리브스'라는 배우 한 명은 '매트릭스', '콘스탄틴', '존 윅' 등 여러 영화에 출연한다.
- 백화점 하나에는 여러 입점 업체들이 있다. 반대로 한 입점 업체는 여러 백화점에 입점해 있다.

- '롯데 백화점'이라는 백화점 하나에는 '입생로랑', '구찌', '루이비똥' 등 여러 입점 업체들이 입점해 있고, '입생로랑'이라는 입점 업체 하나는 '롯데 백화점', '현대 백화점', '신세계 백화점' 등 여러 백화점에 입점하고 있다.
- 은행 하나는 고객들을 여러 명 가지고 있다. 고객 한 명은 여러 은행을 이용하고 있다.

- '신한은행'이라는 은행 하나에는 '홍길동', '김철수', '고영희' 등 여러 사람들 고객으로 가지고 있다. 반대로 '홍길동'이라는 사람 한 명은 '신한은행', '국민은행', '카카오뱅크' 등 여러 은행을 이용하고 있다.
- 기업 하나는 여러 주주들을 가지고 있다. 주주 한 명은 여러 기업을 주주로서 소유하고 있다.


-  식별-비식별 관계 -

- 구단 => 축구 선수
- 축구 선수 => 선수 기록
- 구단 안에는 축구 선수가 있을 수도 있고, 없을 수도 있다. 이제 막 창단된 구단이면 소속된 선수가 아직 없겠지. 아니면 여러 명 데리고 있을 수도 있고.
- 선수 기록 안에는 축구 선수가 무조건 있어야 한다. 기록은 했는데, 어떤 선수를 기록한 건지 없다, 하는 상황은 있을 수가 없기 때문이다.
- A : B 라고 할 때, B는 A를 참조하고 있다. 이때, B에서 A의 값을 가지고 있을 수도 있고, 없을 수도 있다면, 비식별 관계다. 있어도 되고 없어도 된다면 비식별 관계다.
- 마찬가지로, B가 A를 참조하고 있는데, 이번에는 B에서 A의 값을 무조건 가지고 있어야 한다면, 식별 관계다. A가 없이는 B를 만들 수가 없다. A가 없는 B는 가능하지가 않다. 이러면 식별 관계다.


- 자기 참조 형태로 깊이 구성 = 셀프 조인 형태로 뎁스 나누기 -

- 예를 들어서 뎁스가 세 단계밖에 없다. 세 단계로 고정이다. 그러면 뎁스 하나에 테이블 하나를 넣어두면 된다. 대분류, 중분류, 소분류. 이러면 각각 테이블을 만들어 두면 될 것이다.
    >> 대분류 테이블(칼럼 : 대분류_고유번호, 대분류_이름) / 중분류 테이블(칼럼 : 중분류_고유번호, 중분류_이름) / 소분류 테이블(칼럼 : 소분류_고유번호, 소분류_이름) 
    이렇게 짜 놓고 소분류 테이블은 중분류 테이블을 참조하고, 중분류 테이블은 대분류 테이블을 참조하면 된다.
    그러면 뎁스 세 단계를 구현할 수 있다.
- 근데 만약 이런 상황이라면 어떻게 될까? 뎁스가 막 계속 추가된다. 예를 들어서 기업 조직도를 보자. 처음에는 <대표 - 직원> 로 뎁스가 2단계 구성이었는데, <대표 - 팀 - 팀원> 3단계 구성으로 커졌고, <대표 - 부서 - 팀 - 팀원> 4단계 구성으로 커졌고... 앞으로 더 커질 가능성도 있다.

이러면 뎁스가 깊어질 때마다 테이블을 추가해야 할까? 참조 관계도 계속 바꾸고, 바꿀 때마다 코드도 계속 수정하고? 이럴 때는 카테고리를 구성할 테이블 하나만 만들어놓고 자기 참조를 하는 식으로 구성하면 편하다.
    >> 카테고리 테이블(칼럼 : 카테고리_고유번호, 카테고리_이름, 상위_카테고리)
    이렇게 해 놓고 내가 나를 참조하는 식으로, 예를 들어서 '가전' 카테고리에 속하는 하위 카테고리들을 찾으려면, 레코드들 중에 '상위_카테고리' 칼럼의 값으로 '가전' 레코드의 고유번호가 들어 있는 레코드들을 뽑아 오면 된다.

 

- 대리키 / PK 두는 이유 -

- 레코드들은 모두 고유하게 구별할 수 있으면 된다. 그러려면 조건이 있다. 중복되는 값이 들어가면 안 된다. 한 칼럼의 값을 여러 레코드들이 똑같이 가지고 있다. 그러면 이중에 내가 원하는 레코드를 어떻게 구별할 수 있겠는가. 그래서 고유해야 한다.
- 또 생각해 볼 조건은, 개인정보가 들어가 있으면 안 된다. 예를 들어서, 대한민국 국민은 주민등록번호로 고유식별이 가능할 것이다. 하지만 데이터베이스에서 주민등록번호로 레코드를 구별하지는 않는다. 왜냐하면 개인정보기 때문이다. 콘솔에 다 찍히고 컨트롤러랑 다 왔다갔다 할 텐데 그 값이 민감한 개인정보 값이다? 곤란하다. 그래서 이거는 법으로 정해져 있다.
- 이런 경우에 '대리키'라는 개념을 도입한다. 고유하게 식별할 수 있는 다른 칼럼이 있지만 PK로 두기에 곤란하거나, 마땅히 고유하게 식별할 수 있는 칼럼이 없는 경우에, '대리키' 칼럼을 두고 그 값으로 고유한 식별 번호를 부여한다.

반응형