본문으로 건너뛰기

관계 데이터 모델: 릴레이션

정보처리기사 목차데이터베이스와 관계 모델레슨 76 / 233

목차

릴레이션(relation)은 관계 데이터 모델이 데이터를 담는 표 하나입니다. 세로 칸을 속성, 가로 줄을 튜플이라 하고, 속성의 수를 차수, 튜플의 수를 카디널리티라고 합니다.

앞 레슨 개체-관계(E-R) 모델에서 E-R 다이어그램을 표 셋으로 바꿨습니다. 이렇게 데이터를 표로 담는 데이터 모델이 관계 데이터 모델(relational data model)입니다. 1970년 코드(E. F. Codd)가 제안했고, 오늘 쓰는 데이터베이스는 대부분 이 모델을 따릅니다. 시험은 '표'라는 말 대신 릴레이션·튜플·속성으로 묻고, 표를 주고 차수와 카디널리티를 세게 합니다. 또 아무 표나 릴레이션이라고 하지는 않습니다. 릴레이션이 지켜야 하는 성질이 따로 있습니다. 그래서 표의 어디를 무엇이라 부르는지, 어떤 표를 릴레이션이라 할 수 있는지를 먼저 익힙니다. 아래 그림은 학생 표 하나에 이름을 하나씩 붙여 갑니다.

8단계 중 1단계. 관계 데이터 모델은 데이터를 표 하나하나에 담고, 그 표를 릴레이션이라고 부릅니다.

1릴레이션과 릴레이션 스키마·인스턴스

관계 데이터 모델은 데이터를 표 하나하나에 담고, 그 표를 릴레이션이라고 부릅니다. 자료에 따라 테이블(table)이라고도 부릅니다. 그림의 학생 표가 릴레이션 하나입니다.

릴레이션에는 틀과 값이 있습니다. 릴레이션의 이름과 속성으로 짜인 틀을 릴레이션 스키마(relation schema)라 하고, 학생(학번, 이름, 학년, 학과코드)처럼 적습니다. 그 틀에 지금 담긴 튜플 전체는 릴레이션 인스턴스(relation instance)입니다. 학생이 들어오고 나가면 인스턴스는 바뀌지만 스키마는 그대로입니다.

2표의 어디를 무엇이라 부르나 — 속성·튜플·도메인·차수·카디널리티

그림이 짚는 릴레이션의 세로 칸 하나하나를 속성(attribute)이라고 합니다. 학생 릴레이션의 속성은 학번·이름·학년·학과코드 넷입니다.

가로 줄 하나하나는 튜플(tuple)입니다. 101 · 김민수 · 3 · CS가 튜플 하나이고, 학생 한 명의 정보 묶음입니다.

한 속성에 들어올 수 있는 값의 모임을 그 속성의 도메인(domain)이라고 합니다. 학년의 도메인은 1·2·3·4 네 값이라, 학년에 7을 넣으려는 요청은 받아들이지 않습니다. 이름의 도메인은 10자 이내의 글자입니다. 도메인을 정해 두면 그 속성에 엉뚱한 값이 들어오지 않습니다.

속성의 수를 차수(degree), 튜플의 수를 카디널리티(cardinality)라고 합니다. 학생 릴레이션은 차수가 4, 카디널리티가 7입니다. 자료에 따라 차수를 디그리, 카디널리티를 기수라고도 부릅니다.

앞 레슨 데이터베이스와 DBMS에서 본 파일 처리의 이름과 맞춰 두면 헷갈리지 않습니다.

관계 데이터 모델파일 처리흔히 쓰는 말
릴레이션파일테이블·표
튜플레코드행
속성필드열·칸
카디널리티레코드 수행 수
차수필드 수열 수

한 가지 가려 둘 것이 있습니다. 앞 레슨에서 본 관계의 형태(1:1·1:N·M:N)를 카디널리티라고 부르는 자료도 있습니다. 이 레슨의 카디널리티는 릴레이션의 튜플 수입니다. 시험에서 카디널리티를 구하라고 하면 튜플이 몇 개인지를 셉니다.

3릴레이션의 네 가지 특성

그림이 줄을 섞어 보이듯 튜플의 순서는 릴레이션에서 뜻이 없습니다. 일곱 줄을 어떤 차례로 늘어놓아도 같은 릴레이션입니다. 속성의 순서도 뜻이 없어, 학년 칸과 학과코드 칸이 자리를 바꿔도 같은 릴레이션입니다. 릴레이션은 순서가 없는 모임이기 때문입니다.

마지막으로 릴레이션에는 모든 값이 같은 튜플이 둘일 수 없습니다. 튜플이 모두 서로 다르므로 튜플을 하나씩 가려낼 속성 묶음이 반드시 있습니다. 그 묶음을 키라 하고 다음 레슨 키의 종류에서 봅니다. 그리고 한 칸에는 더 쪼갤 수 없는 값 하나만 둡니다. 이런 값을 원자값(atomic value)이라 합니다. 전화번호를 둘 적어야 하면 한 칸에 함께 넣지 않고 한 칸에 하나씩 담습니다.

