데이터 무결성과 제약조건 관계

[ 1 ] 데이터 무결성과 제약조건의 관계


 : 무결성(無缺性)은 없을 무, 결함 결, 성질 성으로 "결함이 없는 성질"을 의미한다.    
   "데이터 무결성"은 데이터의 "정확성, 완전성, 일관성, 유효성"을 지켜, 데이터의 결함이 없도록 하는 것이다. 
   이를 위해 데이터베이스에서 보편적으로 "제약조건"을 통해 "데이터 무결성"을 유지하려고 한다. 
   이번 글에서는 "무결성 유형" 알아보고, 데이터베이스가 "유형별 무결성"에 어떻게 대응하여 관리하는지 알아보자.
   ※ 제약조건 : 데이터 값에 대한 추가적인 규칙을 설정하여 데이터의 무결성을 보장하는 역할

 

[ 2 ] 무결성 유형 

 

1. 개체 무결성(entity integrity) 
 - 정의 : 기본 키값으로 정의한 속성은 항상 널(null) 값을 가질수 없으며, 중복값을 가질수 없다. 
 - 제약조건 : Primary Key 

 

2. 참조 무결성(referential integrity)
 - 정의 : 외래 키값은 Null 이거나, 참조 릴레이션의 기본키 값과 동일해야 함. 참조할 수 없는 외래키는 저장 불가.
 - 제약조건 : Foreign Key 

 

3. 도메인 무결성 (domain integrity)
 1) 데이터 유형과 범위 속성 정의
  - 특정 열(Column)에 입력될 수 있는 데이터의 "유형과 범위"를 제한합니다. 데이터의 "일관성과 유효성"을 보장하여 
    데이터 품질을 유지한다. 
    FIRST_NAME  VARCHAR(10) -- 데이터 유형과 범위 / 문자열 데이터, 범위는 10 BYTE까지 저장이 가능하다. 
    
 2) CHECK 제약 조건
  - 설정한 CHECK 식에 만족하는 데이터만 저장 
    예시) 이름에 5가지 데이터만 저장이 되도록 설정 
      FIRST_NAME  VARCHAR(10) CHECK ( FIRST_NAME IN ( 'ORANGE','TOAD','SQL','DBEAVER','APPLE' ) ),

 

4. NULL 무결성 (NULL integrity)
 - 테이블의 특정 열(Column) 값에 반드시 데이터가 있어야 한다면, Null이 될 수 없도록 제한해야한다. 
  예시) 성에 데이터가 반드시 저장이 되어야 한다.
           LAST_NAME   VARCHAR(10) NOT NULL

 

5. 고유 무결성 (Unique Integrity)
 - 특정 열(Column) 또는 열의 집합에 중복된 값이 들어가지 않도록 보장하여 해당 열의 데이터 고유성을 유지하는 것이다.
   예시) 이름컬럼에 존재하는 데이터는 중복값이 없어야 한다. 
           FIRST_NAME VARCHAR2(10) UNIQUE

 




[ 3 ] 무결성을 유지하기 위한 DATABASE 제약조건 테스트 

3.1. 테이블 생성 
 : 위 5가지 데이터 무결성을 지키기 위해, 유형별로 대응한 제약조건을 인위적으로 만들어 보았다.
   그리고 어떤 제약조건을 위배하여 에러가 발생했는지 쉽게 알기 위해, NULL 제약조건 이외는 "사후 제약 조건 설정"을 하였다. 

DROP TABLE EMPLOYEES_TEST PURGE;
CREATE TABLE EMPLOYEES_TEST 
(
   EMPLOYEE_ID INT, 
   
   -- 3) 도메인무결성 (데이터유형과범위) : 문자열 / 10자리이내
   FIRST_NAME  VARCHAR(10),

   -- 4) NULL 무결성 : 특정 컬럼 값에 반드시 데이터가 존재해야함
   LAST_NAME   VARCHAR(10) NOT NULL, 
   MANAGER_ID  INT  
);

-- 1) PRIMARY KEY < 개체 무결성 >
ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_PK PRIMARY KEY ( EMPLOYEE_ID ); 

-- 2) FOREIGN KEY < 참조 무결성 >
ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_MANAGER_FK FOREIGN KEY ( MANAGER_ID ) REFERENCES EMPLOYEES_TEST ( EMPLOYEE_ID ) ; 

