민규의 흔적

[오라클 DB] 무결성 제약조건 (도메인, 엔티티, 참조 무결성 제약조건) 본문

데이터베이스

[오라클 DB] 무결성 제약조건 (도메인, 엔티티, 참조 무결성 제약조건)

민규링 2023. 10. 18. 10:30

데이터 무결성(Data Integrity)

 

데이터의 정확성 또는 유효성을 의미한다.

일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적 또는 명시적으로 정의하며, 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없다.

 

 

무결성 제약조건의 종류로는 도메인 무결성 제약조건, 엔티티 무결성 제약조건, 참조 무결성 제약조건이 존재한다.

 

도메인 무결성 제약조건 ( Domain Constraint )

 

각 애트리뷰트 값이 반드시 원자값이어야 하며 릴레이션 내의 튜플들이 각 속성의 도메인이 지정된 값 만을 가져야 한다는 조건이다.

SQL 문에서 데이터 형식을 통해 값들의 유형을 제한하고 널(NULL, NOT NULL), 기본 값(DEFAULT), 체크(CHECK) 등을 사용하여 지정할 수 있다.

 

예를 들어, 나이(age)의 범위를 1~200으로 지정했다면 범위를 벗어나는 205같은 값은 저장하지 못한다.

 

 

엔티티 무결성 제약조건 (Entity Integrity Constraint)

 

릴레이션의 기본 키를 구성하는 어떤 애트리뷰트도 널(NULL) 값을 가질 수 없다는 의미이며 이는 절대구별자가 없으면 안된다는 의미이다.

대체 키(alternate key)에는 적용되지 않는다.

 

 

참조 무결성 제약조건 (Referential Integrity Constraint)

 

릴레이션 간의 참조 관계를 선언하는 제약조건으로, 릴레이션 간의 관계들을 다른 릴레이션의 기본 키를 참조하는 것으로 표현한다.(외래 키)

 

 

위 그림의 3가지 릴레이션 관계를 가지고 설명을 덧붙이자면, 수강 릴레이션의 외래 키는 과목 릴레이션의 기본 키와 도메인이 동일해야 하며, 수강 릴레이션의 값이 변경될 때 과목 릴레이션의 제약을 받는다는 것이 참조 무결성 제약조건에 해당한다.

 

 

참조 무결성 제약조건이 성립하려면 어떻게 해야하는가?

 

예시 릴레이션 R1, R2

 

특정 릴레이션 R1, R2가 존재하고 R2의 외래 키가 R1의 기본 키를 참조할 때, 참조 무결성 제약조건은 아래의 두 조건 중 하나만 성립되어도 만족한다.

 

1. 외래 키의 값은 R1의 어떤 튜플의 기본 키 값과 같음.
R2의 외래 키인 DNO는 R1의 기본 키인 DEPTNO에 존재하는 값이 들어가야 하며, 이는 DNO에 4 같은 값이 들어가면 안 된다는 의미이다.

2. 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않으면 널 값을 가짐.

외래 키는 NULL값이 있을 수 있지만, 외래 키를 조합하여 기본 키로 쓰는 경우 NULL값을 가질 수 없다.

 

 

2번의 경우, ' 외래 키를 조합하여 기본 키로 쓰는 경우 NULL값을 가질 수 없다 ' 라는 조건을 꼭 붙여야 진정 널 값을 가질 수 있다는 조건이 갖춰질 수 있다.(엔티티 무결성 제약조건에 의거)

 

 


 

무결성 제약조건의 유지

 

DBMS는 각각의 갱신 연산에 대해 데이터베이스가 무결성 제약조건들을 만족하도록 필요한 조치를 취하며, 데이터베이스에 대한 갱신 연산은 삽입 연산, 삭제 연산, 수정 연산으로 구분한다.

DBMS는 외래 키가 갱신되거나, 참조된 기본 키가 갱신되었을 때 참조 무결성 제약조건이 위배되지 않도록 해야하는 의무를 가지고 있다.

 

 

다음 두 릴레이션을 보며 참조 무결성 제약조건을 위배하는 삽입 / 삭제 연산의 경우의 예를 들어보겠다.

 

 

댓글 릴레이션과 게시판 릴레이션

 

 

삽입

