요약

주소는 도로명, 도시, 우편번호로 쪼갤 수 있고, 전화번호는 한 사람이 여러 개 가질 수 있고, 나이는 생일만 알면 계산된다. 대상에 적는 항목은 이렇게 “더 쪼갤 수 있는가”, “값이 여럿일 수 있는가”, “저장하는가 계산하는가”의 세 물음으로 가른다. 어느 쪽인지에 따라 나중에 표로 옮기는 방법이 달라진다. 처음에 잘못 가르면 값 여러 개를 표의 한 칸에 욱여넣게 된다.

예시로 보기

개체에 적을 항목을 “이름, 주소, 전화번호, 나이”라고만 정하면 뒤에서 곤란해진다. “휴스턴에 사는 직원”을 찾고 싶은데 주소가 통짜 글 한 줄이면 도시만 꺼내기 어렵다. 전화번호가 둘인 직원은 어디에 적을지도 정해야 한다.

직원 \(e_1\)의 주소 “2311 Kirby, Houston, Texas 77001”은 이렇게 쪼개진다.

Address
├── Street_address
│   ├── Number            2311
│   ├── Street            Kirby
│   └── Apartment_number  (없음)
├── City                  Houston
├── State                 Texas
└── Zip                   77001

Address와 Street_address처럼 더 작은 속성으로 나뉘는 것이 복합 속성이다. 맨 끝의 여섯 개(Number, Street, Apartment_number, City, State, Zip)는 더 못 쪼갠다. 단순 속성이다.

차 세 대의 색을 보면 값의 개수가 다르다.

차 Color
CAR₁ {red, black}
CAR₂ {blue}
CAR₃ {white, blue}

Color는 한 개체에 값이 여러 개 붙을 수 있다. 다치 속성이다.

검증: Address 계층의 단순 속성 6개, CAR 표기의 복합 1개·다치 1개·단순 7개, Works_on이 복합이면서 다치인 것, Color 값의 수 2·1·2, 생일에서 나이 계산, 부서별 직원 수 — 20_er-attribute-types_verify.py

세 가지 물음

속성은 세 가지 물음으로 가른다.

물음 한쪽 다른 쪽
더 쪼갤 수 있는가 복합 속성(composite): 더 작은 부분으로 나뉜다. 나뉜 부분이 또 나뉘어 계층을 이룰 수 있다. 예: Address 단순 속성(simple): 더 못 나눈다. 원자 속성(atomic)이라고도 한다. 예: City, State, Zip
값이 여럿일 수 있는가 다치 속성(multivalued): 한 개체에 값이 여러 개(값들의 집합)다. 예: 전화번호, 학위 단일값 속성(single-valued): 한 개체에 값이 하나다. 대부분의 속성이 이쪽이다. 예: 나이, 성별, 이름
저장하는가 저장 속성(stored): 데이터베이스에 실제로 저장한다. 예: 생일 유도 속성(derived): 저장하지 않고 다른 것에서 계산한다. 예: 나이(생일에서 계산)

세 물음은 서로 따로다. 속성 하나가 세 물음에 각각 답을 갖는다. 직원이 맡은 프로젝트와 주당 시간을 적는 Works_on(Project, Hours)는 성분이 둘이라 복합이고, 프로젝트를 여럿 맡을 수 있어 다치다.

글로 적는 법. 복합 속성은 이름 뒤 괄호에 성분을 쓰고, 다치 속성은 중괄호로 감싼다.

CAR: Registration(Number, State), Vehicle_id, Make, Model, Year, {Color}

Registration은 성분이 둘인 복합 속성, Color는 다치 속성, 나머지 넷은 단순 단일값 속성이다.

그림 기호. 속성은 타원으로 그린다. 다치 속성은 겹타원, 유도 속성은 점선 타원이고, 복합 속성은 성분 타원들을 그 타원에 선으로 붙인다.

활용

  • 복합 속성은 언제 쓸모 있나: 어떤 때는 주소 전체를 한 덩어리로 쓰고, 어떤 때는 도시만 따로 쓸 때다. 늘 통째로만 쓴다면 쪼갤 필요가 없다1.
  • 유도 속성을 저장하지 않는 까닭: 나이는 가만히 있어도 해마다 바뀐다. 생일이 1965-01-09인 사람은 2024-10-04에는 59세이고 2025-01-09에는 60세다. 저장해 두면 그날부터 틀린 값이 된다.
  • COMPANY의 유도 속성: DEPARTMENT의 Number_of_employees는 점선 타원이다. 그 부서에 소속된 직원을 세면 나온다. COMPANY의 데이터에서 세면 5번 부서 4명, 4번 부서 3명, 1번 부서 1명이다.
  • 표로 옮길 때 갈린다. 복합 속성은 단순 성분만 열로 넣는다. 다치 속성은 한 칸에 값 하나만 들어가는 표에 그대로 못 넣어 표를 따로 만든다: 개체 타입의 사상, 다치 속성의 사상

연결

확인 문제

C1 다음 속성을 세 물음(복합/단순, 다치/단일값, 저장/유도)으로 가르라. (a) 직원의 Address (b) 사람의 전화번호들 (c) 직원의 나이 (d) 직원의 Works_on(Project, Hours)

답: (a) 복합, 단일값, 저장 (b) 단순, 다치, 저장 (c) 단순, 단일값, 유도 (d) 복합, 다치, 저장.
이유: 세 물음은 서로 따로라서 속성마다 답이 셋이다. (d)를 “복합이니까 다치는 아니다”라고 답하면 틀린다. 프로젝트를 여럿 맡으면 (Project, Hours) 짝이 여러 개가 된다.

C2 생일을 저장하면서 나이까지 저장 속성으로 두면 무엇이 곤란한가?

답: 나이는 아무도 고치지 않아도 생일이 지날 때마다 바뀌어야 한다. 저장해 둔 값은 다음 생일부터 틀린다. 생일만 저장하고 나이는 필요할 때 계산하면 늘 맞는다.
이유: 같은 사실을 두 군데에 적으면 한쪽만 바뀌었을 때 서로 어긋난다. 유도 속성은 “한쪽에서 계산되는 값”이라 어긋날 일이 없다.

C3 Address(Street_address(Number, Street, Apartment_number), City, State, Zip)를 계층 그림으로 그리면 맨 끝 칸(단순 속성)은 몇 개인가? 복합 속성은 무엇인가?

답: 단순 속성은 Number, Street, Apartment_number, City, State, Zip의 6개다. 복합 속성은 Address와 Street_address 둘이다.
이유: 괄호가 붙은 이름이 복합 속성이다. 흔한 오답은 Street_address를 단순 속성으로 세어 7개라고 하거나, 맨 위 Address만 복합이라고 하는 것이다.

  1. 답은 Elmasri & Navathe, Fundamentals of Database Systems 7판, 3장의 설명이다. ↩