본문으로 건너뛰기

속성

SQLD 목차데이터 모델링의 이해레슨 4 / 35

목차

속성(attribute)은 엔터티를 설명하는, 더 나눌 수 없는 최소 데이터 단위입니다. 속성은 특성에 따라 기본·설계·파생으로, 엔터티 구성 방식에 따라 PK·FK·일반으로 나누고, 가질 수 있는 값의 범위를 도메인이라 합니다.

엔터티를 정했으면 그 엔터티에 무엇을 적을지 정해야 합니다. 사원이라면 사번·이름·월급·부서·관리자가 속성이 됩니다. 속성을 너무 크게 잡으면 한 칸에 여러 값이 섞이고, 계산할 수 있는 값을 따로 적으면 서로 어긋날 수 있습니다. 아래 그림은 사원 엔터티의 속성을 나누고, 도메인이 값을 막는 모습입니다.

6단계 중 1단계. 속성은 업무에 필요한, 의미상 더 나눌 수 없는 최소 데이터 단위입니다. 김민준은 관리자가 없어 MGR이 비어 있습니다(NULL).

1속성과 속성값

김민준 행의 SAL 칸에 든 520처럼, 인스턴스 하나의 속성 하나에 든 값을 속성값이라 합니다. 속성값은 한 칸에 하나뿐이고, 엔터티 하나는 인스턴스와 속성을 각각 둘 이상 가집니다. 속성 이름은 업무에서 쓰는 이름으로, 서술형과 약어를 피해, 모델 안에서 하나뿐이게 짓습니다.

김민준의 MGR은 NULL입니다. 김민준은 관리자가 없는 사원이라 MGR이 비어 있을 뿐, 잘못 들어간 값이 아닙니다. 비어도 되는지는 속성마다 다르고, 아래 도메인에서 정합니다.

2값이 여럿인 속성

김민준의 자격증이 SQLD와 정보처리기사 둘이면, 자격증 칸 하나에 두 값을 함께 적을 수 없습니다. 이런 속성은 사원자격처럼 따로 엔터티로 떼어 내고 사원과 관계로 잇습니다. 사원자격에 PK 표시가 둘인 것은 사번만으로도, 자격명만으로도 한 줄이 가려지지 않아서입니다(→ 식별자 레슨). 사번은 사원에서 받아 온 속성이라 FK도 붙습니다. 속성마다 값을 하나만 두는 이 꼴을 1정규형이라 합니다(→ 정규화 레슨).

값의 수와 쪼갤 수 있는지로도 속성을 나눕니다. 값이 하나면 단일값 속성(Single-valued Attribute), 자격증처럼 여럿이면 다중값 속성(Multi-valued Attribute)입니다. 주소는 업무에서 한 덩어리로 쓰지만 필요하면 시·구·동으로 나눌 수 있어 복합 속성(Composite Attribute)이라 합니다. 더 나눌 수 없으면 단순 속성(Simple Attribute)입니다.

3속성의 분류

속성도 두 기준으로 따로 나눕니다.

  • 특성: 업무에서 그대로 나온 값이면 기본 속성(Basic Attribute), 모델링을 위해 새로 만들거나 바꾼 값이면 설계 속성(Designed Attribute), 다른 속성으로 계산한 값이면 파생 속성(Derived Attribute)입니다.
  • 구성 방식: 인스턴스를 구분하면 PK 속성, 다른 엔터티나 자기 자신과의 관계에서 받아 오면 FK 속성, 그 밖은 일반 속성입니다.
속성특성구성 방식
EMPNO기본PK
ENAME · SAL기본일반
DEPTNO기본FK — 부서에서
MGR기본FK — 사원 자신에서
고용형태코드설계일반
연봉파생일반

EMPNO는 회사가 업무에서 쓰는 번호라 기본 속성입니다. DEPTNO·MGR도 업무에서 쓰는 부서 번호와 관리자 사번을 그대로 받아 온 값이라 기본입니다. 업무에 없던 번호를 시스템이 행 구분용으로 매겨야 그 일련번호가 설계 속성입니다.

4도메인

SAL에 들어올 값을 '숫자, 비울 수 없음, 0 이상'으로 정했다면, 이 범위가 SAL의 도메인(domain)입니다. 도메인은 데이터 타입·크기·제약 조건으로 정합니다. 여기서는 숫자인지를 데이터 타입이, 나머지 둘을 제약 조건이 지킵니다.

값들어가나막는 것
450들어감—
'abc'막힘데이터 타입(숫자)
NULL막힘제약 조건(비울 수 없음)
-100막힘제약 조건(0 이상)

