모던지 / SQL 개발자 / 데이터 모델링 4강. 관계와 식별자

데이터 모델링 4강. 관계와 식별자

식별자를 무엇으로 잡느냐에 따라 같은 업무가 조인 두 번짜리 모델이 되기도 하고 다섯 번짜리 모델이 되기도 합니다.

풀고 시작

문제 1. 부모 엔터티의 식별자가 자식 엔터티의 주식별자 일부로 상속되고, 자식이 부모 없이는 존재할 수 없는 관계를 무엇이라 부를까요?
부모의 키가 자식의 주식별자 안으로 들어가면 식별 관계이고, 자식은 부모 없이 존재할 수 없습니다. 비식별 관계는 부모의 키가 자식의 일반 속성으로만 내려와 자식이 독립적으로 존재할 수 있습니다.

관계는 선 하나가 아니라 두 방향의 이야기입니다

관계(relationship)는 엔터티 인스턴스 사이의 연관입니다. 여기서 놓치기 쉬운 것은 관계가 양방향이라는 사실입니다. 사원과 부서 사이의 관계는 "사원은 부서에 소속된다"이면서 동시에 "부서는 사원을 보유한다"입니다. 모델을 검증할 때 한 방향만 읽고 넘어가면 잘못된 차수를 그대로 지나치게 됩니다.

관계를 읽을 때는 세 가지를 함께 봅니다. 먼저 관계명입니다. 위 문장의 "소속된다", "보유한다"가 그것이죠. 다음은 차수(cardinality)로, 한쪽 인스턴스 하나가 반대쪽 인스턴스 몇 개와 이어지는지를 말합니다. 일대일, 일대다, 다대다로 갈립니다. 마지막이 선택성(optionality)입니다. 반드시 참여해야 하는 필수 관계인지, 참여하지 않아도 되는 선택 관계인지를 가리키죠.

다대다 관계는 물리 모델에서 그대로 구현되지 않습니다. 두 엔터티 사이에 관계를 담는 새 엔터티를 놓아 일대다 두 개로 풀어야 합니다. 학생과 과목 사이에 수강이라는 집합이 생기는 것이 그 예입니다. 그리고 이렇게 생긴 집합은 2강에서 본 행위 엔터티인 경우가 많습니다.

관계는 페어링(pairing)이라는 말로도 설명합니다. 인스턴스 하나하나가 짝을 이루는 것을 페어링이라 하고, 그 페어링의 집합이 관계라는 뜻입니다. 엔터티가 집합이면 관계도 집합이라는 이야기죠.

식별 관계와 비식별 관계

부모 엔터티의 식별자는 관계를 통해 자식 엔터티로 내려옵니다. 이때 그 키가 자식의 주식별자 안으로 들어가면 식별 관계, 일반 속성으로만 내려오면 비식별 관계입니다.

구분 식별 관계 비식별 관계
부모 키의 위치 자식의 주식별자 일부 자식의 일반 속성
자식의 존재 부모 없이는 존재할 수 없음 부모 없이도 존재 가능
표기 실선 점선
결과 키가 계속 상속되어 길어짐 키가 짧게 유지됨

무엇을 고를지는 취향이 아니라 결과의 문제입니다. 식별 관계를 계속 쓰면 손자, 증손자로 내려갈수록 주식별자에 조상들의 키가 줄줄이 붙습니다. 조인은 편해지지만 키가 길어지고 인덱스가 무거워지죠. 반대로 비식별 관계만 쓰면 키는 짧지만 조회할 때 조인을 여러 번 타야 합니다. 그래서 실무에서는 자식이 부모에 완전히 종속되고 부모 키로 자주 조회되면 식별 관계, 그렇지 않으면 비식별 관계로 갑니다.

식별자의 종류를 가르는 네 가지 축

식별자(identifier)는 엔터티의 인스턴스를 유일하게 구별하는 속성 또는 속성의 조합입니다. 분류 축이 넷이라 헷갈리기 쉬운데, 축마다 묻는 질문이 다릅니다.

대표성으로: 대표로 삼은 것이 주식별자, 대표는 아니지만 유일성을 갖는 것이 보조식별자입니다. 스스로 만들었는가로: 자기 엔터티 안에서 만들어졌으면 내부식별자, 관계를 통해 상속받았으면 외부식별자입니다. 속성 수로: 하나면 단일식별자, 둘 이상이면 복합식별자입니다. 대체 여부로: 업무에서 쓰는 값을 그대로 쓰면 본질식별자, 관리를 위해 새로 만든 값이면 인조식별자입니다.

