데이터베이스 개론 복습 - 5 -
관계데이터 모델의 기본 용어
일반적으로 관계 데이터 모델에서는 하나의 개체에 관한 데이터를 릴레이션 하나에 담아 데이터베이스에 저장한다

속성(Attribute)
릴레이션의 열을 속성 또는 애트리뷰트(Attribute)라고 부른다.
각 속성은 서로 다른 이름을 이용해 구별한다. 릴레이션은 파일 관리 시스템의 파일, 속성은 해당 파일의 필드에 대응하는 개념이다.
투플(Tuple)
릴레이션의 행을 투플(Tuple) 이라 부른다.
투플은 파일 관리 시스템 관점에서 해당 파일의 레코드에 대응하는 개념이다.
도메인(Domain)
속성 하나가 가질 수 있는 모든 값의 집합을 해당 속성의 도메인(Domain)이라 한다. 관계 데이터 모델에서는 더는 분해할 수 없는 원자 값만 속성값으로 사용할 수 있다. 그래서 도메인을 특정 속성이 가질 수 있는 모든 원자값의 모임이라고도 정의 한다.
등급 속성의 도메인을 정의해두면 사용자가 속성 값을 입력하거나 수정할 때 데이터베이스 시스템이 적합성을 판단하여 네가지 이외의 값은 허용하지않음으로써 항상 올바른 값만 유지할 수 있다는 장점이 있다.
일반적으로 속성의 특성을 고려한 데이터 타입으로 정의한다.
데이터 타입을 도메인, 변수를 속성으로 생각하면 이해하기 쉽다.
널값(Null)
릴레이션에 있는 특정 투플의 속성 값을 모르거나, 적합한 값이 없는 경우에는 널(Null)이라는 특별한 값을 사용할 수 있다. 널 값은 특정 속성에 해당하는 값이 없음을 나타내므로 0이나 공백 문자와는 다르다.
차수(Degree)
하나의 릴레이션에서 속성의 전체 개수를 릴레이션의 차수(Degree)라고한다. 모든 릴레이션은 최소 1이상의 차수를 유지해야하며, 일반적으로 자주 변하지않는다는 정적인 특징이 있다.
카디널리티(Cardinality)
하나의 릴레이션에서 투플의 전체 개수를 릴레이션의 카디널리티(Cardinality) 라고한다.
투플이 없는 릴레이션이 존재할 수 있으며, 새로운 투플이 계속 삽입되거나 기존 투플이 삭제될 수 있으므로 릴레이션의 카디널리티는 일반적으로 자주 변한다는 동적인 특징이 있다.

릴레이션 스키마(Relation schema)
릴레이션 스키마(Relation schema)는 릴레이션의 이름과 릴레이션에 포함된 모든 속성의 이름으로 정의하는 릴레이션의 논리적 구조다.
릴레이션 스키마는 데이터베이스 관리 시스템이 내부적으로 데이터 정의어를 이용해 정의하지만, 일반적으로 다음과 같은 형태로 쉽게 표현한다.
릴레이션이름(속성이름1, 속성이름2, ... , 속성이름n)
릴레이션 스키마는 릴레이션 내포 라고도 부른다.
릴레이션 인스턴스(Relation instance)
릴레이션 인스턴스는 어느 한 시점에 릴레이션에 존재하는 투플들의 집합이다.
릴레이션 외연 이라고도 부른다 집의 전체 구조는 자주 바뀌지 않지만, 집에 사는 사람은 수시로 바뀔 수 있다. 이처럼 논리적 구조를 정의하는 릴레이션 스키마는 자주 변하지않는다는 정적인 특징이 있는 반면, 릴레이션 인스턴스는 투플의 삽입, 삭제, 수정이 자주 발생한다는 동적인 특징이 있다.(신규 회원가입, 회원 탈퇴 등)
데이터베이스 스키마와 데이터베이스 인스턴스
일반적으로 데이터베이스는 릴레이션 여러개로 구성된다.
데이터베이스 스키마는 데이터베이스를 구성하는 릴레이션들의 스키마를 모아놓은 것이다 즉, 특정 데이터베이스 스키마를 설계한다는 것은 필요한 모든 릴레이션의 스키마를 모두 정의한다는 뜻이다. 데이터 베이스 인스턴스는 어느 한 시점에서 데이터베이스에 저장된 데이터 내용의 전체 집합을 의미한다. 즉 , 데이터베이스를 구성하는 모든 릴레이션의 인스턴스를 모아놓은 것이다.