참조되는 릴레이션(게시판 릴레이션)에 새 튜플이 삽입되면 참조 무결성 제약조건은 위배되는 경우가 없다. 하지만 새로 삽입되는 튜플의 기본 키 애트리뷰트 값에 따라서는 도메인 제약조건, 엔티티 무결성 제약조건을 위배할 수 있다.

 

 

참조되는 릴레이션에서의 도메인 제약조건 위배 예시

 

참조되는 릴레이션인 게시판 릴레이션의 게시판 고유번호 애트리뷰트(기본 키)는 정수형으로 지정했다고 가정하겠다.

 

게시판 고유번호 애트리뷰트의 도메인을 지정한 상태에서 다음과 같은 튜플이 삽입되는 경우를 보자.

 

게시판 고유번호 제목 작성자 작성일 내용 추천 수
A0005 E 게시글 오OO 23.09.16 E 내용 0

 

정수형이 아닌 문자열 형태의 값이 게시판 고유번호 애트리뷰트에 삽입되었고, 이는 지정한 도메인 약속을 지키지 않았기에, 이런 경우 도메인 제약조건을 위배한 케이스라고 볼 수 있다.

 

 

참조되는 릴레이션에서의 엔티티 무결성 제약조건 위배 예시

 

게시판 릴레이션에 다음과 같은 튜플이 삽입되는 경우를 보자.

 

게시판 고유번호 제목 작성자 작성일 내용 추천 수
^ E 게시글 오OO 23.09.16 E 내용 0

 

릴레이션의 기본 키를 구성하는 어떤 애트리뷰트도 널 값을 가질 수 없다는 엔티티 무결성 제약조건에 따라, 기본 키가 되는 게시판 고유번호 애트리뷰트의 값으로 NULL 값이 들어올 수 없기에, 이런 경우 엔티티 무결성 제약조건을 위배한 케이스라고 볼 수 있다.

 

 

참조하는 릴레이션(댓글 릴레이션) 또한 위 2가지 예시와 같은 이유로 새로운 튜플이 삽입될 때 도메인 무결성 제약조건과 엔티티 무결성 제약조건을 위배할 가능성이 있다. 이에 추가로, 참조 무결성 제약조건 또한 위배할 가능성이 존재한다.

 

 

참조하는 릴레이션에서의 참조 무결성 제약조건 위배 예시

 

댓글 릴레이션에 다음과 같은 튜플이 삽입된다고 가정해보자.

 

댓글 고유번호 댓글 내용 작성자 작성일 게시판 번호(외래 키)
5 누구세요? 손OO 23.09.18 6

 

게시판 릴레이션을 참조하는데 이용되는 외래 키 애트리뷰트 값이 6이다. 이는 참조하는 릴레이션인 게시판 릴레이션의 기본 키 값 중에 없는 값을 참조하려고 시도한 것이기 때문에, 이런 경우 참조 무결성 제약조건을 위배한 케이스라고 볼 수 있다.

 

하지만 참조 무결성 제약조건의 성립 2가지 조건 중 하나만 만족하면 되기에, 위의 릴레이션의 경우 다음과 같은 튜플이라면 삽입되어도 참조 무결성 제약조건을 위배하지 않게 된다.

 

댓글 고유번호 댓글 내용 작성자 작성일 게시판 번호(외래 키)
5 누구세요? 손OO 23.09.18 ^

 

2가지 조건 중, 아래 조건을 성립하기에 참조 무결성 제약조건을 위배하지 않는 것이다.

 

2. 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않으면 널 값을 가짐.

외래 키는 NULL값이 있을 수 있지만, 외래 키를 조합하여 기본 키로 쓰는 경우 NULL값을 가질 수 없다.

 

댓글 릴레이션에서 게시판 번호 애트리뷰트는 기본 키를 구성하고 있지 않기에 NULL 값을 가져도 문제가 되지 않는다.

 

 

 

삭제

 

참조하는 릴레이션(댓글 릴레이션)에서 튜플이 삭제되면 도메인 제약조건, 엔티티 제약조건, 참조 무결성 제약조건을 모두 위배하지 않는다.

 

하지만 참조되는 릴레이션(게시판 릴레이션)에서 튜플이 삭제되면 참조 무결성 제약조건을 위배하는 경우가 생길 수 있다.

 

 