MGR처럼 비어도 되게 정한 속성이라면 NULL도 들어갑니다.

예제

파생 속성인 연봉(YEAR_SAL)은 저장하지 않고 쿼리에서 SAL로 계산할 수 있습니다.

SELECT EMPNO,
  ENAME,
  SAL,
  SAL * 12 AS YEAR_SAL
FROM EMP
ORDER BY EMPNO;
EMPNOENAMESALYEAR_SAL
1001김민준5206240
1002이서연3804560
1003박지호4104920
1004최유나4505400
1005정하늘3003600
1006강도윤4705640

연봉을 따로 저장하면 월급을 고칠 때 연봉도 함께 고쳐야 합니다. 하나만 고치면 두 값이 어긋나므로 파생 속성은 되도록 적게 둡니다.

SAL에 '0 이상'이라는 제약을 걸고 네 값을 넣어 보면, 도메인 표대로 450만 들어가고 나머지 셋은 오류로 막힙니다.

SQL로 확인하기

이 과목의 예제 데이터에는 SAL이 0 이상이라는 제약이 없어서, 먼저 CHECK 제약(값이 조건을 지키는지 보는 규칙)을 더합니다.

ALTER TABLE EMP
  ADD CHECK (SAL >= 0);
INSERT INTO EMP
  (EMPNO, ENAME, SAL)
VALUES (1007, '한별',
    -100);
INSERT INTO EMP
  (EMPNO, ENAME, SAL)
VALUES (1008, '한별',
    'abc');
INSERT INTO EMP
  (EMPNO, ENAME, SAL)
VALUES (1009, '한별',
    NULL);
INSERT INTO EMP
  (EMPNO, ENAME, SAL)
VALUES (1010, '한별',
    450);
  • -100은 ORA-02290(check constraint violated) 오류로 막힙니다. 0 이상이라는 제약에 걸립니다.
  • 'abc'는 ORA-01722 오류로 막힙니다. 숫자 열에 숫자로 바꿀 수 없는 문자를 넣었기 때문입니다.
  • NULL은 ORA-01400(cannot insert NULL) 오류로 막힙니다. SAL은 NOT NULL입니다.
  • 450만 들어갑니다.

제약 조건을 거는 DDL 문장은 DDL 레슨에서 다룹니다.

시험 포인트

  • '번호면 설계 속성'으로 고르면 틀립니다. 사번은 기본 속성입니다.
  • 파생 속성은 원래 값과 어긋날 수 있어 되도록 적게 둡니다.
  • 값이 여럿인 속성은 한 칸에 이어 적지 않고 별도 엔터티로 떼어 냅니다.
  • 자료에 따라 단일값·다중값과 단순·복합을 '분해 여부' 하나로 묶거나, '값의 수'와 '세부 의미'로 나눠 부릅니다. 기준 이름이 달라도 짝은 같습니다.
  • NULL은 잘못된 값이 아니라 비어 있다는 표시입니다. 들어갈 수 있는지는 그 속성의 도메인이 정합니다.

확인 문제

1. 회원 엔터티의 세 속성을 특성에 따라 기본·설계·파생으로 나눠 보세요.

(가) 가입일 — 회원이 가입한 날을 그대로 적습니다.

(나) 등급코드 — 업무의 '일반·우수·최우수'를 모델에서 1·2·3으로 바꿨습니다.

(다) 누적 구매액 — 그 회원의 주문 금액을 모두 더해 얻습니다.

정답

(가) 기본 · (나) 설계 · (다) 파생입니다. 가입일은 업무 값 그대로, 등급코드는 모델을 위해 바꾼 값, 누적 구매액은 더해서 구한 값입니다.

2. 부서 엔터티의 DEPTNO(부서 번호)·DNAME(부서명)·LOC(위치)를 구성 방식에 따라 나누고, 부서에 FK 속성이 없는 까닭을 말해 보세요.

정답

DEPTNO는 PK 속성, DNAME과 LOC는 일반 속성입니다. 부서는 다른 엔터티에서 받아 온 속성이 없습니다. 부서와 사원의 관계는 사원 쪽 DEPTNO가 FK로 맡습니다.

3. SAL의 도메인에서 '비울 수 없음'을 빼고 '숫자, 0 이상'만 남겼습니다. 450 · 'abc' · NULL · -100 가운데 들어가는 값을 모두 고르세요.

정답

450과 NULL입니다. 비워도 되는 속성이 되었으니 NULL이 들어옵니다. '0 이상'은 값이 있을 때만 따지는 조건이라 빈 값은 걸리지 않습니다. 'abc'는 숫자가 아니고 -100은 0보다 작아서 그대로 막힙니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

SQLD 목차로