인기있는 상품을 선호하는 현실에서도 그렇듯이 데이터 모델링을 통해 현실의 데이터를 DB에 저장하려면 논리적 데이터 모델들 중 하나를 선택해야 한다. 이중 가장 인기 있는 관계 모델을 선택해야한다.
이 장에서는 관계 데이터 모델의 핵심인 릴레이션 [ 개체, 엔티티, Table ] 에 대해 알아본다고한다. 릴레이션을 구성하는 요소, 특성, 키의 역활과 종류, 무결성 제약의 의미와 필요성에 대해 알아보자.
1] 관계 데이터 모델의 개념
일반적으로 관계 데이터 모델에서는 하나의 개체에 관한데이터를 릴레이션 하나에 담아 DB에 저장한다. 이와같은 형식
이 예를 통해 릴레이션과 관련된 용어들을 하나씩 알아보자.
1.1 속성
릴레이션의 열을 속성 [ Attribute ] 라고 부른다. 예제의 고객 릴레이션에는 고객과 관련하여 여섯가지 중요한 데이터를 의미하는 고객아이디, 이름, 나이, 등급, 직업, 적립금이라는 속성이 존재한다. 릴레이션은 파일관리 시스템에서 파일, 속성은 해당 파일의 필드에 대응하는 개념.
1.2 투플
릴레이션의 행을 투플 [ Tuple ] 이라고 부른다. 그림의 고객 릴레이션에서 각 투플은 고객 한명에 대한 실제 속성 값 6개를 모아놓은 것으로, 고객 개체 [ 릴레이션 ] 의 인스턴스 [ 투플 ] 다. 따라서 고객 4명의 데이터를 저장하고 있는 고객 릴레이션에는 4개의 투플 = 4개의 고객 개체 인스턴스가 존재한다. 투플은 F/S 에서 파일의 레코드에 대항하는 개념이다.
1.3 도메인
속성 [ 열, Attribute ] 하나가 가질 수 있는 모든 값의 집합을 해당 속성의 도메인 이라고한다 [ 인스턴스의 집합 ]. 관계 데이터 모델에서는 속성 값으로 더는 분해할 수 없는 원자 값 [ CHAR, INT ] 만 사용할 수 있다. 예제의 vip, gold, silver, bronze의 속성 값은 모아놓은 것이 등급 속성의 도메인이 된다. 등급 속성의 도메인을 정의해두면 속성값의 입력, 수정을 할 때 DBMS이 적합성을 판단하여 4가지 이외의 값은 허용하지 않음으로서 무결성 상승!
그런데, 고객아이디, 고객이름, 나이 등의 속성은 도메인을 정확히 정의할 수 없다. 이처럼 도메인은 값을 일일이 나열하기 어려운 경우가 대부분이므로 일반적으로 데이터 타입으로 정의한다. 고객이름 도메인은 CHAR(20) = 문자 20개로 구성된 문자열 타입, 나이 도메인은 INT = 정수 타입으로 정의. 데이터 타입 = 도메인 , 변수 = 속성.
1.4 널 값
릴레이션에 있는 특정 투플의 속성 값을 모르거나, 적합한 값이 없는 경우에는 널null 이라는 특별한 값을 사용할 수 있다. 널 값은 특정 속성에 해당되는 값이 없음을 나타내는 숫자 0이나 공백과는 다르게 아직 결정되지 않은 경우를 널 값으로 표현이 가능하다. NULL 로 투플값을 기입.
1.5 차수
하나의 릴레이션에서 속성 [ Attribute, 릴레이션 열 ] 의 전체 개수를 릴레이션의 차수degree 라고한다. 예제의 고객 릴레이션은 차수가 6이다. 모든 릴레이션은 최소 1 이상의 차수를 유지해야 한다.
1.6 카디널리티
하나의 릴레이션에서 투플의 전체 개수를 릴레이션의 카디널리티 라고한다. 투플은 계속 삽입되거나 [새로운] 삭제될 수 있으므로 릴레이션의 카디널리티는 자주 변하는 동적인 특징이 있으며 투플이 없을수도 있다.
2] 릴레이션과 DB의 구성
일반적으로 DB는 여러 개의 릴레이션으로 구성된다. 예를들어 인터넷 쇼핑몰을 위한 DB는 고객 릴레이션, 상품 릴레이션, 주문 릴레이션으로 구성할 수 있다. 그러하여 DB는 모든 릴레이션의 스키마와 인스턴스를 모아둔 것이다.
- 릴레이션의 특성
관계 데이터 모델에는 중요한 4가지 특성이 있는데 기본적으로 이 4가지 특성을 만족해야 릴레이션으로 인정받을 수 있다.
1. 투플의 유일성 : 하나의 릴레이션에는 동일한 투플이 존재할 수 없다.
하나의 릴레이션에는 똑같은 투플이 있으면 안 되고, 모든 투플에는 다른 투플과 구별되는 유일한 특성이 있어야 한다. 집합에 비유하자면 하나의 집합에 동일한 원소가 존재할 수 없는것 과 같은 원리.
관계 데이터 모델의 릴레이션에서는 하나 또는 여러개의 속성을 미리 선정 [ CHAR, INT, VARCHAR ] 해두고 이 속성 값을 투플마다 다르게 지정하여 투플의 유일성을 판단한다. 쇼핑몰에 가입할때 중복아이디가 금지된 경우.
이처럼 투플을 유일하게 구별하기 위해 선정되는 속성을 키key 라고 부른다. Ex ] 고객 데이터에서의 고객 아이디.
2. 투플의 무순서 : 하나의 릴레이션에서 투플 사이의 순서는 무의미하다.
DB는 위치를 이용한 참조가 아닌 내용 참조으로 검색되므로 투플의 순서는 중요하지 않다.
3. 속성의 무순서 : 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.
속성또한 릴레이션에서 위치가 아닌 속성의 이름으로 접근하므로 순서는 중요하지 않다.
4. 속성의 원자성 : 속성 값으로 원자 값만 사용할 수 있다. [ CHAR, INT, VARCHAR ] - 1칸에는 1개의 정보만
모든 속성 값은 더는 분해할 수 없는 하나의 값, 즉 원자 값만 가질 수 있다. 예를들어 고객 릴레이션에서 직업 속성에 [ 회사원, 학생 ] 같이 여러 개의 직업 속성을 포함하는 것은 데이터 모델의 릴레이션으로 적합하지 않다. 물론 현실에서는 직업이 둘 이상인 고객이 존재할 수 있지만 관계 데이터 모델은 이런 복잡한 개념을 배제. 단순한 구조로 정의하자는 특징이 있어서 다중값을 허용하지 않는다.
- 요약 -
- 투플은 중복 X
- 투플, 스키마에서 순서는 무의미
- 속성으로 1개의 정보값만 사용
3] 키의 종류
투플을 유일하게 구별하기 위해 모든 속성을 이용하는 것보다 일부 속성만 이용하는 것이 효율성을 높일 수 있다 [ 검색할때 ]. 릴레이션에 포함된 투플들을 유일하게 구별해주는 역활은 속성 또는 속성들의 집합인 키가 담당한다.
관계 데이터 모델에서는 키를 슈퍼키, 후보키, 기본키, 대체키, 외래키 다섯가지로 분류한다.
1.1 슈퍼키
슈퍼키는 유일성의 특성을 만족하는 키이다. 유일성은 키가 갖추어야 하는 기본 특성으로 같은 값을 가지는 키가 없도록 하는것이 유일성이다. 예를들어 고객 릴레이션에서 고객 아이디 속성은 투플마다 값이 달라야하므로 [ 중복 X ] 유일성을 가지고있고 그로인해 슈퍼키가 될 수 있다.
또한 고객 아이디를 포함하는 속성 집합 [ 고객 아이디, 고객 이름 ] 또한 모든 투플을 구별할 수 있으므로 슈퍼키가 될 수 있다. 근데 하나의 투플을 구별하기 위해 혹은 2개의 투플이 다름을 판단하기 위해 불필요한 속성 값까지 확인하는 비효율적인 작업이 필요한 경우도 있다. 그래서 반드시 필요한 속성의 집합만으로 투플을 구별할수 있도록 하는게 후보키 이다.
1.2 후보키
후보키는 유일성과 최소성을 만족하는 속성 또는 속성들의 집합이다. 최소성이란 반드시 필요한 최소한의 속성들로만 키를 구성한 것이며 하나의 속성으로 구성된 키는 최소성을 만족한다고 볼 수 있다.
예를들어 고객 이름 속성은 중복이 가능하므로 슈퍼키 [ 유일성 X ] 을 만족하지 않으며 후보키 [ 최소성 X ] 으로도 선택하지 않는것이 바람직하다.
1.3 기본키
릴레이션에서 투플을 구별하기 위해 여러 개의 후보키를 모두 사용할 필요가 없으며 이중에서 기본적으로 사용할 키를 반드시 하나 선택해야 하며 이것이 기본키 이다.
[ 고객 이름, 고객 주소 ] 속성 집합도 기본키가 될 수 있다. 같은 주소에 사는 가족이라도 이름은 같을 수 없기 때문에 또 [ 고객 아이디 ] 도 기본키가 될 수 있다. 이중에 더 적합한 속성 또는 속성의 집합을 기본키로 설정하면 된다. 기본키를 선택할때 고려해야하는 기준도 몇 가지 알아보자.
- 널 값을 가질 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
기본키는 투플의 식별과 원하는 투플을 찾기 위한 접근 방법을 제공하므로 매우 중요하다. 따라서 기본키가 널 값이 들어가는 투플은 기본키로 선택하지 않음이 좋다. 예를들어 [ 고객 이름, 고객 주소 ] 속성 집합에서 고객이 주소를 입력하지 않아도 되는 경우가 있기때문에 NULL값으로 저장될 수 있으며 이는 기본키로 선택하기에 부적합하다.
- 값이 자주 변경될 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
기본키는 NULL값을 허용하지 않으므로 이를 확인하는 작업이 필요한데 값이 자주 변경되는 속성으로 기본키를 선택하면 속성 값이 바뀔 떄마다 기본키 값으로 적합한지 여부를 판단해야 하므로 번거롭다. 그러므로 값이 고정되는 속성으로 기본키를 선택하는 것이 좋다. 예를들어 [ 고객 이름, 고객 주소 ] 속성 집합에서 고객 주소는 수정이, 즉 변경이 가능하므로 기본키로 선택하기에 부적합하다.
- 단순한 후보키를 기본키로 선택한다.
되도록이면 단순한 값을 후보키로 지정하며 그것을 기본키로 설정한다. 예를들어 [ 고객 아이디 ] 속성과 [ 고객 이름, 고객 주소 ] 후보키중에서 굳이 2개로 된 속성 집합보다는 [ 고객 아이디 ] 속성을 기본키로 선택하는게 적합하다.
1.4 외래키
외래키는 어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키다 [ 한마디로 다른 릴레이션에서 속성을 기본키로 참조하는 것 ]. 예를들어
주문 릴레이션 = 참조하는 릴레이션 // 고객 릴레이션 = 참조되는 릴레이션
외래키가 되는 속성과 기본키가 되는 속성의 이름은 달라도 된다. 하! 지! 만! 외래키 속성의 도메인과 참조되는 기본키 속성의 도메인은 반드시 같아야 한다 [ CHAR [기본키] = CHAR [외래키] ]
외래키가 기본키가 아닌 다른 속성을 참조한다면 투플을 유일하게 구별하기 힘들기 때문에 참조되는 릴레이션에서 관련 있는 투플을 검색하지 못할 수도 있다.
상담 릴레이션 [ 참조하는 릴레이션 ] 이 학생 릴레이션 [ 참조되는 릴레이션 ] 의 기본키인 학번과 교사 릴레이션 [ 참조되는 릴레이션 ] 의 기본키인 교사번호를 참조한다. 여기서 참조하는 릴레이션을 Child data라고 하고 참조되는 두 릴레이션을 Master data 라고 한다.
또한 외래키가 다른 릴레이션의 기본키를 참조하는 키라고 정의했지만 반드시 다른 릴레이션을 참조할 필요는 없다. 즉, 외래키 자신이 속한 릴레이션의 기본키를 참조하도록 외래키를 정의할 수도 있다.
Ex ] 추천고객 속성이 같은 릴레이션의 기본키인 고객 아이디를 참조하는 경우 => Recursive model
외래키는 기본키를 참조하지만 기본키와 다른 특징이 있다. 바로 널 값을 가질 수 있는데 기본키가 아니기 때문이다. 또한 기본키가 아니기 떄문에 중복이 가능하다. 다음으로 외래키에 제약이 존제하는데 알아보자.
4] 관계 데이터 모델의 제약
관계 데이터 모델에서 정의하고 있는 기본 제약 사항은 키와 관련한 무결성 제약조건 이다. 무결성이란 데이터에 결함이 없는 상태, 즉 데이터가 정확하고 유효하게 유지된 상태를 말한다. DB가 CRUD로 상태가 변하더라도 무결성 제약조건은 반드시 지켜져야 한다.
관계 데이터 모델이 기본으로 포함하고 있는 무결성 제약조건에는 개체 무결성 제약조건과 참조 무결성 제약조건이 있다. DB의 상태를 일관성 있게 유지하기 위해서는 두 가지를 모두 만족시켜야 한다.
무결성 제약조건 - 개체 무결성 제약조건 [ 기본키를 구성하는 모든 속성은 널 값을 가질 수 있다. ]
- 참조 무결성 제약조건 [ 외래키는 참조할 수 없는 값을 가질 수 없다. ]
개체 무결성 제약조건 [ Entity Integrity constraint ] 을 만족시키려면 새로운 투플이 삽입되는 연산과 기존 투플의 기본키 속성 값이 변경되는 연산이 발생할 때 기본키에 널 값이 포함되는 상황에서 연산의 수행을 거부하면 된다.
참조 무결성 제약조건 [ Referential Integrity constraint ] 이란 외래키는 참조할 수 없는 값을 가질 수 없다는 규칙이다. 외래키는 다른 릴레이션의 기본키를 참조하는 속성이고 릴레이션 간의 관계를 표현하는데 외래키가 참조하는 릴레이션의 기본키와 상관없는 값을 가지게 되면 두 릴레이션을 연관 시킬 수 없게된다.
그런데 예외로 외래키가 참조해야 할 값이 무엇인지 몰라 NULL값을 넣게 되는경우는 참조 무결성 제약조건을 위반하는 것으로 판단하며 안된다. 그저 참조해야할 값이 무엇인지 모를 뿐, 기본키에 존재하지 않는 속성으로 판단하기는 어렵기 때문이다.
[ 제약조건을 유의해야되는 경우, 예 ]
1. 참조되는 릴레이션에 투플을 추가할 경우
참조 무결성 제약조건은 위반하지 않지만 개체 무결성 제약조건을 위반하지 않도록 기본키 속성 값을 반드시 삽입해야한다.
2. 참조하는 릴레이션에 투플을 추가할 경우
이때는 참조 무결성 제약조건을 위반하지 않는지 확인해야 한다. 외래키가 참조하는 기본키의 속성값이 존재하지 않는 값일 경우에는 DBMS에서 이 수행작업을 거부한ㄷ.
3. 참조되는 릴레이션에 투플을 삭제할 경우
이는 참조 무결성 제약조건을 위반히자 않는경우에만 수행한다. 예를들어 참조되는 릴레이션의 기본키에서 A라는 투플을 삭재하게되면 참조하는 릴레이션의 외래키에서 참조하고있던 기본키 A가 존재하지 않는 참조값이되어 부정확한 데이터가 된다. 이처럼 연관된 투플이 참조하는 릴레이션 [ 외래키 ] 에 남아 있으면, 참조되는 릴레이션 [ 기본키 ] 을 삭제할 때 연관된 투플들을 함께 삭제하여 참조 무결성 제약조건을 만족시켜주어야 한다. 이 방법말고도 참조하는 속성 값을 널이나 기본 값 [DEFAULT] 값으로 지정하는 방법도 사용할 수 있다.
반면에 참조하는 릴레이션에 존재하는 투플을 삭제하는 것은 어떠한 제약조건도 위반하지 않는다.
'전공수업 > 데이터베이스 [DB]' 카테고리의 다른 글
ORACLE 오류 ] ORA - 12505 (0) | 2019.10.17 |
---|---|
제 6장] 관계 데이터 연산 (0) | 2019.10.17 |
제4장] 데이터를 모델링 해보자 (0) | 2019.10.14 |
제 3장] 데이터베이스 시스템 [정의, 구조, 구성] (0) | 2019.10.13 |
제 2장] 데이터베이스 관리 시스템 (0) | 2019.10.07 |