릴레이션의 특성
① 투플의 유일성 : 하나의 릴레이션에는 동일한 투플이 존재할 수 없다.
하나의 릴레이션에 똑같은 투플이 있으면 안되고, 모든 투플에는 다른 투플과 구별되는 유일한 특성이 있어야한다
② 투플의 무순서 : 하나의 릴레이션에서 투플 사이의 순서는 무의미하다
데이터베이스에서는 위치가 아닌 내용으로 검색되므로 투플의 순서는 중요하지않다. 효율적인 처리를 위해 투플의 순서를 임의로 바꾸기도 한다.
③ 속성의 무순서 : 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.
예를 들어 '고객(고객아이디, 고객이름, 나이)' 으로 표현된 릴레이션 스키마와 '고객(나이, 고객아이디, 고객이름)'로 표현된 릴레이션 스키마는 동일하므로 두 릴레이션은 같다.
속성값은 릴레이션에서 위치가 아닌 속성의 이름으로 접근하므로 하나의 릴레이션에는 이름이 같은 속성이 존재할 수 없고, 이름도 속성의 의미가 명확히 드러나는것으로 사용하는것이 좋다.
④ 속성의 원자성 : 속성 값으로 원자값만 사용할 수 있다.
모든 속성 값은 더는 분해할 수 없는 하나의 값, 즉 원자 값만 가질 수 있다. 다시 말해 하나의 속성은 여러개의 값, 즉 다중 값을 가질 수 없다. 예를 들어 아래의 그림을 보면, 고객 릴레이션은 (회사원, 학생) 같이 값이 여러개인 직업 속성을 포함하므로 관계 데이터 모델의 릴레이션으로 적합하지않다. 물론 현실에서는 직업이 둘 이상인 고객이 존재할 수 있지만, 관계 데이터 모델은 이런 복잡한 개념을 배제하고, 릴레이션을 단순한 구조로 정의하고자 하는 특징이 있어 다중 값을 허용하지않는다.

키의 종류
투플을 유일하게 구별하기위해 모든 속성을 이용하는 것보다 일부 속성만 이용하는 것이 효율성을 높일 수 있다. 릴레이션에 포함된 투플들을 유일하게 구별해주는 역할은 속성 또는 속성들의 집합인 키가 담당한다. 키는 관계 데이터 모델에서 중요한 제약조건을 정의한다. 관계 데이터 모델에서는 키를 슈퍼키, 후보키, 기본키, 대체키, 외래키의 다섯가지로 분류할 수 있다.

슈퍼키(Super key)
슈퍼키는 유일성의 특성을 만족하는 속성 또는 속성들의 집합이다.
유일성은 키가 갖추어야하는 기본 특성으로 하나의 릴레이션에 키로 지정된 속성값은 투플마다 달라야 한다는 의미다.
대표적으로 고객 아이디 속성은 모든 고객 투플마다 값이 달라야하고, 이를 통해 다른 투플과 유일하게 구별할 수 있으므로 슈퍼키가 될 수 있다.
고객 이름 속성은 같은 이름의 고객이 얼마든지 존재할 수 있으므로 고객 이름 속성만으로는 슈퍼키가 될 수 없다.
반면에 (고객 아이디, 고객 이름) 으로 구성된 속성 집합의 경우 고객 아이디 속성 만으로도 모든 투플을 구별할 수 있으므로, 고객아이디와 고객이름 속성값의 조합도 유일성을 만족한다. (고객아이디, 고객이름) 속성 집합도 슈퍼키가 될 수 있으며, 고객 아이디를 포함하는 속성 집합은 모두 슈퍼키가 될 수 있다.
(고객아이디, 고객이름)과 같이 슈퍼키 중에는 투플 하나를 유일하게 구별하기위해서 또는 2개의 투플이 서로 다름을 판단하기 위해 불필요한 속성 값까지 확인하는 비효율적인 작업이 요구되는 경우도 있다.
후보키(Candidate key)
후보키는 유일성과 최소성을 만족하는 속성 또는 속성들의 집합이다. 최소성은 꼭 필요한 최소한의 속성들로만 키를 구성하는 특성이다. 위에서 언급했던 (고객아이디, 고객이름)은 후보키가 될 수 없다. 고객 이름 속성이 없어도 고객 아이디 속성만으로 유일성을 만족할 수 있기 때문이다.
후보키가 되기위해 만족해야하는 유일성과 최소성의 특성은 새로운 투플이 삽입되거나 기존 투플의 속성값이 바뀌어도 유지되어야한다. 그리고 후보키를 선정할 때는 현재의 릴레이션 내용, 즉 릴레이션 인스턴스만 보고 유일성과 최소성을 판단해서는 안된다.
기본키(Primary key)
릴레이션에서 투플을 구별하기위해 여러개의 후보키를 사용할 필요는 없다.
여러 후보키 중에서 기본적으로 사용할 키를 반드시 선택해야하는데, 이것이 기본키다. 후보키가 여러개 존재할 경우 데이터 베이스 사용환경을 고려하여 적합한것을 기본키로 선택해야한다.

