데이터베이스

Chap2. 관계 데이터 모델과 제약 조건

앞발로코딩 2023. 10. 1. 03:53

관계 데이터 모델 제안 목적

1. 데이터베이스 관리의 논리적인 면과 물리적인 면을 명확하게 구분하여 데이터 독립성 향상

2. 기존 데이터베이스 모델보다 단순한 구조

3. 한꺼번에 다수의 레코드들의 집합을 조작할 수 있는 기능을 제공

-> 프로그래머가 데이터베이스를 레코드 단위로 처리하지않음

4. 데이터베이스 관리 분야에서 튼튼한 이론적 근거를 제공

 

관계 데이터 모델의 역사

- IBM 연구소의 E.F. Codd가 1970년에 관계 데이터 모델을 제안함
- 관계 데이터 모델을 최초로 구현한 가장 중요한 관계 DBMS 시제품은 1970년 대에 IBM 연구소에서 개발된 System R
- 1980년대 후반부터 여러 가지 데이터 모델들이 새로 등장했지만 관계 DBMS는 여전히 가장 널리 사용되는 DBMS

관계 데이터베이스의 성공 요인 

- 바탕이 되는 데이터 구조로서 간단한 테이블(릴레이션: 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위(하나의 집합))을 사용

- 중첩된 복잡한 구조가 없음
- 집합 위주로 데이터를 처리
- 숙련되지 않은 사용자도 쉽게 이해할 수 있음
- 데이터베이스 응용에 대해 좋은 성능을 보임
- 다른 데이터 모델에 비해 이론이 잘 정립되었음

- 관계 데이터베이스 설계와 효율적인 질의 처리 면에서 뛰어난 장점을 가짐

 

2.1 관계 데이터 모델의 개념

관계 데이터 모델  =>  높은 데이터 독립성 제공

- 동일한 구조(릴레이션)의 관점에서 모든 데이터를 논리적으로 구성
- 선언적인 질의어를 통한 데이터 접근을 제공
- 응용 프로그램들은 데이터베이스 내의 레코드들의 어떠한 순서와도 무관하게 작성됨
- 사용자는 원하는 데이터(what)만 명시하고, 어떻게 이 데이터를 찾을 것인가(how)는 명시할 필요가 없음 (how를 명시하는 언어는 단계적 언어)
- 논리적으로 연관된 데이터를 연결하기 위해서 링크나 포인터를 사용하지 않음(집합(set)을 사용하므로 순서가 상관이 없다

 

 관계 데이터모델 용어
- 릴레이션(relation): 2차원의 테이블(스프레드 시트와 유사)
- 레코드(record): 릴레이션의 각 행
- 투플(tuple): 레코드를 좀더 공식적으로 부르는 용어
- 애트리뷰트(attribute): 릴레이션에서 이름을 가진 하나의 열
- 차수(degree) : 한 릴레이션 안에 있는 에트리뷰트 갯수 (최소 차수는 1, 자주 바뀌지않음)
- 카디날리티(cardinality): 한 릴레이션에서 튜플의 갯수 (최소 카디날리티는 0, 시간이 지남에 따라 변화)
- 널값(null value): 알려지지 않음 또는 적용할 수 없음 나타내기 위해 널값을 사용(0이나 공백문자나 공백문자열과는 다른것, DBMS마다 널값을 나타내는 기호가 다르다)
- 릴레이션 스키마(relation schema): 릴레이션의 이름과 릴레이션의 애트리뷰트들의 집합(내연)
- 도메인(domain) : 애트리뷰트에 나타날 수 있는 값들의 집합
- 릴레이션 인스턴스(relation instance) : 릴레이션에 어느 시점에 들어 있는 투플들의 집합(외연)
- 관계 데이터베이스(relational database) 스키마 (하나 이상의 릴레이션 스키마들로 이루어짐)
- 관계 데이터베이스 인스턴스 (릴레이션 인스턴스들의 모임으로 구성됨)
 
도메인
- 각 애트리뷰트의 도메인의 값들은 원자값
- 프로그래밍 언어의 데이터 타입과 유사함
- 동일한 도메인이 여러 애트리뷰트에서 사용될 수 있음
- 복합 애트리뷰트나 다치 애트리뷰트는 허용되지 않음
- 의미있는 연산만 허용
- 의미있는 릴레이션들의 합집합 교집합 차집합만 허용
도메인 정의 SQL

릴레이션 스키마(relation schema)

- 릴레이션을 위한 틀(framework)

=> 표기법

  릴레이션이름(애트리뷰트1, 애트리뷰트2, ... 애트리뷰트N)

- 기본 키 애트리뷰트에는 밑줄 표시
- 내포(intension)라고 함
 
 
릴레이션 인스턴스(relation instance)
- 시간의 흐름에 따라 계속 변함
- 일반적으로 릴레이션에는 현재의 인스턴스만 저장됨
- 외연(extension)이라고 함

 

관계 데이터 베이스 스키마

관계 데이터 베이스 인스턴스

2.2 릴레이션의 특성

- 각 릴레이션은 오직 하나의 레코드 타입만 포함
- 애트리뷰트 내의 값들은 모두 같은 유형
- 애트리뷰트, 투플들의 순서는 중요하지 않음(집합, 즉 set이니까)
- 동일한 투플이 두 개 이상 존재하지 않음
-> 키가 존재함
- 한 투플의 각 애트리뷰트는 원자값을 가짐
- 각 애트리뷰트의 이름은 한 릴레이션 내에서만 고유함
 

 

2.3 릴레이션의 키

릴레이션의 키 : 투플을 고유하게 식별할 수 있는 하나 이상의 애트리뷰트들의 모임

종류 : 수퍼 키(superkey), 후보 키(candidate key), 기본 키(primary key), 대체 키(alternate key), 외래 키(foreign key)

 

수퍼 키

: 한 릴레이션 내의 특정 투플을 고유하게 식별하는 하나의 애트리뷰트 또는 애트리뷰트들의 집합

- 투플들을 고유하게 식별하는데 꼭 필요하지 않은 애트리뷰트들을 포함할 수 있음

 

후보 키

: 각 투플을 고유하게 식별하는 최소한의 애트리뷰트들의 모임

- 모든 릴레이션에는 최소한 한 개 이상의 후보 키가 있음

- 후보 키도 두 개 이상의 애트리뷰트로 이루어질 수 있으며 이런 경우에 복합 키(composite key)라고 부름
아래 표의 학번과 과목번호가 복합키

 

문제) 이름이 후보키가 될수있나? 이메일이 후보키가 될수있나?

