본문 바로가기
데이터 [Data]/데이터베이스론

데이터베이스론 보고서 15 : 무결성 제약 조건

by 냉철하마 2021. 7. 22.

자료출처: MS SQL 기반 데이터베이스 배움터 (생능출판사) http://www.yes24.com/Product/Goods/7489842

 

데이터베이스 배움터 - YES24

이론과 실무가 조화된 최적의 데이터베이스 책데이터베이스를 제대로 활용하는 데 반드시 필요한 데이터베이스의 기본적인 개념 및 이론을 이해하기 쉽게 설명한 책이다. 이와 함께 활용 기술

www.yes24.com

  

  데이터 무결성(data integrity)은 데이터의 정확성 또는 유효성을 의미하는 것으로, 일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적으로 또는 명시적으로 정의한다. 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없다. 이러한 무결성 제약 조건에는 여러 종류가 있는데, 도메인 제약 조건(domain constraint), 키 제약조건(key constraint), 기본 키와 엔티티 무결성 제약조건(entity integrity constraint), 외래 키와 참조 무결성 제약조건(referential integrity constraint) 등이 이에 해당한다.

  도메인 제약 조건이란 가장 간단한 형태의 제약조건으로 각 애트리뷰트 값이 반드시 원자값이어야 하며, 데이터 형식을 통해 값들의 유형(정수형, 실수형, 문자형 등)을 제한하고, 애트리뷰트의 디폴트 값이나 가능한 값들의 범위를 지정할 수 있으며, CHECK 제약 조건을 통해 값들의 범위를 제한할 수 있다. SQL2에서는 도메인을 명시적으로 정의하는 것을 허용하지만 오라클에서는 이를 지원하지 않는다. 키 제약조건은 키 애트리뷰트에 중복된 값이 존재해서는 안 된다는 것이다. , 릴레이션을 정의할 때 기본 키로 정의하거나 UNIQUE를 명시한 애트리뷰트에는 중복된 값이 허용되지 않는다.

  기본 키와 엔티티 무결성 제약조건은 두 개 이상의 투플이 동일한 기본 키 값을 가질 수 없다는 것으로, 기본 키를 구성하는 애트리뷰트가 널값을 가지면 투플들을 고유하게 식별할 수 없게 되므로 엔티티 무결성 제약조건은 릴레이션의 기본 키를 구성하는 어떤 애트리뷰트도 널값을 가질 수 없게 한다. 이 제약조건은 대체 키에는 적용되지 않는다. 기본 키에 널값이 생기도록 하는 갱신 연산을 DBMS가 거절해야 하므로 DBMS는 어떤 애트리뷰트가 해당 릴레이션의 기본 키인지 알고 있어야 한다. 따라서 사용자는 릴레이션을 생성하는 데이터 정의문에서 어떤 애트리뷰트가 릴레이션의 기본 키의 구성요소인가를 DBMS에게 알려줘야 한다.

  외래 키와 참조 무결성 제약조건은 두 릴레이션의 연관된 투플들 사이의 일관성을 유지하는 데 사용된다. 관계 데이터베이스가 릴레이션들로만 이뤄지고 릴레이션 사이의 관계들이 다른 릴레이션의 기본 키를 참조하는 것을 기반으로 하여 묵시적으로 표현되기 때문에 외래 키의 개념이 보다 중요해진다. 우측 예시를 보면, 릴레이션 R2의 외래 키가 릴레이션 R1의 기본 키를 참조할 때, 참조 무결성 제약조건은 외래 키의 값은 R1의 어떤 투플의 기본 키 값과 같다.’ 또는 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않으면 널값을 가진다.’라는 두 조건 중 하나가 성립되면 만족한다.

  데이터베이스가 위와 같은 모든 무결성 제약조건을 만족한다고 가정하면 데이터베이스에 대한 검색 연산의 수행 결과는 아무런 제약조건을 위배하지 않는다. 그러나 갱신 연산의 수행 결과에 따라서는 무결성 제약 조건이 위배될 수도 있다. 여기서 갱신 연산은 삽입 연산, 삭제 연산, 수정 연산으로 구분하는데, DBMS는 각각의 갱신 연산에 대해서 무결성 제약조건을 만족하도록 필요한 조치를 취한다. DBMS는 외래 키가 갱신되거나 참조된 기본 키가 갱신되었을 때, 참조 무결성 제약조건의 위배되지 않도록 해야 한다.

  아래 예시에서 EMPLOYEE 릴레이션의 DNO 애트리뷰트가 DEPARTMENT 릴레이션의 기본 키인 DEPTNO를 참조하는 외래 키이므로, DEPARTMENT를 참조되는 릴레이션, EMPLOYEE를 참조하는 릴레이션으로 부른다.

  삽입 연산에서는 참조되는 릴레이션에 새로운 투플이 삽입되면 참조 무결성 제약조건은 위배되지 않는데, 이는 참조하는 릴레이션의 기존 투플들이 참조되는 릴레이션에 추가되는 투플들과 아무런 연관을 갖지 않기 때문이다. 그러나 참조되는 릴레이션 DEPARTMENT에 새로 삽입되는 투플의 기본 키 애트리뷰트의 값에 따라서는 도메인 제약 조건, 키 제약 조건, 엔티티 무결성 제약조건 등을 위배할 수 있다. 예를 들어, DEPARTMENT 릴레이션에 (3, 총무, 9) 투플을 삽입하면, 이미 DEPARTMENT 릴레이션에 부서번호가 3인 투플이 존재하므로 키 제약 조건을 위배하게 된다. 부서번호가 널값은 투플을 삽입하면 엔티티 무결성 제약조건을 위배하고 부서이름에 숫자가 들어있는 투플을 삽입하면 도메인 제약조건을 위배하게 된다. 이러한 제약조건을 위배하는 삽입 연산은 DBMS가 거절함으로써 데이터베이스의 무결성을 유지한다. 한편 참조하는 릴레이션 EMPLOYEE에 새로운 투플을 삽입할 때는 도메인 제약조건, 키 제약조건, 엔티티 제약조건 외에 참조 무결성 제약조건도 위배할 수 있다. 예를 들어, EMPLOYEE 릴레이션에 (4325, 오혜원, 6)이라는 투플을 삽입하면 부서번호가 6인 투플이 DEPARTMENET 릴레이션에 존재하지 않기 때문에 참조 무결성 제약조건을 위배하게 된다. 이러한 삽입 연산 역시 DBMS가 거절하게 된다.

  삭제 연산에서는 참조하는 릴레이션에서 투플이 삭제되면 모든 제약조건을 위배하지 않는다. EMPLOYEE 릴레이션의 두 번째 투플인 (3426, 박영권, 3)을 삭제해도 아무런 제약조건을 위배하지 않는 것이 그 예시이다. 그러나 참조되는 릴레이션에서 투플이 삭제되면 참조 무결성 제약조건을 위배하는 경우가 생길 수도 있다. 예를 들어 DEPARTMENT 릴레이션의 세 번째 투플인 (3, 개발, 9)를 삭제하면 EMPLOYEE 릴레이션에서 부서번호 3에 속한 두 번째 투플 (3426, 박영권, 3)과 다섯 번째 투플 (3427, 최종철, 3)은 더 이상 존재하지 않는 부서번호를 참조하게 되므로 참조 무결성 제약조건을 위배하게 된다. 참조 무결성 제약조건을 만족시키기 위해 DBMS는 몇 가지 옵션을 제공하는데, 이러한 옵션의 선택은 응용의 의미에 의존한다. 릴레이션을 정의할 때 데이터베이스 설계자 또는 데이터베이스 관리자가 이 중에서 한 가지 옵션을 명시한다. 제한(restricted), 연쇄(cascade), 널값(nullify), 디폴트값이다.

  제한이란 위배를 야기한 연산을 단순히 거절하는 것이다. 위와 같이 DEPARTMENT 릴레이션에서 세 번째 투플인 (3, 개발, 9)를 삭제하면 참조 무결성 제약조건을 위배하게 되므로, 삭제 연산을 거절하는 것이다. 연쇄란 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들도 함께 삭제한다. DEPARTMENT 릴레이션에서 세 번째 투플인 (3, 개발, 9)를 삭제하면 삭제 연산만 거절하는 제한과는 달리, DEPARTMENT(3, 개발, 9) 투플을 삭제할 뿐만 아니라 연쇄적으로 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째 투플과 다섯 번째 투플도 함께 삭제하는 것이다.

  널값이란 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들의 외래 키에 널값을 삽입하는 옵션이다. DEPARTMENT 릴레이션에서 세 번째 투플인 (3, 개발, 9)를 삭제하기 위해 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째와 다섯 번째 투플의 부서번호에 NULL값을 삽입하는 방식이다. 디폴트값은 널값 대신에 디폴트 값을 넣는 옵션이다.

  수정 연산은 주어진 릴레이션에서 하나 이상 투플의 하나 이상의 애트리뷰트의 값을 수정하는 것이다. DBMS는 무결성 제약조건을 유지하기 위해 수정하는 애트리뷰트가 기본 키인지 외래 키인지 검사하는데, 이 애트리뷰트가 기본 키도 아니고 외래 키도 아니면 수정 연산이 참조 무결성 제약조건을 위배하지 않는다. 그러나 기본 키 또는 외래 키를 수정하는 것은 하나의 투플을 삭제하고 새로운 투플을 그 자리에 삽입하는 것과 유사하므로, 삽입 연산과 삭제 연산에서 언급한 제한, 연쇄, 널값, 디폴트값 옵션이 수정 연산에도 적용된다. 한편 오라클에서는 수정 연산에 대해 제한적으로 참조 무결성 제약조건을 유지하고 있다.

 

댓글