#title 관계에 대하여.. [[TableOfContents]] 많은 사람들이 개체집합보다는 관계집합에 대해서 더 어려움을 느낀다. 그것은 역시 집합의 정의가 제대로 이루어지지 않았기 때문이다. 먼저 관계의 개념에 대해서 알아보고, 관계에 대한 표기법과 관계에 대한 고려사항들에 대해서 살펴보기로 하겠다. ==== 밖에 지나가는 저 사람은 나와 관계가 있는가? ==== 관계의 개념은 매우 애매모호하다. 애매하다는 것은 “관계”가 있냐 없냐를 따지기 전에 무엇인가 정의가 되지 않았기 때문에 애매한 것이다. 만약 밖에 지나가는 사람이 “대한민국의 국적을 가진 사람으로써” 라는 집합의 정의를 내렸다면 밖에 지나가는 사람이 만약 대한민국의 국적을 가졌다면 나와 관계가 있다고 판단될 수 있다. 밖에 지나가는 사람이 나와 관계가 있으려면 대한민국의 국적을 가져야 한다는 소리이다. 만약 밖에 지나가는 사람이 일본 국적을 가진 사람이라면 나와 관계가 없다. 그러나 관계집합의 정의를 더 확장하여 “대한민국과 일본 국적을 가진 사람으로써..” 라는 집합의 정의를 내렸다면 일본 국적을 가진 외국인도 나와 관계가 있음을 알 수 있다. 관계집합도 개체집합처럼 어떻게 정의하느냐에 따라 모델의 모양이 틀려진다. ==== 자연수와 음의 정수 ==== 자연수는 {1, 2, 3, .... ∞}의 집합이다. 자연수의 범위에서의 덧셈의 결과는 자연수의 결과가 나온다. 예를 들어, 5 + 3 = 8 과 같을 것이다. 하지만 3 - 5 = -2 가 된다. 즉, 뺄셈의 경우에는 자연수의 범위를 벗어난다. 그래서 정수라는 것이 생겨나게 된다. 여기서 -2는 정수(음의 정수)라는 영역에 속하게 된다. 즉, 정수는 {-∞, ..., -2, -1, 0, 1, 2, ... ∞} 집합이다. 여기서 덧셈, 뺄셈은 두 수의 관계를 나타낸다. 관계가 없었다면 정수가 나타날 수 있었을까? 또한 나눗셈(÷)이 있었기에 유리수가 생겨난다. 또한 분수로 나타내지 못하는 수인 √2(X^2^ = 2 )와 같은 수가 존재함을 확인한다. 무리수로 확장된다. (유리수와 무리수를 합쳐 '실수'라고 한다.) ==== 관계의 철학적인 배경: 운동과 변화는 없다 ==== 파르메니데스(기원전 515? ~ 445?)는 '모든 것이 변한다'라는 헤라클레이토스의 명제를 가차 없이 짓밟았다. 파르메니데스는 '아무것도 변하지 않는다'라고 했다. 나름대로 논리적인 이유를 들어서다. 예를 들어 'There is nothing'은 우리말로 '아무것도 없다'라고 해석된다. 하지만 영어말 그대로 해석하면 '없는 것이 있다'는 뜻이 된다. 그래서 파르메니데스는 이것을 모순이라고 지적한다. 이러한 파르메니데스의 주장은 다소 억지스럽다. 그런데도 고향 후배인 제논은 이러한 주장을 뒷받침하기 위해서 교모한 역설 2개를 준비한다. {{{ 화살의 경우 출발점은 활이고 목적지는 과녁이다. 시위를 떠난 화살은 우선 과녁과의 거리에 절반에 해당하는 지점을 통과할 것이다. 그 다음에는 나머지 절반 그 다음에는 나머지 절반 그 다음에는 나머지 절반 . . . . . 무한대 }}} 결국 화살은 과녁에 도달하지 못한다. 또 다른 역설은 운동선수 아킬레우스와 거북이의 경주다. {{{ 운동선수인 아킬레우스보다 거북이가 조금이라도 먼저 출발한다면 아킬레우스는 영원히 거북이를 따라잡지 못한다. 아킬레우스가 거북이 있던 곳까지 도달하면 거북이는 그 지점에서 조금이라도 더 앞에 있을 것이다. 다시 아킬레우스가 거북이 있던 곳까지 도달하면 거북이는 그 지점에서 조금더 앞서 있을 것이다. 다시 아킬레우스가 거북이 있던 곳까지 도달하면 거북이는 그 지점에서 조금더 앞서 있을 것이다. 다시 아킬레우스가 거북이 있던 곳까지 도달하면 거북이는 그 지점에서 조금더 앞서 있을 것이다. . . . . . 무한대 }}} 현실적으로는 터무니 없는 이야기다. 1초라는 시간 동안에 갈 수 있는 거리는 거북이와 아킬레우스가 정해졌을 것이다. '거리 * 시간'을 하면 언젠가 아킬레우스는 거북이를 따라 잡을 것이다. 시위를 떠난 화살은 분명 과녁에 꽂힐 것이고, 아킬레우스는 분명히 거북과의 경주에서 이길 것이라는 것은 현실에서는 분명하기 때문이다. 그런데 왜 이런 말도 안되는 이야기를 했을까? 제논의 관점이 다른 사람들과 틀렸기 때문이다. 즉, 제논의 관점은 화살과 과녁이라는 실체가 아닌 화살의 운동에 내재하는 논리에 있다. 즉, 파르메니데스와 제논은 실체가 아닌 과녁과 화살, 아킬레우스와 거북과의 '''<관계>'''에 주목을 했던 것이다. 이로써 철학적인 사유는 실체에서 관계를 주목하게 된 것이다. 데이터 모델링 할 때 우리는 실체, 관계라는 단어를 많이 들어봤고, 거의 실체와 관계를 정의하는 일에 데이터 모델링의 시간을 쏟아 붓고 있다. 그런 의미에서 관계의 관점이 정립되는 순간에 대한 이야기를 해보았다. === 관계의 개념 === 관계란 개체집합간의 관련이 생기게 되는 업무적인 이유이다. 그러므로 개체집합이 먼저 존재해야지만 관계가 있는가를 판단할 수 있다. 앞서 말한 “대한민국 국적을 가진 사람으로써” 라는 정의는 업무적인 이유에 해당된다. 그림을 보면 부서와 사원간에 관에 “소속되다” , “배정받다” 라는 업무적인 이유에 의해 사원의 관점과 부서의 관점에서 각각 관계를 맺고 있는 것을 볼 수 있다. attachment:relation01.jpg 표기법은 옛날 표기법이다. 여기에 속성까지 추가된다면 더욱 커질 것이다. 데이터가 폭발적으로 늘어나고, 우리가 얻고자 하는 정보가 많아짐에 따라 옛날 표기법은 모델의 복잡성이 증가하여 지금은 잘 사용되지 않고 있다. 관계도 집합이다. 그러므로 “관계”이라는 복합명사를 사용하였다. 데이터베이스는 집합으로 시작해서 집합으로 끝난다. 그러므로 당연히 관계도 집합이다. 아래의 그림을 보면 알 수 있듯이 영업부는 이재학, 전지현, 손예진과 관계를 맺고 있으며, 총무부, 자재부는 각각 홍길동과 신구와 관계를 맺고 있다. 이렇게 관계는 “연결이 성공된 선들의 집합”이다. 그러므로 각각의 사원과 경영기획부는 사원들과 관계가 없음을 알 수 있다. 즉, 영업부와 이재학, 전지현, 손예진 사원은 업무적인 이유로 묶여져 있는 집합이다. 즉, “영업부에 배정받은 사원” 이라는 개념의 도메인에 있는 것이다. 또한 이렇게 관계에 묶여져 있는 짝을 관계페어링이라고 한다. 물론 집합을 어떻게 정의하느냐에 따라서 관계가 변하기도 한다. 이에 대한 내용은 뒤쪽에서 다룰 것이므로 일단은 관계의 개념에 대해서만 말하고 넘어가도록 한다. attachment:relation02.jpg 관계를 왜 맺을까? 개체간의 관계를 가짐으로써 어떤 이득이 있길래 관계를 맺어주려고 할까? 그 이유는 관계를 가짐으로써 개체집합간의 새로운 정보를 창출할 수 있기때문이다. 새로운 정보를 창출한다는 것은 시너지(system energy)를 의미한다. 관계형 모델의 장점은 정보를 얻기가 쉽다는데 있다. 부서와 사원간에 관계를 가지지 않으면 “부서간 사원들의 평균 급여의 차이는 얼마인가?” 에 대한 답을 찾기는 그리 쉽지는 않다. 관계를 가진다는 의미는 관계를 가짐으로써 새로운 정보를 만들 수 있다는 것을 의미하기도 한다. 관계는 엔터티 집합간의 양방향에 대한 업무규칙을 말한다. 사원의 관점에서 부서와 어떤 관계가 있는지 또한 부서의 관점에서 사원은 어떤 관계가 있는지 파악해야 한다는 것이다. attachment:add01.jpg ==== 관계의 도출 소스 ==== 관계는 업무에서 사용되는 동사로 도출될 수 있다. 중요한 것은 관계를 개념적으로 중첩(Overlap)되면 관계로 도출되어야 한다는 것이다. 즉, 위의 그림처럼 납입자와 가입자는 서로 독립적이지 못하고, 개념의 중첩이 있는 것을 보인다. 즉, 고객번호 111에 해당되는 사람은 납입자도 될 수 있고, 가입자도 될 수 있음을 의미한다. 즉, 집합의 개념이 애매모호해지는 것이다. 그러므로 이러한 개념에서 본다면 납입자, 가입자는 관계가 된다. attachment:relation03.jpg 다음의 그림을 보자. 실제로 ER-WIN과 같은 모델링 도구에서 다음과 같이 표현하고 있을 것이다. attachment:relation04.jpg 고객번호는 외부키로 사용되었다. 여러분이 알아야 할 것은 “고객번호”는 속성이 아니라 “관계”라는 것이다. 여기서 외부키로 들어온 “고개번호”가 바로 “가입자” 라는 것이다. ==== 1차 관계만 표현 ==== attachment:relation05.jpg 그림에서 보는 바와 같이 아버지와 나와의 관계만 알 수 있다면 할아버지와의 관계를 알 수 있다. 이와 같이 개체집합간의 관계도 1차적인 관계만을 정의하여 모델에 표현한다. “할아버지”와 “아버지”는 직접 종속관계이고, “할아버지”, “작은아버지”는 “나”와 간접 종속 관계이다. 아래의 그림을 보자. 모델을 보면 “할아버지”와 “나”가 직접 연결되어 있는 것을 볼 수 있다. attachment:relation06.jpg 그림으로 본다면 작은아버지와 아버지, 나는 형제 관계가 되버리고, 아버지와 어머니 사이에서 태어난 것이 되어 버린다. 호적을 잘 정리하고, 법적으로 해결을 할 수는 있겠지만 이것은 현실적으로 불가능하다고 봐도 무리가 없을 것이다. 물리적으로 보았을 때는 가능한 이야기다. 이에 대해서는 식별자를 다룰 때 언급하도록 하겠다. ==== 관계의 표현 방법 ==== 전통적으로 관계는 마름모꼴로 표시했다. 그러나 관리해야 할 개체집합의 수가 증가하면서 데이터 모델의 표현 방법은 좀 더 심플하게 발전되었다. 현재는 여러 표기법 가운데 정보공학적 표기법을 가장 선호한다. (필자가 보기에는 그렇다) 아래의 그림이 대표적인 관계를 표현 방법이다. attachment:relation07.jpg 개체집합 E1, E2가 있다. 새의 발 모양을 한 쪽이 다 측이다. 즉, E1의 하나의 개체가 E2의 여러 개체들과 관계를 맺을 수 있음을 뜻한다. 반드시(Mandatory) 관계를 맺어야 하는 것과 선택(Optional)은 세로선(|, Mandatory)과 동그라미(0, Optional)로 표현한다. 각각의 개체집합에서 바라보는 관점을 표현한다. 중요한 것은 다음 그림과 같이 배타적인 관계일 경우는 하나의 관계로 봐야 한다는 것이다. attachment:relation08.jpg * 2010.09.13 아놔.. 그림이 잘못되어서 바꿨다.. 왜 이렇게 그려놨지? ㅋ 사실 초보자의 경우 모델을 표현하는 방법에 다소 익숙하지 않은 것은 당연하다. 그러나 이것은 표기법일 뿐이다. 그 표기가 의미하는 바만 알면 되는 것이니 표기법에 관심을 집중하는 일은 없어야 할 것이다. ==== 관계 읽는 연습 ==== 다음 그림을 보고 문장으로 표현하라. attachment:relation09.jpg ==== ERD 연습 ==== 다음을 보고 ERD를 작성하라. ||우리 회사에서 프로젝트 배정 현황에 관한 데이터베이스를 구축하고자 한다. 각 사원은 하나 또는 그 이상의 프로젝트에 배정될 수 있으며, 프로젝트가 없는 사원도 있을 수 있다. 그러나 각 프로젝트에는 반드시 한 명 이상의 사원이 배정되어야 한다. 어떤 프로젝트는 우리 회사에서 근로하는 근로자와 계약을 한 근로자가 배정될 수 있으며, 거래처로 외주를 줄 수도 있다.|| 많은 사람들의 ERD가 서로 다른 모양일 수 있다. 왜냐하면 많은 부분에서 정의가 미흡하기 때문이다. 아래와 같은 모델1, 2, 3, 4를 필자가 그려보았다. {{{[모델1]}}} attachment:relation10.jpg 이 모델의 경우 논란거리가 될 수 있는 것은 “사원” 개체집합의 개념의 범위와 배타적 관계이다. 만약 위의 그림과 같이 “사내부서”는 “사내직원”만 관계가 있고, “거래처”는 “거래처직원”만 관계를 가진다고 표현되었다면 배타적인 표시는 없어도 된다. 하지만 “사내부서”와 “거래처”가 모두 “사원”과 관계를 가진다고 표현했다면 [모델2]처럼 배타적인 관계를 가진다는 표현을 모델에 해주어야 한다. {{{[모델2]}}} attachment:relation11.jpg {{{[모델3]}}} attachment:relation12.jpg {{{[모델4]}}} attachment:relation13.jpg “사원”과 “프로젝트”는 다:다 관계이다. 이에 대해서는 나중에 다루도록 하겠다. 중요한 것은 얼마나 유연하고, 알아보기 쉬우며, 개념을 잘 반영하였는가가 문제이다. ==== 관계의 도출 ==== 관계를 나누려면 먼저 엔터티 집합을 각 Subject Area로 나눈다. (시스템이 작다면 생략) 주제영역이 나뉘었었으면 각 Subject Area 단위로 아래의 메트릭스를 이용하여 관계의 유무만을 판단한다. attachment:relation14.jpg 이 단계는 관계의 유무만을 판단하는 것이므로 목표에 충실하기 위해 애매모호하다면 관계 후보로 일단 포함한다. 애매모호한 것은 사용자들과 하나씩 개념을 파악하여 관계인지 아닌지를 판단하면 된다. 관계는 역할 위주, 내용위주로 판단한다. 대표적인 관계로 존재, 기능, 사건이 있다. 엔터티 집합의 정의에 따라서 관계도 틀려지므로 엔터티 집합의 선정은 중요하다. 이에 대해서는 다음 단원에서 다루도록 하겠다. 처음은 제 3자의 관점에서 출발하여 각각의 관점으로 도출하고, 양자의 입장은 나중이므로 메트릭스의 1/2만 이용한다. ==== 관계의 정의에 따른 모델의 변화와 관계 통합 ==== 관계를 어떻게 정의하느냐에 따라서 모델은 변화한다. 다음의 그림을 보도록 하자. attachment:relation15.jpg “고객”과 “보험계약” 사이에는 병렬관계가 존재한다. 병렬관계라 함은 두 개체집합 사이에 여러 개의 관계가 존재함을 뜻한다. 그러나 다음의 그림과 같이 계약명의를 변경하고, 변경에 대한 이력을 관리하고자 한다면 “계약자” 관계는 다음과 같이 다:다의 관계로 변화한다. attachment:relation16.jpg 만약 “계약자”와 “피보험자”의 개념을 통합하여(추상화 레벨을 높임) 정의를 내렸다면 위 ERD는 다음과 같이 변화한다. attachment:relation17.jpg 최종 모델은 다음과 같이 변화한다. 이렇게 관계를 통합한다는 의미는 “계약관련자”에 다:다 관계를 포함한다. “계약자”와 “피보험자”의 개념도 포함하고 있다. 주의해야 할 것은 통합을 하게 된다면 모델의 유연성은 높아지나 의미가 덜 정확하다는 것이다. 그러므로 의미에 해당되는 부분은 최대한 문서화 해 놓는 것이 중요하다. attachment:relation18.jpg 또 다른 예를 보자. “부서”와 “사원”의 관계를 보도록 하자. 두 개체집합 간에는 1:다의 관계가 존재한다. 그러나 이 모델에서 나타내는 것은 현재만을 의미한다. attachment:relation19.jpg 만약 사원이 부서로 이동되는 이력을 관리하고자 한다면 다음과 같이 다:다의 관계가 된다. 그림에서는 “소속이력”으로 표현하였지만 조금 더 현실에 맞는 관계명을 선택한다면 “발령사항” 쯤이 될 것이다. attachment:relation20.jpg 만약 “소속” 이라는 관계와 “발령사항” 이 모델에 함께 존재한다면 개념의 중복이라고 볼 수 있다. 하지만 물리적으로 보았을 때 성능상의 이유로 중복을 했을 가망성도 있으니, 만약 구시스템에서 관계를 도출한다면 이에 대한 개념을 범위를 명확히 집고 넘어가 한다. ==== Foreign Key의 의미 ==== Foreign Key(FK)는 물리적인 것이다. 이 FK 두 가지 의미를 가진다. * 정규화를 통해 쪼개지거나 성능상의 이슈로 수직 분할된 테이블간의 참조무결성 제약 * 개체와 개체간의 업무적인 관련에 대한 현실세계의 표현 즉, 논리모델(관계형모델)의 물리적인 표현일 수도 있고, 개념모델 -> 논리모델(관계형모델)의 물리적인 표현일 수도 있다는 것이다. 책에도 열심히 설명되고 있다.(아래의 글은 매우 정겹다.) "각각의 사원은 반드시 하나의 부서에만 배정받을 수 있다" "각각의 부서는 여러명의 사원이 소속될 수 있다." 물리적으로 표현했을 때 "사원"테이블에는 "부서번호"라는 FK가 생겼을 테다. 즉, 우리는.. "각각의 사원은 반드시 하나의 부서에만 배정받을 수 있다" "각각의 부서는 여러명의 사원이 소속될 수 있다." 를 "전산화"시킨 것이다. 현실세계를 모델링(추상화)하여 컴퓨터세계에 녹인 것이다. 즉, FK는 반드시 배정받고, 여러명의 사원이 소속될 수 있다는 업무규칙을 컴퓨터세계에서 표현한 것이다.