자격증/SQLD

SQLD 요약정리 - 식별자

비뀨_ 2022. 12. 19. 01:02

취업 준비와 티스토리 임시저장이 계속 삭제돼서..써놨던 것들 계속 지워져서 늦.....었습니다...

저는 22년 47회차SQLD 자격증을 취득했습니다! 하지만 개인 공부 겸 & 공부하는 것을 공유할 겸 작성은 느리지만 계속 하겠습니다!

 

원본 링크

 

식별자란??

어떤 대상을 유일하게 식별 및 구별할 수 있는 이름을 뜻한다. - 위키백과

 

+ 왜 식별자가 필요할까??

위에서도 말했지만 부연 설명을 해보자.

더보기

시험을 치러 갔다고 가정하자.

우리는 OMR 카드에 이름,생년월일을 입력하고 답안을 제출한다.

시험을 봤는데, 나는 가채점에서 분명히 2개 틀렸는데 35개를 틀렸다고 발표가 났다.

이름이 '김개똥'이고, 00년 1월 1일에 태어난 사람이 한 명 더 있던 것이다... 그 사람은 내 덕분에 시험 통과했지만,

나는 시험을 떨어졌다...

위와 같이 정보들이 많을 때 구별을 위해 식별자를 사용한다.

 

Entity는 반드시 유일한 식별자가 존재해야 한다. 

 

식별자의 특징

주식별자(Primary Key : PK)인지, 외부 식별자(Foreign Key : FK) 등에 따라 다소 차이가 있다.

 

주 식별자일 경우 다음과 같은 특징이 있다.

  • 유일성 : Entity 내의 모든 인스턴스(한개의 row라고 생각)들을 유일하게 구분함.
  • 최소성 : 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함.
    • ex : 사원 번호 ( ex : b22051536) 으로도 유일성을 갖추었다고 할 수 있는데
      사원번호 (b22051536) + 생년월일로 식별자가 구성될 때 부적절한 구조.
  • 불변성 : 한번 Entity에 지정되면 그 값은 변하지 않아야 함.
  • 존재성 : 주식별자가 지정되면 반드시 데이터가 존재해야 함. ( Null 허용 X)

대체식별자(주 식별자로 선택되지 않은 후보 식별자)는 주식별자의 특징과 일치한다.

 

외부식별자(FK)는 주식별자의 특징과 일치하지 않고 참조무결성 제약조건에 따른 특징을 가지고 있다.

 

+ 참조무결성 제약조건이란? 

각 관계는 참조할 수 없는 FK 값을 가질 수 없다.

 

3.식별자 분류 및 표기법

추가적으로 설명할 부분이 없다고 생각해서 예시 패스!

 

ㄱ. 식별자 분류

위가 Yes, 아래가 NO

 

 

 

ㄴ. 식별자 표기법

 

4. 주식별자 도출 기준

개인적으로 쉽지만, 기본적으로 외우는게 중요하다라고 생각한다.

 

  • 자주 이용되는 속성을 주식별자로 정한다.
  • 명칭, 내역 등과 같이 이름으로 기술되는 것들은 지양한다.
    • ex : 회사의 부서이름이 유일하다고 해서 부서이름을 PK로 삼지 않아야한다.
    • 보통 일련번호, 코드를 많이 사용.
  • 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
    • 성능저하가 일어날 수 있음.
    • 주식별자의 갯수가 많다면 새로운 인조식별자를 사용해 데이터 모델과 조건절을 단순하게 할 수 있음.

 

5. 식별자 관계와 비식별자 관계에 따른 식별자

ㄱ. 식별자 관계와 비식별자 관계 결정

테이블 A라는 Entity에 주식별자(PK)가 정의되고, 

A Entity와 관계가 있는 B Entity와 연결하면 부모쪽의 주식별자를 자식쪽으로 내려보내게 된다.

이 때 자식쪽에서 부모로부터 받은 외부 식별자를 자신의 주식별자로 이용할 것인지, 부모와 연결이 되는 속성으로만 이용할 것인지 결정해야 한다.

 

이해가 안 된다면 아래 식별자 / 비식별자 관계에서 더 설명 됨.

식별자 / 비식별자 관계 조정

 

ㄴ. 식별자 관계

부모로부터 받은 식별자를 자식이 주식별자로 사용할 때에는 Null 값이 오면 안된다.

부모가 물려줄 때 물려주는 속성만을 주식별자로 사용한다면 부모, 자식은 1:1 관계가 된다.