참조하는 릴레이션에서 튜플이 삭제되는 경우

 

댓글 릴레이션에서 4번째 튜플이 삭제된다고 가정해보자.

 

댓글 릴레이션의 4번째 튜플

 

위 튜플을 삭제해도 새로 튜플이 삽입되어 게시판 릴레이션의 기본 키에 없는 값을 참조하는 경우는 절대 생기지 않기에, 참조 무결성 제약조건을 위배하지 않는다.

 

 

참조되는 릴레이션에서 튜플이 삭제되는 경우

 

게시판 릴레이션에서 2번째 튜플이 삭제된다고 가정해보자.

 

 

게시판 릴레이션의 2번째 튜플

 

위 튜플을 삭제하면 댓글 릴레이션의 게시판 번호(외래 키) 애트리뷰트 값이 2인 모든 튜플들이 참조하는 대상을 잃어버리게 된다.

 

댓글 릴레이션의 2,4번째 튜플은 게시판 릴레이션의 기본 키 중, 2를 참조하고 있다.

 

이런 일련의 과정이 일어나는 경우 참조 무결성 제약조건을 위배하는 케이스라고 볼 수 있다.

 

 


 

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

 

제한 (Restricted)

위반을 야기한 연산을 단순히 거절한다.

 

위의 예시 참조되는 릴레이션에서 튜플이 삭제되는 경우에서 참조 무결성 제약조건을 위배하는 경우인 '게시판 릴레이션의 2번째 튜플 삭제' 연산을 진행할 경우 DBMS에서 삭제 연산을 거절하는 조취를 취한다.

참조 무결성 제약조건을 위배하는 요청을 사전에 거절해서 참조 무결성 제약조건을 지키겠다! 라고 이해하면 편하다.

 

 

연쇄 (Cascade)

 

참조되는 릴레이션에서 튜플을 삭제하고, 참조하는 릴레이션에서 이 튜플을 참조하는 튜플들도 함께 삭제한다.

 

위의 예시 참조되는 릴레이션에서 튜플이 삭제되는 경우에서 '게시판 릴레이션의 2번째 튜플'을 삭제한다면 해당 튜플을 참조하고 있는 '댓글 릴레이션의 2,4번째 튜플' 또한 함께 연쇄적으로 삭제하는 것이다.

모두 없애서 참조 무결성 제약조건을 지키겠다! 라고 이해하면 편하다.

 

 

널 값 (Nullify)

 

참조되는 릴레이션에서 튜플을 삭제하고, 참조하는 릴레이션에서 이 튜플을 참조하는 튜플들의 외래 키에 널 값을 삽입한다.

 

위의 예시 참조되는 릴레이션에서 튜플이 삭제되는 경우에서 '게시판 릴레이션의 2번째 튜플'을 삭제한다면 해당 튜플을 참조하고 있는 '댓글 릴레이션의 2,4번째 튜플'의 외래 키가 널 값( ^ )으로 삽입된다는 뜻이다.

참조 무결성 제약조건에 위배되는 튜플의 애트리뷰트는 널 값 처리 해버려서 참조 무결성 제약조건을 지키겠다! 라고 이해하면 편하다.

 

 

디폴트 값(Default)

 

널 값을 넣는 대신에 디폴트 값을 넣는다는 것을 제외하고는 위 널 값(Nullify) 옵션과 비슷하다.

 

위의 예시 참조되는 릴레이션에서 튜플이 삭제되는 경우에서 '게시판 릴레이션의 2번째 튜플'을 삭제한다면 해당 튜플을 참조하고 있는 '댓글 릴레이션의 2,4번째 튜플'의 외래 키가 디폴트 값으로 삽입된다는 뜻이다.

만약 댓글 릴레이션의 게시판 번호 애트리뷰트 디폴트 값을 0으로 설정해 놓았다면, '댓글 릴레이션의 2,4번째 튜플'의 게시판 번호 애트리뷰트 값이 0으로 삽입될 것이다.

참조 무결성 제약조건에 위배되는 튜플의 애트리뷰트는 기본 값으로 치환해버려서 참조 무결성 제약조건을 지키겠다! 라고 이해하면 편하다.