본문 바로가기
프로그래밍/DB

[DB]데이터 무결성, 그 핵심에 대하여

by 다다면체 2025. 1. 23.
728x90
반응형

데이터베이스 설계에서 데이터 무결성은 정말 중요한 개념이에요. 마치 건물을 지을 때 튼튼한 기초를 다지는 것과 같죠. 데이터 무결성을 잘 관리하면 데이터베이스가 항상 정확하고 믿을 수 있게 유지됩니다. 이번 글에서는 데이터 무결성을 지키는 핵심 도구인 '제약 조건(CONSTRAINT)'에 대해 자세히 알아보고, MySQL과 Oracle에서 실제로 사용하는 방법도 예제를 통해 쉽게 설명해 드릴게요.


1. 데이터 무결성이란?

데이터 무결성은 데이터가 얼마나 정확하고 일관성 있으며 유효한지를 나타내는 척도입니다. 무결성을 유지하면 잘못된 데이터가 들어오거나, 데이터 간의 관계가 꼬이거나, 똑같은 데이터가 여러 번 저장되는 것을 막을 수 있어요.

  • 엔터티 무결성(Entity Integrity): 각 테이블의 행(row), 즉 데이터 한 줄 한 줄이 고유해야 한다는 규칙입니다. 예를 들어, 주민등록번호처럼 모든 사람이 다른 값을 가져야 하는 속성을 생각하면 됩니다. 주로 PRIMARY KEY 제약 조건을 사용해서 구현합니다.
  • 참조 무결성(Referential Integrity): 테이블끼리의 관계가 일관성을 유지해야 한다는 규칙입니다. 예를 들어, '주문' 테이블이 '고객' 테이블의 정보를 참조할 때, 존재하지 않는 고객의 주문이 생기면 안 되겠죠? FOREIGN KEY 제약 조건을 사용합니다.
  • 도메인 무결성(Domain Integrity): 특정 컬럼에 입력할 수 있는 값의 범위를 제한하는 규칙입니다. 예를 들어, '나이' 컬럼에는 음수 값이 들어갈 수 없겠죠? CHECK 제약 조건이나 데이터 타입을 활용합니다.
  • 고유 무결성(Unique Integrity): 특정 컬럼의 값이 중복되지 않아야 한다는 규칙입니다. 예를 들어, 이메일 주소는 같은 값을 가진 사람이 두 명 이상일 수 없죠? UNIQUE 제약 조건을 사용합니다.

2. 제약 조건(CONSTRAINT) 개요

데이터베이스 시스템에서는 데이터 무결성을 지키기 위해 여러 가지 제약 조건을 제공합니다. 하나씩 살펴볼까요?

  • PRIMARY KEY (기본 키): 테이블의 각 행을 유일하게 식별하는 역할을 합니다. 테이블당 하나만 설정할 수 있고, NULL(값이 없음)을 허용하지 않습니다. 마치 각 사람의 주민등록번호와 같은 역할을 합니다.
  • FOREIGN KEY (외래 키): 한 테이블의 컬럼을 다른 테이블의 PRIMARY KEY와 연결하여 관계를 맺어줍니다. 부모-자식 관계를 나타낼 때 주로 사용하며, 참조 무결성을 유지하는 데 핵심적인 역할을 합니다.
  • UNIQUE (고유 키): 특정 컬럼의 값이 중복되지 않도록 합니다. 테이블 내에 여러 개의 UNIQUE 제약 조건을 설정할 수 있습니다.
  • CHECK (체크): 특정 컬럼의 값이 정해진 조건을 만족하는지 확인합니다. 예를 들어, '나이' 컬럼에는 0 이상의 값만 입력하도록 조건을 걸 수 있습니다.
  • NOT NULL (널 아님): 컬럼이 NULL 값을 가질 수 없도록 제한합니다. 즉, 반드시 어떤 값이든 입력해야 합니다.

3. MySQL에서 제약 조건 활용하기

고객(Customer) 테이블과 주문(Orders) 테이블을 만들어 PRIMARY KEY와 FOREIGN KEY를 사용하는 방법을 보여드릴게요.