답) 학생의 이름은 일반적으로 고유하지않으므로 후보키가 될 수 없음, 인터넷 상에서 모든 이메일 주소는 고유하므로 후보키가 될 수 있음

 

기본 키(PK, Primary key)

: 릴레이션에 후보 키가 두 개 이상 있으면 설계자 또는 데이터베이스 관리자가 이들 중에서 하나를 기본 키로 선정함

EX) 신용카드 회사의 고객 릴레이션에서 신용카드번호와 주민등록번호가 후보 키가 될 수 있음. 이 중에서 신용카드 번호를 기본 키로 선정

=> 자연스러운 기본 키를 찾을 수 없는 경우에는 레코드 번호와 같이 종종 인위적인 키 애트리뷰트를 릴레이션에 추가할 수 있음

 

대체 키(AK, Alternate Key)

: 기본 키가 아닌 후보키

EX) 위 신용카드 회사 사례에서는 주민등록번호가 대체키가 됨

 

 

 

외래 키(FK, Foreign Key)

: 어떤 릴레이션의 기본 키를 참조하는 애트리뷰트

- 관계 데이터베이스에서 릴레이션들 간의 관계를 나타내기 위해서 사용됨

- 외래 키 애트리뷰트는 참조되는 릴레이션의 기본 키와 동일한 도메인을 가져야 함

- 자신이 속한 릴레이션의 기본 키의 구성요소가 되거나 되지 않을 수 있음

 

 

외래 키의 유형

- 다른 릴레이션의 기본 키를 참조하는 외래 키

- 자체 릴레이션의 기본 키를 참조하는 외래 키

- 기본 키의 구성요소가 되는 외래 키

 

2.4 무결성 제약조건(Integrity Constraint)

무결성 제약 조건 : 데이터의 정확성 또는 유효성, 일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적으로 또는 명시적으로 정의함

- 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없음

 

무결성 제약 조건의 특징

- 스키마의 한 부분

- 데이터베이스의 상태(또는 상태들의 순서)에 대한 제한

- DBMS가 시행

- 릴레이션 내의 무결성 제약 조건 : 오직 한 릴레이션만 포함

=> 릴레이션 스키마의 한 부분

- 릴레이션 사이의 무결성 제약 조건 : 여러 릴레이션을 포함

=> 릴레이션 스키마 또는 데이터베이스 스키마의 한 부분

 

무결성 제약조건 예시

무결성 제약조건의 종류

- 도메인 제약조건(domain constraint)

- 키 제약조건(key constraint)

- 기본 키와 엔티티 무결성 제약조건(entity integrity constraint)

- 외래 키와 참조 무결성 제약조건(referential integrity constraint)

 

도메인 제약조건(domain constraint)

- 각 애트리뷰트 값이 반드시 원자값이어야 함

- 애트리뷰트 값의 디폴트 값, 가능한 값들의 범위 등을 지정할 수 있음

- 데이터 형식을 통해 값들의 유형을 제한하고, CHECK 제약 조건을 통해 값들의 범위를 제한할 수 있음