주식별자가 되려면 조건이 있습니다. 인스턴스를 유일하게 구별해야 하고, 이름처럼 여러 건이 겹칠 수 있는 속성은 안 됩니다. 최소의 속성 수여야 하고, 필요 없는 속성까지 묶어 키를 만들면 안 됩니다. 값이 자주 바뀌지 않아야 하며, 값이 바뀌면 그 키를 참조하는 모든 자식이 흔들립니다. 그리고 반드시 값이 존재해야 합니다. 즉 NULL이 올 수 없습니다.

본질식별자와 인조식별자, 실무에서 가장 자주 싸우는 자리

본질식별자는 업무에 원래 존재하는 값입니다. 사업자등록번호나 주문번호처럼 현업이 이미 쓰고 있는 식별 수단이죠. 인조식별자는 그런 값이 마땅치 않거나 너무 길 때, 관리를 위해 새로 만들어 붙인 일련번호입니다.

인조식별자는 편합니다. 짧고, 안 바뀌고, 어떤 업무에도 붙일 수 있습니다. 그래서 남용되기 쉽습니다. 문제는 인조식별자를 붙이는 순간 원래 있던 유일성 규칙이 모델에서 사라진다는 점입니다. 수강 엔터티에 학번과 과목코드 대신 수강일련번호를 주식별자로 두면, 같은 학생이 같은 과목을 두 번 등록해도 데이터베이스는 아무 불평을 하지 않습니다. 그래서 인조식별자를 쓸 때는 원래의 본질식별자에 유일 제약을 따로 걸어 두어야 합니다. 이 한 줄을 빼먹은 대가는 대체로 몇 달 뒤 중복 데이터로 돌아옵니다.

반대로 본질식별자를 고집하면 키가 길어지고, 업무 규칙이 바뀌어 값이 변할 때 참조하는 곳이 전부 흔들립니다. 정답이 하나로 정해져 있지 않고, 무엇을 잃을지 알고 고르는 것이 설계입니다.

다음 강에서는 이 식별자와 속성이 어떻게 배치되어야 중복이 사라지는지, 정규화를 봅니다.

인출 문제

문제 1. 주식별자의 조건으로 옳지 않은 것은?
조회가 잦다는 이유로 속성을 키에 넣으면 최소성이 깨지고 값이 바뀔 위험도 커집니다. 주식별자의 조건은 유일성, 최소성, 불변성, 존재성입니다.
문제 2. 다대다 관계를 물리 모델로 옮길 때 취하는 방법으로 가장 적절한 것은?
다대다는 그대로 구현되지 않으므로 교차 엔터티를 놓아 일대다 관계 두 개로 풉니다. 이렇게 생긴 엔터티는 대개 행위 엔터티이고 자기 속성을 갖게 되는 경우도 많습니다.
문제 3. 식별 관계와 비식별 관계에 대한 설명으로 옳은 것은?
식별 관계는 부모 키가 자식의 주식별자 안으로 들어가므로 세대를 내려갈수록 키가 길어집니다. 부모 없이 존재할 수 없는 쪽은 식별 관계이고, 조인 횟수를 줄이는 데 유리한 쪽도 식별 관계입니다.
문제 4. 수강 엔터티의 주식별자를 학번과 과목코드의 조합에서 수강일련번호로 바꾸었습니다. 이때 반드시 함께 해야 할 조치는?
인조식별자를 도입하면 원래 있던 유일성 규칙이 모델에서 사라져 같은 학생이 같은 과목을 여러 번 등록해도 막히지 않습니다. 본질식별자에 해당하는 조합에 유일 제약을 따로 걸어 두어야 규칙이 살아남습니다.

생각해볼 질문 (정답 없음)

거의 모든 테이블에 일련번호 하나를 주식별자로 붙이는 설계 방식이 널리 쓰입니다. 이 방식이 편한 이유는 분명한데, 이렇게 지은 모델을 몇 년 뒤에 읽는 사람은 무엇을 잃게 될까요.

더 풀기