예제

네 릴레이션(학과·학생·과목·수강)을 Oracle로 들여다봅니다. SQL 문장은 13단원부터 배웁니다. 여기서는 SELECT가 표에서 값을 꺼내고, COUNT(*)가 줄의 수를 센다는 것만 알면 됩니다.

네 릴레이션의 차수

릴레이션마다 속성의 수를 세면 차수가 나옵니다.

SQL로 확인하기

USER_TAB_COLUMNS는 내가 만든 릴레이션의 속성 목록을 담은 표입니다. 묶어 세는 GROUP BY는 13단원에서 배웁니다.

SELECT TABLE_NAME
    AS 릴레이션,
  COUNT(*) AS 차수
FROM USER_TAB_COLUMNS
GROUP BY TABLE_NAME
ORDER BY TABLE_NAME;
릴레이션차수
과목4
수강3
학과3
학생4

학생과 과목은 속성이 넷, 학과와 수강은 셋입니다.

네 릴레이션의 카디널리티

이번에는 튜플의 수를 셉니다.

SQL로 확인하기

UNION ALL은 네 결과를 한 표로 이어 붙이는 말로, 14단원 집합 연산자에서 배웁니다.

SELECT '학과' AS 릴레이션,
  COUNT(*) AS 카디널리티
FROM 학과
UNION ALL
SELECT '학생',
  COUNT(*)
FROM 학생
UNION ALL
SELECT '과목',
  COUNT(*)
FROM 과목
UNION ALL
SELECT '수강',
  COUNT(*)
FROM 수강;
릴레이션카디널리티
학과3
학생7
과목3
수강12

차수와 카디널리티는 릴레이션마다 따로 셉니다. 수강은 속성이 셋뿐인데 튜플은 열둘로 가장 많습니다.

속성의 도메인

학생 릴레이션의 속성과 자료형을 봅니다. 자료형은 도메인을 정하는 첫 틀입니다.

SQL로 확인하기
SELECT COLUMN_NAME
    AS 속성,
  DATA_TYPE AS 자료형
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = '학생'
ORDER BY COLUMN_ID;
속성자료형
학번NUMBER
이름VARCHAR2
학년NUMBER
학과코드VARCHAR2
  • NUMBER는 수, VARCHAR2는 글자를 담는 자료형입니다. 학번에 '가나다'를 넣을 수 없습니다.
  • 자료형만으로는 도메인이 넓습니다. 학년을 1~4로 좁히려면 규칙을 더 적습니다. 예제 데이터에는 CHECK (학년 BETWEEN 1 AND 4)⁠가 걸려 있습니다. 이 규칙을 적는 법은 무결성 제약 조건에서 봅니다.

튜플의 순서는 뜻이 없다

학생 릴레이션을 이름 순으로 꺼내 봅니다. 그림에서 줄을 섞어 보인 것처럼 줄의 차례만 달라집니다.

SELECT 학번,
  이름
FROM 학생
ORDER BY 이름;
학번이름
107강도현
101김민수
103김지민
104박서연
102이서준
106정하윤
105최민준
  • 학번 순으로 꺼내면 101부터 나옵니다. 꺼내는 차례는 달라도 릴레이션은 같고, 카디널리티도 7 그대로입니다.
  • 꺼낸 결과의 차례를 정하려면 ORDER BY로 적습니다. 적지 않으면 어떤 차례로 나올지 정해져 있지 않습니다.

중복 튜플은 둘 수 없다

수강 릴레이션에는 101 · DS 튜플이 이미 있습니다. 점수만 다른 튜플을 한 번 더 넣으면, 학번과 과목코드가 겹친다는 오류(ORA-00001)를 내고 들어가지 않습니다.

SQL로 확인하기

오류 속 SQLD는 이 예제를 돌린 데이터베이스 계정 이름입니다.

INSERT INTO 수강
VALUES (101, 'DS', 90);
ORA-00001: unique
constraint
(SQLD.수강_PK) violated
on table SQLD.수강
columns (학번, 과목코드)
ORA-03301: (ORA-00001
details) row with column
values (학번:101,
과목코드:'DS')
already exists
  • 중복 튜플을 두지 않는 것은 릴레이션의 성질이고, DBMS는 겹치면 안 되는 속성 묶음을 정해 두어 그것을 지킵니다. 수강은 학번과 과목코드를 묶어 막아 두었습니다.
  • 그래서 모든 값이 같은 튜플은 물론, 점수만 다른 이 튜플도 들어가지 못합니다. 같은 학생의 같은 과목은 한 튜플입니다.