-- 고객 테이블 생성
CREATE TABLE Customer (
    CustomerID INT AUTO_INCREMENT PRIMARY KEY,
    CustomerName VARCHAR(100) NOT NULL,
    Email VARCHAR(255) UNIQUE,
    RegistrationDate DATE NOT NULL
);

-- 주문 테이블 생성
CREATE TABLE Orders (
    OrderID INT AUTO_INCREMENT PRIMARY KEY,
    OrderDate DATE NOT NULL,
    Amount DECIMAL(10, 2) CHECK (Amount > 0),
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) ON DELETE CASCADE
);

여기서 중요한 점은 다음과 같습니다.

  • PRIMARY KEY: CustomerID와 OrderID는 각각 고유한 값이어야 하고, NULL 값을 가질 수 없습니다.
  • FOREIGN KEY: Orders 테이블의 CustomerID는 Customer 테이블의 CustomerID를 참조합니다. ON DELETE CASCADE는 고객이 삭제될 경우, 그 고객의 모든 주문도 함께 삭제되도록 설정한 것입니다. 이를 통해 데이터의 일관성을 유지할 수 있습니다.
  • UNIQUE: Email 컬럼은 중복된 값을 허용하지 않습니다.
  • CHECK: Amount는 0보다 큰 값만 입력할 수 있습니다.

데이터를 넣어볼까요?

-- 고객 데이터 삽입
INSERT INTO Customer (CustomerName, Email, RegistrationDate)
VALUES ('Alice', 'alice@example.com', '2024-01-01');

-- 주문 데이터 삽입
INSERT INTO Orders (OrderDate, Amount, CustomerID)
VALUES ('2024-01-15', 200.50, 1);

 

만약 고객을 삭제하면 어떻게 될까요?

-- 고객 삭제
DELETE FROM Customer WHERE CustomerID = 1;

-- Orders 테이블을 확인해 보면, 해당 고객의 주문도 자동으로 삭제된 것을 확인할 수 있습니다.
SELECT * FROM Orders;​

4. Oracle에서 제약 조건 활용하기

4.1 부모-자식 관계 테이블 설계

Oracle에서도 MySQL과 유사하게 제약 조건을 정의할 수 있습니다.

-- 고객 테이블 생성
CREATE TABLE Customer (
    CustomerID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    CustomerName VARCHAR2(100) NOT NULL,
    Email VARCHAR2(255) UNIQUE,
    RegistrationDate DATE NOT NULL
);

-- 주문 테이블 생성
CREATE TABLE Orders (
    OrderID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    OrderDate DATE NOT NULL,
    Amount NUMBER(10, 2) CHECK (Amount > 0),
    CustomerID NUMBER,
    CONSTRAINT fk_Customer FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) ON DELETE CASCADE
);

 

-- 고객 데이터 삽입
INSERT INTO Customer (CustomerName, Email, RegistrationDate)
VALUES ('Bob', 'bob@example.com', DATE '2024-01-10');

-- 주문 데이터 삽입
INSERT INTO Orders (OrderDate, Amount, CustomerID)
VALUES (DATE '2024-01-20', 150.75, 1);

 

-- 테이블 제약 조건 조회
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('CUSTOMER', 'ORDERS');

5. 제약 조건 관리 팁

 

제약 조건 추가: 

ALTER TABLE Orders
ADD CONSTRAINT chk_Amount CHECK (Amount > 0);

 

제약 조건 제거: 

ALTER TABLE Orders
DROP CONSTRAINT chk_Amount;

 


6. 마무리

데이터 무결성과 제약 조건은 데이터베이스의 품질을 유지하는 핵심 요소입니다. MySQL과 Oracle에서 제공하는 다양한 제약 조건을 활용하여 데이터의 신뢰성과 일관성을 확보하세요. 실무에서 발생할 수 있는 다양한 상황을 고려하여 설계를 세심하게 진행하는 것이 중요합니다.

궁금한 점이나 추가적인 질문이 있다면 댓글로 남겨주세요! 😊

728x90
반응형