-- 3) CHECK < 도메인 무결성 > : "데이터 유형과범위", "CHECK"는 데이터 무결성을 지키키 위한 역할은 같으나, 전자는 값의형식을 제한하는 기능이지만, CHECK는 "제약조건"이다.
ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_FIRST_NAME_CHK CHECK ( FIRST_NAME IN ( 'ORANGE','TOAD','SQL','DBEAVER','APPLE' ) );

-- 5) UNIQUE 설정 < 고유 무결성 >
ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_UK1 UNIQUE ( FIRST_NAME ); 
ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_UK2 UNIQUE ( LAST_NAME );

 

 



3.2. 데이터 저장 시도하여, 제약조건에 위배 되면 어떻게 되는지 확인하자.

3.2.1. 개체 무결성 : Primary Key ( EMPLOYEE_ID ) 제약조건

INSERT INTO EMPLOYEES_TEST VALUES ( 1 , 'ORANGE', 'KIM' , '');
INSERT INTO EMPLOYEES_TEST VALUES ( 1 , 'TOAD', 'LEE', '' );

 

etc-image-0
PRIMARY KEY 제약조건으로 EMPLOYEE_ID에 동일한 1을 저장이 불가능하다.

 

 


3.2.2. 참조 무결성 : Foreign Key ( MANAGER_ID ) 제약조건

INSERT INTO EMPLOYEES_TEST VALUES ( 2 , 'TOAD', 'LEE', 3 );

etc-image-1
FOREIGN KEY 제약조건으로 MANAGER_ID 컬럼에 데이터가 저장시에는, 반드시 EMPLOYEE_ID 컬럼에 존재하는 데이터만 저장 가능하다

 



3.2.3.  도메인 무결성 : 데이터 유형과범위는 속성정의이며, CHECK 조건은 값에 규칙 설정이므로 제약조건에 해당됨

데이터 유형과 범위 속성 정의
FIRST_NAME VARCHAR2(10) 인데, 데이터 'SQLDEVELOPER김'  15 Byte 저장 시도 함 (영문 1Byte, 한글 3Byte)
INSERT INTO EMPLOYEES_TEST VALUES ( 2 , 'SQLDEVELOPER김', 'KIM', 1 );

etc-image-2
지정한 데이터 유형과 범위 설정을 위배하여 에러가 발생하였다. 데이터 유형과 범위는 제약조건은 아니며, 열에 허용하려는 데이터 유형과 범위를 정의하는 속성이다. 에러명에도 다른 에러코드와 다르게 "제약 조건" 명칭이 나오지 않는다.

 

 

CHECK 제약조건 : FIRST_NAME IN ( 'ORANGE','TOAD','SQL','DBEAVER','APPLE' )
INSERT INTO EMPLOYEES_TEST VALUES ( 2 , 'ORAGNE1', 'YOON', 1 );

etc-image-3
FIRST_NAME에는 'ORANGE','TOAD','SQL','DBEAVER','APPLE' 데이터만 저장이 가능하도록 CHECK 제약조건이 있다. 이를 위배하여 에러가 발생한 결과이다.


        


3.2.4.  NULL 무결성 : NOT NULL 제약조건

INSERT INTO EMPLOYEES_TEST VALUES ( 3 , 'DBEAVER', '', 1 );

  

etc-image-4
LAST_NAME 컬럼에 널 데이터 저장되지 못하도록 NOT NULL 제약조건이 있으므로 데이터가 저장되지 못함

 

 

3.2.5.  고유 무결성 : UNIQUE 제약조건

ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_UK1 UNIQUE ( FIRST_NAME );

INSERT INTO EMPLOYEES_TEST VALUES ( 4 , 'ORANGE', 'SIN', 1 );

etc-image-5
최초 1, ORANGE, KIM '' 데이터가 저장이 된 상태이며, FIRST_NAME에 동일한 ORANGE가 등록되어 UNIQUE 제약 조건 위배로 에러 발생

     

ALTER TABLE EMPLOYEES_TEST ADD CONSTRAINT EMPLOYEES_TEST_UK2 UNIQUE ( LAST_NAME );

INSERT INTO EMPLOYEES_TEST VALUES ( 4 , 'APPLE', 'KIM', 1 );

etc-image-6
최초 1, ORANGE, KIM '' 데이터가 저장이 된 상태이며, LAST_NAME에 동일한 KIM이 등록되어 UNIQUE 제약 조건 위배로 에러 발생

 

'데이터 모델링 > 관계형 데이터 모델링' 카테고리의 다른 글

관계형 데이터 모델  (0) 2024.11.11
망형 데이터 모델  (2) 2024.11.10
계층형 데이터 모델  (1) 2024.11.09