위의 릴레이션에서는 고객 아이디 속성만 후보키이기 때문에 자연스럽게 고객아이디 속성이 기본키가 된다.
선택한 기본키는 속성 이름에 밑줄을 그어 표현한다.

위의 그림과 같이 고객 릴레이션에 주소 속성이 추가된다면 고객 아이디 속성과 함께 (고객 이름, 주소) 속성 집합도 후보키가 될 수 있다. 일반적으로 같이 사는 가족의 주소는 같더라도 이름까지 같은 경우는 없기때문이다.
기본키를 선택할때 고려하면 도움이 되는 기준들
◆ 널 값을 가질 수 있는 속성이 포함된 후보키는 기본키로 부적합하다
기본키는 투플을 식별할 뿐만 아니라, 릴레이션에서 원하는 투플을 찾기 위한 기본 접근 방법을 제공하므로 매우 중요하다. 기본키가 널 값인 투플은 다른 투플들과 구별하여 접근하기 어려우므로 널 값을 가질 수 있는 가능성이 있는 키는 기본키로 선택하지않는 것이 좋다.
◆ 값이 자주 변경될 수 있는 속성이 포함된 후보키는 기본키로 부적합하다
기본키는 다른 투플과 구별되는 값을 가지고, 널 값은 허용하지않으므로 이를 확인하는 작업이 필요하다. 그런데 값이 자주 변경되는 속성으로 구성된 후보키를 기본키로 선택하면 속성 값이 바뀔때 마다 기본키 값으로 적합한지 여부를 판단해야하므로 번거롭다.
◆ 단순한 후보키를 기본키로 선택한다.
단순한 후보키란 자릿수가 적은 정수나 단순 문자열인 속성으로 구성되거나, 구성하는 속성의 개수가 적은 후보키다
기본키 선정 과정은 대학에서 학생회장을 선발하는 과정과 유사하다. 대학에 다니는 학생들(슈퍼키) 중에서 학생회장이 될만한 자격을 갖춘 후보 학생(후보키)을 추천한 다음, 지지를 가장 많이 받은 한명의 학생(기본키)을 학생회장으로 임명하는 과정으로 이해하면 쉽다.
대체키(Alternate key)
대체키는 기본키로 선택되지 못한 후보키들이다.

키의 관계
외래키(Foreign key)
외래키는 어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키다. 다시 말해, 다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합이 외래키다.

인터넷 쇼핑몰을 위한 데이터베이스에서 고객 릴레이션과 주문 릴레이션의 관계를 생각해보면 된다. 고객 릴레이션은 속성이 6개 이고, 고객 아이디 속성이 기본키다. 주문 릴레이션은 속성이 6개이고, 주문번호 속성이 기본키다. 여기서 주문 릴레이션의 주문고객 속성이 고객 릴레이션의 기본키인 고객아이디 속성을 참조하면 주문고객 속성을 외래키 라고 한다. 외래키를 통해 고객 릴레이션과 주문 릴레이션이 관계를 맺어, 주문 릴레이션의 투플과 연관성 있는 고객 릴레이션의 투플을 연결시킬 수 있다. 일반적으로 주문 릴레이션과 같이 외래키를 가진 릴레이션을 '참조하는 릴레이션' 고객 릴레이션과 같이 기본키를 가진 릴레이션을 '참조되는 릴레이션' 이라고 한다.
외래키는 반드시 다른 릴레이션의 기본키를 참조해야하며, 외래키의 도메인은 참조되는 기본키와 같게 정의되어야한다.

