데이터베이스 속성의 종류: 단순·복합·단일값·다중값·저장·유도
ERD(엔티티-관계 다이어그램)에서 속성(Attribute)은 엔티티(Entity)의 성질을 나타내며, 표현 방식과 데이터 성격에 따라 여러 유형으로 구분됩니다. 아래에서 각각의 개념을 직관적으로 정리합니다.
개념 한눈에 보기
올바른 속성 구분은 정규화, 모델링 품질, 쿼리 단순화에 직접적인 영향을 줍니다.
❶ 단순 속성 (Simple Attribute)
더 이상 논리적으로 나눌 수 없는 기본 속성입니다.
- 예: 이름(name), 학번(student_id), 생년월일(birth_date)
Student
├─ name
└─ age
❷ 복합 속성 (Composite Attribute)
여러 하위 속성(Sub-attribute)으로 구성되는 속성입니다. ERD에서는 큰 타원 안에 작은 타원으로 표현합니다.
- 예: 주소(address) = (도시, 도로명, 우편번호), 이름(name) = (성, 이름)
Address
├─ city
├─ street
└─ zip
❸ 단일값 속성 (Single-valued Attribute)
엔티티 한 인스턴스가 오직 하나의 값만 갖는 속성입니다.
- 예: 학번, 주민등록번호, 생년월일
❹ 다중값 속성 (Multi-valued Attribute)
엔티티 한 인스턴스가 여러 값을 가질 수 있는 속성입니다. ERD에서는 이중 타원(double oval)로 표현합니다.
- 예: 전화번호(phone_numbers), 자격증(certifications)
RDB 설계 팁: 다중값 속성은 보통 별도 테이블로 분리(정규화)합니다.
Student (student_id, name, ...)
Phone (student_id, phone_number) -- (student_id, phone_number)로 PK 구성 가능
❺ 저장 속성 (Stored Attribute)
DB에 실제로 저장되는 원시값입니다.
- 예: 급여(salary), 입사일(join_date), 기본급(base_salary)
❻ 유도 속성 (Derived Attribute)
다른 속성으로부터 계산(유도)될 수 있는 속성입니다. ERD에서는 점선 타원(dashed oval)으로 표현하며, 일관성을 위해 보통 저장하지 않습니다.
- 예: 나이(age) = 오늘(today) − 생년월일(birth_date)
- 예: 총급여(total_salary) = 기본급(base_salary) + 수당(allowance)
-- 유도 속성은 쿼리나 애플리케이션 로직에서 계산
SELECT
e.employee_id,
e.base_salary + IFNULL(a.allowance, 0) AS total_salary
FROM employees e
LEFT JOIN allowances a ON a.employee_id = e.employee_id;
종합 표
| 구분 | 설명 | 예시 | ERD 표기 | 설계 포인트 |
|---|---|---|---|---|
| 단순 속성 | 더 이상 분해 불가 | 이름, 학번 | 단일 타원 | 직접 저장 |
| 복합 속성 | 하위 속성 집합 | 주소(도시/도로명/우편번호) | 큰 타원 + 내부 작은 타원 | 정규화 시 하위 컬럼으로 분리 |
| 단일값 속성 | 한 인스턴스에 하나의 값 | 주민등록번호, 학번 | 단일 타원 | 유니크 제약 고려 |
| 다중값 속성 | 여러 값을 가질 수 있음 | 전화번호, 자격증 | 이중 타원 | 별도 테이블로 분리 |
| 저장 속성 | DB에 저장되는 원시값 | 급여, 입사일 | 실선 타원 | 정합성 검증(타입/도메인) |
| 유도 속성 | 다른 값으로부터 계산 | 나이, 총급여 | 점선 타원 | 가능하면 저장하지 않기 |
설계 체크리스트
- 다중값은 별도 테이블로 분리했는가?
- 유도값을 중복 저장하지 않도록 했는가?
- 복합 속성은 검색/인덱싱 편의를 위해 적절히 분해했는가?
- 단일값 속성은 유니크/NOT NULL 같은 제약을 검토했는가?
