ER 모델을 다루는 문제 넷이다. 답은 접혀 있다. 먼저 종이에 써 본 뒤 펼친다.
p1 · 상식으로 비율 정하기
두 개체 타입 사이의 이항 관계에, 개체 타입을 상식으로 본 뜻에 맞는 카디널리티 비율을 적으라.
| 번호 | 개체 타입 1 | 개체 타입 2 |
|---|---|---|
| 1 | STUDENT | SOCIAL_SECURITY_CARD |
| 2 | STUDENT | TEACHER |
| 3 | COUNTRY | CURRENT_PRESIDENT |
| 4 | COURSE | TEXTBOOK |
| 5 | ITEM (주문에 들어 있는 물건) | ORDER |
| 6 | STUDENT | CLASS |
| 7 | CLASS | INSTRUCTOR |
사용 개념: 카디널리티 비율
풀이 전략: 짝마다 두 번 묻는다. “왼쪽 하나에 오른쪽이 몇 개까지 붙는가”, “오른쪽 하나에 왼쪽이 몇 개까지 붙는가”. 둘 다 하나면 1:1, 한쪽만 여럿이면 1:N, 둘 다 여럿이면 M:N이다. 비율은 왼쪽 : 오른쪽 순서로 쓴다.
답
| 번호 | 답 | 두 물음의 답 |
|---|---|---|
| 1 | 1:1 | 학생 한 명에 카드 한 장, 카드 한 장은 한 사람 것 |
| 2 | M:N | 학생은 선생님 여럿에게 배우고, 선생님은 학생 여럿을 가르친다 |
| 3 | 1:1 | 나라에 현직 대통령 한 명, 대통령은 한 나라만 맡는다 |
| 4 | M:N | 과목 하나가 교재 여럿을 쓰고, 교재 하나가 여러 과목에서 쓰인다 |
| 5 | N:1 | 주문 하나에 물건 여럿, 물건 하나는 한 주문에만 들어간다 |
| 6 | M:N | 학생은 수업 여럿을 듣고, 수업에는 학생이 여럿이다 |
| 7 | M:N | 수업 하나를 강사 여럿이 맡을 수 있고, 강사는 수업 여럿을 맡는다 |
5번의 N:1은 왼쪽(ITEM)이 N쪽, 오른쪽(ORDER)이 1쪽이라는 뜻이다.
이 문제의 답은 가정에 따라 달라진다. 5번은 ITEM을 실물 하나하나로 볼 때 N:1이다. “상품 종류”로 보면 같은 상품이 여러 주문에 들어가므로 M:N이 된다. 7번은 수업 하나를 강사 한 명만 맡는 학교라면 N:1이다. 1번은 카드를 다시 발급받아 여러 장 갖는 경우까지 넣으면 1:N이다. 답안에는 어떤 가정으로 정했는지를 함께 쓴다1.
p2 · 미 하원 표결 ER 다이어그램
미국 하원의 표결 정보를 적는 데이터베이스의 ER 다이어그램을 그려라. 힌트: 개체 타입 셋, 관계 타입 셋.
- 주(STATE): 이름(예: Texas, New York, California)과 지역(Northeast, Midwest, Southeast, Southwest, West).
- 하원의원(CONGRESS_PERSON): 이름, 선거구(District), 당선된 날(Start_date), 소속 정당(Republican, Democrat, Independent).
- 법안(BILL): 이름, 표결 날짜(Date_of_vote), 가결 여부(Passed_or_failed), 발의자(Sponsor). 발의자는 그 법안을 낸 하원의원(들)이다.
- 의원마다 법안마다 어떻게 표결했는지(yes, no, absent).
풀이 전략: 세 단계로 한다. ① 개체 타입과 속성을 적는다. ② 값이 다른 개체인 속성을 관계 타입으로 바꾼다. ③ 그린다. 4번처럼 “A마다 B마다 값 하나”인 문장은 M:N 관계 타입과 그 속성이라는 신호다.
답
1단계. 개체 타입과 속성.
- STATE: SName (키), Region
- CONGRESS_PERSON: CName (키), District, Start_date, Party
- BILL: BName (키), Date_of_vote, Passed_or_failed, {Sponsor}
2단계. 관계 타입.
| 관계 타입 | 잇는 개체 타입 | 비율 | 참여 | 속성 |
|---|---|---|---|---|
| REPRESENTS | CONGRESS_PERSON, STATE | 의원 N : 주 1 | 양쪽 전체 | 없음 |
| SPONSORS | CONGRESS_PERSON, BILL | M:N | BILL 전체, CONGRESS_PERSON 부분 | 없음 |
| VOTES | CONGRESS_PERSON, BILL | M:N | 양쪽 전체 | Vote |
- {Sponsor}는 값이 하원의원이다. 그래서 속성에서 지우고 SPONSORS로 바꾼다. 법안에는 발의자가 반드시 있고, 법안을 하나도 내지 않은 의원은 있어도 된다.
- 4번의 표결 결과는 (의원, 법안) 짝마다 하나다. M:N 관계 타입 VOTES의 속성 Vote가 된다. 어느 개체로도 옮길 수 없다.
- REPRESENTS는 요구사항 글에 따로 적혀 있지 않다. 의원은 어느 주의 선거구를 대표한다는 사실과 “관계 타입 셋”이라는 힌트에서 나온다2.
3단계. 그림.
flowchart TB
CP["CONGRESS_PERSON"] ===|N| REP{"REPRESENTS"} ===|1| ST["STATE"]
CP ---|M| SP{"SPONSORS"} ===|N| BILL["BILL"]
CP ===|M| VT{"VOTES"} ===|N| BILL
VT --- vote(["Vote"])
cn(["CName (키)"]) --- CP
di(["District"]) --- CP
sd(["Start_date"]) --- CP
pa(["Party"]) --- CP
ST --- sn(["SName (키)"])
ST --- rg(["Region"])
BILL --- bn(["BName (키)"])
BILL --- dv(["Date_of_vote"])
BILL --- pf(["Passed_or_failed"])
굵은 선은 겹선(전체 참여)이다.
변형 문제. “법안의 발의자는 꼭 한 명”이라고 요구사항이 바뀌면 SPONSORS는 어떻게 달라지는가3?
답
의원 1 : 법안 N이 된다. CONGRESS_PERSON 옆에 1, BILL 옆에 N을 적고, BILL 쪽 겹선은 그대로 둔다. (min, max)로는 BILL 옆이 (1,1), CONGRESS_PERSON 옆이 (0,N)이다.
p3 · (min, max) 제약 붙이기
아래 그림의 네 자리에 (min, max)를 적으라.
- 과목은 교재를 쓸 수도 있고 안 쓸 수도 있다.
- 과목은 교재를 5권 넘게 쓸 수 없다.
- 과목은 적어도 한 명, 많아야 4명의 교수가 가르친다.
- 교재는 어느 과목에선가 쓰이는 책이다.
- 교수는 2과목에서 4과목을 가르친다.
flowchart LR
I["INSTRUCTOR"] ---|"① (min, max)"| T{"TEACHES"} ---|"② (min, max)"| C["COURSE"]
C ---|"③ (min, max)"| U{"USES"} ---|"④ (min, max)"| X["TEXT"]
사용 개념: (min, max) 표기
풀이 전략: 문장마다 주어를 찾는다. 숫자쌍은 주어인 개체 타입 옆에 간다. COURSE는 두 관계에 끼므로 문장이 TEACHES 이야기인지 USES 이야기인지도 가린다. “안 쓸 수도 있다”는 아래 한계 0, “적어도 한”은 아래 한계 1이다. 위 한계를 말하지 않으면 N이다.
답
| 자리 | 답 | 근거 문장 |
|---|---|---|
| ① INSTRUCTOR | (2, 4) | 교수는 2과목에서 4과목을 가르친다 |
| ② COURSE (TEACHES 쪽) | (1, 4) | 과목은 적어도 한 명, 많아야 4명의 교수가 가르친다 |
| ③ COURSE (USES 쪽) | (0, 5) | 안 쓸 수도 있다(0), 5권 넘게는 못 쓴다(5) |
| ④ TEXT | (1, N) | 어느 과목에선가 쓰인다(적어도 1). 위 한계는 말이 없다 |
흔한 오답은 ①과 ②를 바꿔 적는 것이다. “교수는 2~4과목”의 주어는 교수이므로 (2,4)는 INSTRUCTOR 옆이다.
변형 문제. 답을 1, N과 겹선으로 옮기면 두 관계의 비율과 참여는 어떻게 되는가3?
답
TEACHES와 USES 둘 다 M:N이다. 위 한계가 4, 4, 5, N으로 모두 1보다 크기 때문이다. 전체 참여(겹선)는 INSTRUCTOR, COURSE(TEACHES 쪽), TEXT이고, USES의 COURSE 쪽만 부분 참여(홑선)다. 2, 4, 5라는 숫자는 옮기면서 사라진다.
p4 · ER 다이어그램 읽고 문장 가리기
아래 ER 다이어그램을 보고 문장 (a)~(f)가 True인지, False인지, Maybe인지 답하라. 굵은 선은 겹선(전체 참여)이다.
flowchart TB
ACTOR["ACTOR"] ===|M| PI{"PERFORMS_IN"} ===|N| MOVIE["MOVIE"]
ACTOR ---|2| LR{"LEAD_ROLE"} ===|N| MOVIE
ACTOR ---|1| AD{"ALSO_A_DIRECTOR"} ---|1| DIRECTOR["DIRECTOR"]
DIRECTOR ---|1| DR{"DIRECTS"} ===|N| MOVIE
ACTOR ---|1| AP{"ACTOR_PRODUCER"} ---|1| PRODUCER["PRODUCER"]
PRODUCER ---|M| PR{"PRODUCES"} ===|N| MOVIE
- (a) 이 데이터베이스에는 영화에 한 편도 나오지 않은 배우가 없다.
- (b) 영화에 열 편 넘게 나온 배우가 있다.
- (c) 여러 영화에서 주연을 맡은 배우가 있다.
- (d) 영화 한 편의 주연 배우는 많아야 두 명이다.
- (e) 제작자는 다른 영화의 배우가 될 수 없다.
- (f) 감독은 한 명인데 제작자는 여럿인 영화가 있다.
사용 개념: ER 다이어그램 표기법, 카디널리티 비율, 참여 제약
풀이 전략: 그림은 규칙만 적고 자료는 적지 않는다. 그래서 문장을 셋으로 가른다. 그림의 규칙을 지키는 자료라면 언제나 참인 문장은 True다. 규칙이 허용하는 일을 “할 수 없다”고 한 문장은 False다. 규칙이 허용하지만 꼭 그렇게 되라고 하지는 않는 일을 “~가 있다”고 한 문장은 Maybe다. 자료를 봐야 안다.
답
| 문장 | 답 | 그림에서 본 것 |
|---|---|---|
| (a) | True | ACTOR와 PERFORMS_IN 사이가 겹선이다. 배우는 모두 영화에 한 편 이상 나온다 |
| (b) | Maybe | PERFORMS_IN이 M:N이라 배우가 영화 몇 편에 나오든 된다. 그런 배우가 실제로 있는지는 그림이 말하지 않는다 |
| (c) | Maybe | LEAD_ROLE의 MOVIE 쪽이 N이라 배우 한 명이 여러 영화의 주연일 수 있다. 실제로 있는지는 모른다 |
| (d) | True | LEAD_ROLE의 ACTOR 쪽이 2다. 영화 한 편에 붙는 주연 배우는 2명까지다 |
| (e) | False | ACTOR_PRODUCER가 배우와 제작자를 잇는다. 제작자이면서 배우인 사람을 그림이 허용한다. 그 사람이 다른 영화에 나오는 것을 막는 규칙도 없다 |
| (f) | Maybe | DIRECTS가 감독 1 : 영화 N이고 MOVIE 쪽이 겹선이라 영화의 감독은 꼭 한 명이다. PRODUCES는 M:N이라 제작자가 여럿일 수 있다. 그런 영화가 실제로 있는지는 모른다 |
(b), (c), (f)를 True라고 답하기 쉽다. “할 수 있다”와 “실제로 있다”는 다르다4.
변형 문제. 같은 그림에서 (g) “감독이 없는 영화가 있을 수 있다”, (h) “배우이면서 감독인 사람이 있다”를 가려라3.
답
(g) False. MOVIE와 DIRECTS 사이가 겹선이라 영화에는 감독이 반드시 있다. (h) Maybe. ALSO_A_DIRECTOR가 그런 사람을 허용하지만, 양쪽 다 홑선이라 꼭 있어야 하는 것은 아니다.