하나의 릴레이션에는 외래키가 여러개 존재할 수 있으며, 외래키를 기본키로 사용할 수도 있고, 외래키를 포함하여 기본키로 구성할 수도 있다.

고객 릴레이션은 고객아이디 속성이 기본키다. 그리고 추천고객 속성은 추천한 고객의 아이디를 의미하므로 같은 릴레이션의 고객아이디 , 즉 기본키를 참조하는 외래키다.
외래키는 기본키를 참조하지만, 기본키가 아니기때문에 널 값을 가질 수 있다. 또한 외래키는 기본키가 아니기때문에 서로 다른 투플이 같은 값을 가질 수 있는 것 이다.
관계데이터 모델의 제약
관계 데이터 모델에서 정의하고 있는 기본 제약 사항은 키와 관련한 무결성 제약조건이다.
무결성 제약조건은 개체 무결성 제약조건과 참조 무결성 제약조건이 있다.
개체 무결성 제약조건
개체 무결성 제약조건은 기본키를 구성하는 모든 속성은 널 값을 가지면 안된다는 규칙이다.
관계 데이터 모델에서는 릴레이션에 포함된 투플들을 유일하게 구별해주고, 각 투플에 쉽게 접근할 수 있도록 릴레이션마다 기본키를 정의한다. 그런데 기본키를 구성하는 속성 전체나 일부가 널 값이 되면, 투플의 유일성을 판단할 수 없어 기본키의 본래 목적을 상실하게 된다.
다음 그림의 고객 릴레이션에서 김미영과 김지영 고객 투플에서 기본키인 고객 아이디 속성의 값이 널이다. 널 값은 아직 결정되지않았거나, 모르는 값을 의미하기 때문에 이 경우에는 홍길동 고객과 민소희 고객의 아이디가 다른 고객의 아이디와 다른지를 판단하기 어렵다. 또한 둘 다 고객아이디 속성의 값이 널이지만, 두 고객의 아이디가 같다고 판단할 수도 없다.

개체 무결성 제약조건을 위반한 릴레이션
참조 무결성 제약조건
참조 무결성 제약조건이란 외래키는 참조할 수 없는 값을 가질 수 없다는 규칙이다.
외래키는 다른 릴레이션의 기본키를 참조하는 속성이고, 릴레이션 간의 관계를 표현하는 역할을 한다. 그런데 외래키가 자신이 참조하는 릴레이션의 기본키와 상관이 없는 값을 가지게되면 두 릴레이션을 연관시킬 수 없으므로 본래의 의미가 없어진다.
그러므로 외래키는 자신이 참조하는 릴레이션에 기본키 값으로 존재하는 값, 즉 참조 가능한 값만 가져야한다.

참조 무결성 제약조건 위반의 예
외래키가 널 값인 경우는 무조건 참조 무결성 제약조건을 위반했다고 판단해야할까? 그렇지 않다.
주문 고객 속성 값이 널이라는 것은 주문한 고객이 누군인지 모를 뿐, 고객 릴레이션에 존재하지않는 고객이 주문한 것으로 판단하기는 어렵기때문이다. 그러므로 참조 무결성 제약조건을 만족시키려면 외래키 참조 가능한 값만 가져야하지만, 널 값을 가진다고해서 참조 무결성 제약 조건을 위반한 것으로 판단해서는 안된다.

데이터베이스 상태가 빈번하게 변경되는 경우 참조 무결성 제약조건을 계속 만족시키기가 쉽지않다. 하지만 다행히도 이러한 작업은 데이터베이스 관리 시스템이 자동으로 수행한다. 사용자는 새로운 릴레이션을 생성할 때 마다 어떤 속성들이 외래키이고, 어떤 릴레이션의 기본키를 참조하면 되는지 데이터베이스 관리 시스템에 알려주면 된다. 그리고 참조 무결성 제약조건을 위반하게되는 경우 원하는 처리 방법도 알려주면 된다.