출제기준의 세세항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. 데이터 모델에서 관계를 가장 잘 설명한 것은?
관계는 업무에 있는 연관성을 모델에 옮긴 것입니다. 외래키와 조인은 그 관계를 물리와 질의로 구현한 결과입니다.
문제 2. 관계를 읽을 때 두 방향으로 읽어야 하는 이유로 가장 알맞은 것은?
사원은 부서에 반드시 하나 속하지만 부서에는 사원이 없을 수도 있습니다. 이렇게 방향마다 규칙이 다르므로 양쪽을 모두 읽어야 규칙이 다 드러납니다.
문제 3. 관계 차수가 뜻하는 것으로 가장 알맞은 것은?
차수는 일대일과 일대다와 다대다로 나뉩니다. 반드시 존재해야 하는가는 선택성이 다루는 항목입니다.
문제 4. 관계의 선택성이 뜻하는 것으로 가장 알맞은 것은?
선택성은 필수와 선택을 가릅니다. 사원에게 부서가 반드시 있어야 한다면 필수, 없을 수도 있다면 선택입니다.
문제 5. 다대다 관계를 논리 모델에서 그대로 두면 물리 구현에서 생기는 문제로 가장 알맞은 것은?
한쪽에 여러 값을 담을 수 없으므로 다대다는 중간에 관계 엔터티를 두어 두 개의 일대다로 풀어야 합니다.
문제 6. 다대다 관계를 해소해 만든 관계 엔터티의 식별자로 가장 흔히 쓰이는 것은?
두 부모의 식별자 조합이 그 관계 한 건을 특정합니다. 같은 조합이 여러 번 생길 수 있다면 시점이나 순번이 더 붙습니다.
문제 7. 식별 관계를 가장 잘 설명한 것은?
식별 관계에서는 부모 없이 자식을 구분할 수 없습니다. 부모의 키가 자식의 일반 속성으로만 들어가면 비식별 관계입니다.
문제 8. 비식별 관계를 선택하는 이유로 가장 알맞은 것은?
식별 관계를 계속 이으면 손자와 증손자의 키가 끝없이 길어집니다. 독립성이 필요하거나 키가 지나치게 길어질 때 비식별을 택합니다.
문제 9. 식별 관계를 지나치게 이어 갈 때 나타나는 문제로 가장 알맞은 것은?
식별 관계는 부모 키를 계속 물려주므로 세대가 깊어질수록 키가 커집니다. 그만큼 인덱스도 커지고 조인 조건도 길어집니다.
문제 10. 비식별 관계를 남용할 때 생기는 문제로 가장 알맞은 것은?
실제로는 부모 없이 존재할 수 없는데 비식별로 두면 그 규칙이 구조가 아니라 프로그램에만 남습니다. 그러면 규칙이 지켜지지 않는 데이터가 들어옵니다.

묶음 2

문제 1. 식별자를 가장 잘 설명한 것은?
식별자의 유일한 임무는 한 건을 특정하는 것입니다. 참조하는 것은 외래키, 값의 범위를 정하는 것은 도메인입니다.
문제 2. 식별자를 대표성으로 나눌 때 주식별자를 가장 잘 설명한 것은?
대표성 기준은 주식별자와 보조식별자로 나뉩니다. 물려받았는지는 스스로 생성 여부, 여러 속성인지는 속성 수 기준의 분류입니다.
문제 3. 보조식별자를 가장 잘 설명한 것은?
사원번호가 주식별자여도 주민등록번호나 사번 외 사원계정 같은 값이 유일성을 가질 수 있습니다. 유일성은 있으나 대표로 쓰지 않으면 보조식별자입니다.
문제 4. 스스로 생성 여부로 식별자를 나눌 때 외부식별자를 가장 잘 설명한 것은?
내부식별자는 그 엔터티 안에서 만들어지고 외부식별자는 관계를 타고 들어옵니다. 자동 생성 여부나 속성 수는 다른 축의 분류입니다.
문제 5. 속성 수로 식별자를 나눌 때 복합식별자를 가장 잘 설명한 것은?
하나로 부족해 여러 속성을 묶어야 한 건이 특정되면 복합식별자입니다. 참조 대상 수나 생성 방식과는 다른 기준입니다.
문제 6. 본질식별자를 가장 잘 설명한 것은?
주민등록번호나 사업자등록번호처럼 업무 세계에 이미 있는 구분값이 본질식별자입니다. 시스템이 만든 것은 인조식별자입니다.
문제 7. 인조식별자를 도입하는 가장 흔한 이유는?
본질식별자가 복합이거나 값이 변경될 수 있으면 참조하는 쪽이 모두 흔들립니다. 짧고 변하지 않는 인조키를 두면 그 위험이 줄어듭니다.
문제 8. 인조식별자를 남용할 때 생기는 문제로 가장 알맞은 것은?
일련번호만 키로 두면 같은 사람이 두 번 등록되어도 키가 달라 통과합니다. 인조키를 쓰더라도 본질에 해당하는 조합에는 유일 제약을 걸어야 합니다.
문제 9. 식별자로 삼기에 가장 부적절한 속성은?
키가 바뀌면 그 키를 참조하는 모든 데이터가 함께 흔들립니다. 유일성과 필수성만큼 불변성도 중요한 조건입니다.
문제 10. 식별자의 조건으로 보기 어려운 것은?
사람이 읽기 좋은지는 편의의 문제입니다. 식별자에 요구되는 것은 유일하게 구분하고 필요한 만큼만 쓰며 값이 변하지 않는 성질입니다.