- SQL2는 도메인을 명시적으로 정의하는 것을 허용하지만, 오라클은 지원하지 않음

 

키 제약조건(key constraint)

- 키 애트리뷰트에 중복된 값이 존재해서는 안됨

 

기본 키와 엔티티 무결성 제약조건(entity integrity constraint)

- 릴레이션의 기본 키를 구성하는 어떤 애트리뷰트도 널값을 가질 수 없음

- 대체 키에는 적용되지 않음(PK(기본키)에만 적용된다)

- 사용자는 릴레이션을 생성하는 데이터 정의문에서 어떤 애트리뷰트가 릴레이션의 기본 키의 구성요소인가를 DBMS에게 알려줌

 

외래 키와 참조 무결성 제약조건(referential integrity constraint)

- 참조 무결성 제약조건은 두 릴레이션의 연관된 투플들 사이의 일관성을 유지하는데 사용됨

- 관계 데이터베이스가 릴레이션들로만 이루어지고, 릴레이션 사이의 관계들이 다른 릴레이션의 기본 키를 참조하는 것을 기반으로 하여 묵시적으로 표현되기 때문에 외래 키의 개념이 중요

- 릴레이션 R2의 외래 키가 릴레이션 R1의 기본 키를 참조할 때 참조 무결성 제약조건은 아래의 두 조건 중 하나가 성립되면 만족됨

    => 외래 키의 값은 R1의 어떤 투플의 기본 키 값과 같다

    => 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않으면 널값을 가질 수 있음

무결성 제약조건의 유지
- 데이터베이스에 대한 갱신 연산은 삽입 연산, 삭제 연산, 수정 연산으로 구분함
- DBMS는 각각의 갱신 연산에 대하여 데이터베이스가 무결성 제약조건들을 만족하도록 필요한 조치를 취함
- DBMS는 외래 키가 갱신되거나, 참조된 기본 키가 갱신되었을 때 참조 무결성 제약조건이 위배되지 않도록 해야
- EMPLOYEE 릴레이션의 DNO 애트리뷰트가 DEPARTMENT 릴레이션의 기본 키인 DEPTNO를 참조하는 외래 키이므로, DEPARTMENT를 참조된 릴레이션, EMPLOYEE를 참조하는 릴레이션으로 부르기로 함
=> 받는 쪽 : 참조된, 주는 쪽 : 참조하는

1. 삽입

- 참조되는 릴레이션( DEPARTMENT )에 새로운 투플이 삽입되면 참조 무결성 제약조건은 위배되지 않음

- DEPARTMENT에 새로 삽입되는 투플의 기본 키 애트리뷰트의 값에 따라서는 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건 등을 위배할 수 있음

- 참조하는 릴레이션(EMPLOYEE)에 새로운 투플을 삽입할 때는 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건 외에 참조 무결성 제약조건도 위배할 수 있음

 

2. 삭제

- 참조하는 릴레이션에서 투플이 삭제되면 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건, 참조 무결성 제약조건 등 모든 제약조건을 위배하지 않음

- 참조되는 릴레이션에서 투플이 삭제되면 참조 무결성 제약조건을 위배하는 경우가 생기거나 생기지 않을 수 있음

EX) DEPARTMENT 릴레이션에서 네 번째 투플인 (4, 홍보, 8)을 삭제 => 위배X, DEPARTMENT 릴레이션에서 세 번째 투플인 (3, 개발, 9)를 삭제 => 위배O

 

참조 무결성 제약조건을 만족시키기 위해서 DBMS가 제공하는 옵션

제한(restricted)

- 위배를 야기한 연산을 단순히 거절

EX) DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 참조 무결성 제약조건을 위배하게 되므로 삭제 연산을 거절

연쇄(cascade)

- 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서투플을 참조하는 투플들도 함께 삭제

EX) DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째 투플과 다섯 번째 투플도 함께 삭제

널값(nullify)
- 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서투플을 참조하는 투플들의 외래 키에 널값을 삽입
EX) DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째 투플과 다섯 번째 투플의 부서번호에 널값을 삽입
디폴트값
- 널값을 넣는 대신에 디폴트값을 넣는다는 것을 제외하고는 바로 위의 옵션과 비슷함

 

3. 수정

- DBMS는 수정하는 애트리뷰트가 기본 키인지 외래 키인지 검사함

- 수정하려는 애트리뷰트가 기본 키도 아니고 외래 키도 아니면 수정 연산이 참조 무결성 제약조건을 위배하지 않음

- 기본 키나 외래 키를 수정하는 것은 하나의 투플을 삭제하고 새로운 투플을 그 자리에 삽입하는 것과 유사하므로, 삽입 및 삭제에서 설명한 제한, 연쇄, 널값, 디폴트값 규칙이 수정 연산에도 적용됨