시험 포인트

  • 필기: 표에서 이름을 짚습니다 — 세로 칸은 속성, 가로 줄은 튜플, 속성의 수는 차수, 튜플의 수는 카디널리티, 한 속성에 들어올 수 있는 값의 모임은 도메인입니다. 표를 주고 차수와 카디널리티를 세게 하는 문제가 자주 나옵니다. 릴레이션의 특성 넷은 튜플의 순서가 없고, 속성의 순서가 없고, 모든 값이 같은 튜플이 없고, 모든 값이 원자값이라는 것입니다. '튜플에는 정해진 순서가 있다', '같은 튜플을 여럿 둘 수 있다' 같은 보기는 틀린 것입니다.
  • 실기: 이름과 수를 씁니다 — 튜플(Tuple)·속성(Attribute)·도메인(Domain)·차수(Degree, 자료에 따라 디그리)·카디널리티(Cardinality, 자료에 따라 기수). 표를 주고 차수와 카디널리티를 수로 씁니다.

확인 문제

1. 사원 릴레이션은 사번·이름·부서코드·입사일로 되어 있고, 지금 사원 10명이 들어 있습니다. 다음 가운데 이 릴레이션의 차수를 바꾸는 일을 고르세요.

  • ① 사원 두 명이 새로 들어와 줄이 둘 늘어납니다.
  • ② 사원 한 명이 퇴사해 줄이 하나 줄어듭니다.
  • ③ 사원마다 연락처를 적으려고 칸을 하나 더합니다.
  • ④ 사번이 작은 사원부터 차례로 늘어놓아 보여 줍니다.
정답

③입니다. 차수는 속성의 수라, 칸이 하나 늘면 4에서 5가 됩니다.

  • ① 줄이 늘어 카디널리티가 10에서 12가 됩니다. 칸의 수는 그대로입니다.
  • ② 줄이 줄어 카디널리티가 9가 됩니다. ①과 같이 차수와는 상관이 없습니다.
  • ④ 보여 주는 차례만 다릅니다. 튜플의 순서는 뜻이 없어 차수도 카디널리티도 그대로입니다.

2. 동아리 회원 릴레이션을 두고 (가)~(라)의 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 회원 한 명의 회원번호·이름·가입일을 한 묶음으로 담은 것입니다. 회원이 들어오면 이것이 하나 늘어납니다.
  • (나) 회원번호·이름·가입일처럼 모든 회원에게 똑같이 적는 항목 하나하나입니다.
  • (다) 이 릴레이션에 (나)가 넷 있다면, 그 넷이라는 수를 부르는 이름입니다.
  • (라) 회원이 열두 명 들어 있다면, 그 열둘이라는 수를 부르는 이름입니다.
정답

받는 답: (가) 튜플(Tuple) · (나) 속성(Attribute) · (다) 차수(Degree) 또는 디그리 · (라) 카디널리티(Cardinality) 또는 기수

(가)의 실마리는 '회원 한 명 몫이 한 묶음이고 회원이 늘면 하나 늘어난다', (나)는 '모든 회원에게 똑같이 적는 항목', (다)는 '(나)의 수', (라)는 '회원의 수'입니다.

  • 같은 이름의 다른 꼴: 한글 이름만, 또는 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다. 디그리·기수는 자료에 따라 부르는 이름이라 함께 받습니다.
  • 틀리는 꼴 (다)와 (라)를 바꿔 쓴 꼴: 항목의 수가 차수, 회원의 수가 카디널리티입니다.
  • 틀리는 꼴 레코드 — (가)에: 파일 처리에서 한 줄을 부르는 이름입니다. 관계 데이터 모델에서 그 줄의 이름은 튜플입니다.

3. 어느 학원이 수강생을 다음 표로 관리합니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.

학번이름수강 과목
201한지우영어, 수학
202오세훈수학
202오세훈수학
  • (1) 이 표를 릴레이션이라고 할 수 없는 까닭을 둘 찾아 쓰세요.
  • (2) '학번 칸에는 200번대 수만 넣는다'처럼 한 속성에 들어올 수 있는 값의 모임을 무엇이라 하는지 한글 이름과 영문으로 함께 쓰세요.
정답

받는 답: (1) 201의 수강 과목 칸에 값이 둘이라 원자값이 아니다 · 202의 줄이 두 번 있어 중복 튜플이다 · (2) 도메인(Domain)

(1)의 실마리는 '한 칸에 값이 둘', '모든 값이 같은 줄이 둘'입니다. 릴레이션은 한 칸에 더 쪼갤 수 없는 값 하나만 두고, 모든 값이 같은 튜플을 둘 두지 않습니다.

  • 같은 이름의 다른 꼴: (2) 한글 이름만, 또는 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다.
  • 틀리는 꼴 학번이 겹친다 — (1)에: 한 속성의 값이 겹치는 것은 릴레이션에서 막지 않습니다. 여기서 겹친 것은 학번만이 아니라 줄 전체입니다.
  • 틀리는 꼴 속성 — (2)에: 칸 하나하나를 부르는 이름입니다. 그 칸에 들어올 수 있는 값의 모임은 도메인입니다.

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

정보처리기사 목차로