묶음 3

문제 1. 부서와 사원이 일대다 관계이고 사원은 부서 없이 존재할 수 없다면 모델에 어떻게 표현되나요?
자식 쪽이 부모 없이 존재할 수 없으면 자식에서 본 관계가 필수입니다. 이때 식별 관계로 할지 비식별로 할지는 별개의 판단입니다.
문제 2. 관계에 이름을 붙일 때 가장 알맞은 방식은?
사원이 부서에 소속된다처럼 읽히는 이름이라야 관계가 문장으로 검증됩니다. 이름이 명사 나열이면 무엇을 뜻하는지 알 수 없습니다.
문제 3. 하나의 엔터티가 자기 자신과 관계를 맺는 경우로 가장 알맞은 예는?
같은 집합 안의 인스턴스끼리 연결되는 것을 재귀 관계라고 합니다. 조직 계층이나 부품 구성이 대표적인 예입니다.
문제 4. 재귀 관계를 가진 엔터티에서 최상위 인스턴스는 어떻게 표현되나요?
최상위는 부모가 없으므로 상위 식별자가 NULL이 됩니다. 자기 자신을 넣으면 계층 탐색이 무한히 돌게 됩니다.
문제 5. 일대일 관계로 설계된 두 엔터티를 하나로 합치는 것이 나은 경우로 가장 알맞은 것은?
늘 함께 다닌다면 나누어 둘 이유가 조인 비용뿐입니다. 반대로 한쪽만 값이 있거나 접근 권한이 다르면 나누어 두는 편이 낫습니다.
문제 6. 관계를 모델에 표현하지 않고 프로그램에서만 처리하기로 했을 때 생기는 위험으로 가장 알맞은 것은?
규칙이 구조에 없으면 프로그램 하나만 실수해도 깨진 데이터가 들어옵니다. 그리고 그 데이터는 나중에 정리하기가 매우 어렵습니다.
문제 7. 다음 중 관계 차수가 일대일이 되는 예로 가장 알맞은 것은?
사원 한 명에 상세 정보 한 건이 대응합니다. 나머지는 모두 한쪽에 여러 건이 붙는 일대다입니다.
문제 8. 주식별자를 정할 때 최소성을 지켜야 하는 이유로 가장 알맞은 것은?
키는 참조를 통해 자식으로 퍼집니다. 쓸모없는 속성 하나가 키에 들어가면 그 부담이 모델 전체로 번집니다.
문제 9. 자식 엔터티의 기본키에 부모의 기본키가 포함되어 있다면 그 관계는?
부모의 키가 자식의 키 일부가 되면 식별 관계입니다. 일반 속성으로만 들어가면 비식별 관계입니다.
문제 10. 관계형 모델에서 참조 무결성이 뜻하는 것으로 가장 알맞은 것은?
참조 무결성은 관계가 가리키는 대상이 실제로 있는지를 봅니다. 기본키의 중복 없음은 개체 무결성, 도메인 준수는 도메인 무결성입니다.

이전: 3강 속성과 도메인 · 다음: 5강 정규화와 반정규화

모던지 · 궁금하면 모던지 GitHub · 2026-09-10