부모가 물려주는 속성을 자식 본인의 속성과 주식별자로 사용한다면 1:N 관계가 된다.

 

1:1 관계 

자식이 부모로부터 받은 속성을 모두 주식별자로 사용한다면 부모와 자식은 1:1 관계가 되어야 한다.

더보기

+ 당연하다.

식별자의 가장 큰 특징은 구분할 수 있어야되기 때문에, 

부모로부터 이름 : A , 생년월일 :B 라는 값를 받아서 자식이 주식별자로 A,B를 쓴다면  이름과 생년월일은 중복되는 순간

구분 지을 수 없기 때문에 1:1 관계가 되어야 한다.

 

1: N 관계

부모로부터 받은 속성을 포함해 다른 부모에게서 받은 속성을 가지고 있거나, 자신이 가지고 있는 속성까지 주식별자로 쓸 때에는 1: M 관계가 된다.

 

ex : 부서 Entity와 사원 Entity가 있다고 가정.

사원은 사원번호와 부서번호와를 주식별자로 사용한다면

부서번호가 같아도 사원번호가 겹치는 일은 없기 때문에 부서와 사원은 1:M 관계가 될 수 있다.

 

ㄷ. 비식별자 관계

부모로부터 속성을 물려받았지만 주식별자로 사용하지 않고 속성으로만 사용하는 경우를 비식별자 관계라고 한다.

  • 자식엔터티에서 받은 속성이 필수가 아니어도 무방해서 부모없는 자식이 생성될 수 있는 경우.
  • 엔터티 별 생명주기를 다르게 관리했을 때.
    • 예를 들어 부모가 자식보다 먼저 소멸될 수 있을 때
    • + 실 사용 예로는 : 우리가 네이버 카페를 사용할 때 '탈퇴되어도 게시물은 삭제되지 않습니다' 라는 메세지를 본 적이 있을텐데. 이와같은 예다.
  • 자식엔터티에 주식별자로 사용해도 되지만, 자식엔터티에서 별도로 관리하는게 낫다고 판단될 때

 

ㄹ. 식별자 관계로만 설정했을 때의 문제점

식별자 관계로만 테이블을 꾸린다면 일정 규모까지는 괜찮지만 규모가 커진다면 복잡성이 증가한다.

+ 예를 들어보자. A, B, C, D, E, F 테이블이 있고 왼쪽부터 오른쪽으로 상속되는 구조가 있다.

( A가 원부모, B는 A의 자식, C는 B의 자식...)

맨 마지막 F는 PK 속성의 수가 5대 부모( E,D,C,B,A) 의 속성을 모두 가지고 있다.

이렇게 데이터 모델의 흐름이 깊어질 수록 PK 속성수가 증가할 수 밖에 없기 때문에 

개발자에게 복잡성을 주고 오류 가능성을 유발시킬 수 있는 요인이 된다.

 

ㅁ. 비식별자 관계로만 설정했을 때의 문제점

식별자로만 설정했을 때와는 반대로 부모 유형이 자식엔터티에게 제대로 상속이 되지 않아서 자식 엔터티에서 데이터를 처리할 때 부모 엔터티까지 찾아가야 하는 경우가 발생한다.

다시 말하면 불필요한 Join이 많이 발생해 SQL 구문도 길어지고, 성능이 저하하는 현상이 발생한다.

 

ㅂ. 식별자관계와 비식별자관계 모델링

1. 비식별자관계 선택 프로세스

비식별자와 식별자를 골르는 것은 높은 수준의 기술을 필요로 한다.

위의 흐름을 따라 비식별자관계를 선정하면 합리적으로 관계를 설정할 수 있다.

가장 중요한 것은 자식엔터티의 독립된 주식별자 구성이 필요한자 여부를 분석하는 것이다.

독립된 주식별자 구성한다는 뜻은 업무적 필요성성능상 필요여부모두 포함하는 의미로 이해하면 된다.

 

2. 식별자와 비식별자관계 비교

 

3. 식별자와 비식별자를 적용한 예시

다음 예시는 위의 비식별자관계 프로세스에서 말한 내용을 적용한 예시이다.

'자격증 > SQLD' 카테고리의 다른 글

SQLD 요약 - DDL  (0) 2023.01.15
SQLD 요약 - 관계형 데이터베이스 개요  (0) 2023.01.14
SQLD 요약 정리 - 관계  (2) 2022.11.14
SQLD 요약 정리 - 속성  (0) 2022.11.03
SQLD 요약정리 - 엔티티  (0) 2022.11.03