데이터 무결성이란?
무결성이란 데이터베이스에 저장된 데이터 값과 그것이 표현하는 현실 세계의 실제값이 일치하는 정확성을 의미한다
즉, 데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
- 정확성 : 중복이나 누락이 없는 상태
- 일관성 : 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태
만약 데이터베이스에서 데이터 무결성 설계를 하지 않는다면 테이블에 중복된 데이터 존재, 부모와 자식 데이터 간의 논리적 관계 깨짐, 잦은 에러와 재개발 비용 발생 등과 같은 문제가 발생할 것이다.
그렇기 때문에 DBMS에서 데이터의 무결성이 유지되는 것은 중요한 사항이며, 주로 데이터에 적용되는 연산에 제한을 두어 데이터의 무결성을 유지한다.
무결성 제약조건
무결성 제약조건이란 데이터베이스의 정확성, 일관성을 보장하기 위해 저장, 삭제, 수정 등을 제약하기 위한 조건을 뜻한다.
주요 목적은 데이터베이스에 저장된 데이터의 무결성을 보장하고 데이터베이스의 상태를 일관되게 유지하는 것이다.
1. 개체 무결성(Entity integrity)
기본 키 제약이라고도 하며, 각 릴레이션의 기본키를 구성하는 속성은 널(NULL) 값이나 중복된 값을 가질 수 없다.
- 기본 키(Primary Key)에는 Null 값이 올 수 없음
- 기본 키는 테이블 내에 오직 하나의 값만 존재해야 함. (하나의 테이블 내에 동일한 기본 키를 가진 레코드는 존재할 수 없음)
- ex)
- [학생] 릴레이션에서 ‘학번’을 기본키로 지정했다면 ‘학번’ 속성은 NULL이 되어서는 안된다.
2. 참조 무결성(Referential integrity)
외래 키 제약이라고도 하며, 테이블 간의 참조 관계를 선언하는 제약조건
- 외래 키(Foreign Key)의 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 함
- 외래 키 속성은 참조할 수 없는 값을 지닐 수 없음
(즉, 외래 키 속성 값이 상위 테이블의 인스턴스에 반드시 존재하거나 Null이어야 함) - ex)
- [수강] 릴레이션에서 ‘학번’ 속성에는 [학생] 릴레이션의 ‘학번’ 속성에 없는 값은 입력할 수 없다.
릴레이션(relation)이란?
주로 테이블(Table)과 같은 의미로 사용되며, 데이터의 집합을 의미한다. 튜플(tuple)과 속성(attribute)로 구성되어 있다.
3. 도메인 무결성(Domain integrity)
테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 필드의 타입, Null 값 허용 등에 대한 사항을 정의하고 올바른 데이터가 입력되었는지 확인하는 조건. 즉, 속성들의 값은 정의된 도메인에 속한 값이어야 한다.
예를 들어 주민등록번호 필드에 문자가 입력되는 경우엔 도메인의 무결성이 깨졌다고 볼 수 있음
4. Null무결성(Null integrity)
테이블의 특정 속성 값이 Null이 될 수 없게 하는 조건
예를 들어 [학생] 릴레이션 정의 시 ‘과목’ 속성에 NULL 값이 올 수 없도록 제한했다면 ‘과목’ 속성에 NULL이 있어서는 안된다.
5. 고유 무결성 (Unique integrity)
특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 릴레이션의 각 튜플이 가지는 속성 값들은 서로 달라야 한다.
예를 들어 [학생] 릴레이션에서 ‘이름’, ‘나이’는 서로 같은 값을 가질 수 있지만 ‘학번’의 경우, 각 튜플은 서로 다른 값을 가져야 한다.
6. 키 무결성 (Key integrity)
각 릴레이션은 최소한 한 개 이상의 키가 존재해야 한다.
무결성 제약조건의 장단점
장점
스키마를 정의할 때 일관성 조건을 오직 한 번만 명시하고, 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없다.
단점
프로그래밍 작업이 훨씬 복잡해지고, 무결성 제약조건을 반복해서 구현해야 하고, 무결성 제약조건들 간에 서로 충돌이 발생할 수 있다.
무결성 제약조건의 유지
- 데이터베이스에 대한 갱신 연산 : 삽입연산, 삭제연산, 수정연산
- DBMS는 각각의 갱신 연산에 대해 데이터베이스가 무결성 제약조건들을 만족하도록 필요한 조치를 취함
- DBMS는 외래 키가 갱신되거나, 참조된 기본 키가 갱신되었을 때 참조 무결성 제약조건이 위배되지 않도록 조치
DEPARTMENT : 참조된 릴레이션 (부모)
EMPLOYEE : 참조하는 릴레이션 (자식)
ex) 외래키가 생겼다 -> 1 대 다 관계
1 대 다에서 추가되는 열을 참조 키에 맞춰서 추가. (삭제 될 때는 상관없음)
- 자식의 삽입, 수정 참조무결성 신경O (부모 기본키에 맞춰서 해야함)
- 자식의 삭제는 참조무결성 신경X
- 부모의 삭제는 신경O (자식 외래키에 영향)
- 부모의 삽입 신경X
참조 무결성 제약조건을 만족시키기 위해서 DBMS가 제공하는 옵션
1. 제한(restricted)
- 위배를 야기한 연산을 단순히 거절
- 예: DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 참조 무결성 제약조건을 위배하게 되므로 삭제 연산을 거절
2. 연쇄(cascade)
- 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들도 함께 삭제
- 예: DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째 투플과 다섯 번째 투플도 함께 삭제
- 부서 3이 삭제되면 딸려오는 것도 다 삭제 -> 연쇄
- 부서 번호를 5로 수정하면 연관되어잇는 걸 다 5로 수정
- 기본 삭제는 제한이 디폴트고, 수정은 연쇄가 디폴트로 작용한다.
3. 널값(nullify)
- 참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들의 외래 키에 널값을 삽입
예: DEPARTMENT 릴레이션에서 (3, 개발, 9)를 삭제하면 EMPLOYEE 릴레이션에서 부서번호 3을 참조하는 두 번째 투플과 다섯 번째 투플의 부서번호에 널값을 삽입
4. 디폴트값
- 널값을 넣는 대신에 디폴트값을 넣는다는 것을 제외하고는 바로 위의 옵션과 비슷함