Oracle Database Design


정규화 (Normalization: 1NF, 2NF, 3NF)

정규화의 개념 (Concept of Normalization)

정규화는 데이터베이스 설계에서 데이터 중복을 최소화하고 데이터 무결성을 유지하기 위해 테이블을 구조화하는 과정입니다. 정규화는 여러 단계로 이루어지며, 각 단계는 특정 규칙을 준수하여 테이블을 구조화합니다.

제1정규형 (1NF: First Normal Form)

1NF는 각 테이블의 모든 열이 원자 값을 가지도록 보장합니다. 즉, 각 열에는 더 이상 분해할 수 없는 단일 값이 있어야 합니다.

-- Before 1NF
CREATE TABLE employees (
    employee_id NUMBER,
    name VARCHAR2(50),
    phone_numbers VARCHAR2(100) -- '123-456-7890, 234-567-8901'
);

-- After 1NF
CREATE TABLE employees (
    employee_id NUMBER,
    name VARCHAR2(50)
);

CREATE TABLE employee_phones (
    employee_id NUMBER,
    phone_number VARCHAR2(20)
);

예제:

-- 전화번호를 별도의 테이블로 분리
INSERT INTO employees (employee_id, name) VALUES (1, 'John Doe');
INSERT INTO employee_phones (employee_id, phone_number) VALUES (1, '123-456-7890');
INSERT INTO employee_phones (employee_id, phone_number) VALUES (1, '234-567-8901');

제2정규형 (2NF: Second Normal Form)

2NF는 1NF를 만족하고, 기본 키의 부분 집합에 종속된 속성을 제거하여 부분적 종속성을 없앱니다. 즉, 모든 비키 속성은 기본 키에 완전 종속적이어야 합니다.

-- Before 2NF
CREATE TABLE orders (
    order_id NUMBER,
    product_id NUMBER,
    product_name VARCHAR2(50),
    quantity NUMBER
);

-- After 2NF
CREATE TABLE orders (
    order_id NUMBER,
    product_id NUMBER,
    quantity NUMBER
);

CREATE TABLE products (
    product_id NUMBER,
    product_name VARCHAR2(50)
);

예제:

-- 제품 정보를 별도의 테이블로 분리
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 101, 2);
INSERT INTO products (product_id, product_name) VALUES (101, 'Laptop');

제3정규형 (3NF: Third Normal Form)

3NF는 2NF를 만족하고, 기본 키에 종속되지 않은 속성을 제거하여 이행적 종속성을 없앱니다. 즉, 비키 속성은 기본 키에만 종속적이어야 합니다.

-- Before 3NF
CREATE TABLE employees (
    employee_id NUMBER,
    department_id NUMBER,
    department_name VARCHAR2(50)
);

-- After 3NF
CREATE TABLE employees (
    employee_id NUMBER,
    department_id NUMBER
);

CREATE TABLE departments (
    department_id NUMBER,
    department_name VARCHAR2(50)
);

예제:

-- 부서 정보를 별도의 테이블로 분리
INSERT INTO employees (employee_id, department_id) VALUES (1, 10);
INSERT INTO departments (department_id, department_name) VALUES (10, 'Sales');

역정규화 (Denormalization)

역정규화의 개념 (Concept of Denormalization)

역정규화는 성능 향상이나 복잡한 조회를 단순화하기 위해 정규화된 데이터베이스 구조를 의도적으로 중복시키는 과정입니다. 이는 데이터를 더 빠르게 액세스할 수 있도록 하기 위함입니다.

역정규화의 예제 (Example of Denormalization)

-- Before denormalization
CREATE TABLE employees (
    employee_id NUMBER,
    department_id NUMBER
);

CREATE TABLE departments (
    department_id NUMBER,
    department_name VARCHAR2(50)
);

-- After denormalization
CREATE TABLE employees (
    employee_id NUMBER,
    department_id NUMBER,
    department_name VARCHAR2(50)
);

예제:

-- 부서 정보를 직원 테이블에 포함
INSERT INTO employees (employee_id, department_id, department_name) VALUES (1, 10, 'Sales');

역정규화는 데이터 중복을 증가시키고, 데이터 무결성 유지가 어려워질 수 있으므로 신중히 사용해야 합니다. 주로 성능이 중요한 경우에 적용됩니다.

데이터베이스 설계 원칙 (Principles of Database Design)

중복 최소화 (Minimize Redundancy)

데이터 중복을 최소화하여 저장 공간을 절약하고 데이터 일관성을 유지합니다. 정규화를 통해 중복 데이터를 제거합니다.

데이터 무결성 (Data Integrity)

데이터의 정확성과 일관성을 보장하기 위해 무결성 제약 조건을 사용합니다. PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL 등의 제약 조건을 설정합니다.

CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL,
    department_id NUMBER,
    CONSTRAINT fk_department
        FOREIGN KEY (department_id)
        REFERENCES departments (department_id)
);

정규화와 성능의 균형 (Balance Between Normalization and Performance)

정규화는 데이터베이스 설계의 기본이지만, 과도한 정규화는 성능을 저하시킬 수 있습니다. 필요한 경우 역정규화를 통해 성능을 개선합니다.

확장성 (Scalability)

데이터베이스 설계는 확장성을 고려해야 합니다. 데이터가 증가해도 성능이 유지되도록 설계합니다. 이를 위해 파티셔닝, 샤딩 등의 기술을 사용할 수 있습니다.

보안 (Security)

데이터베이스는 민감한 데이터를 포함할 수 있으므로, 보안도 중요한 고려 사항입니다. 권한 관리를 통해 데이터 접근을 통제하고, 암호화를 통해 데이터 보안을 강화합니다.

-- 사용자 권한 설정 예제
CREATE USER john IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO john;
GRANT SELECT, INSERT ON employees TO john;

데이터베이스 설계는 데이터 중복을 최소화하고, 데이터 무결성을 유지하며, 성능과 확장성을 고려하여 이루어져야 합니다. 정규화와 역정규화의 균형을 유지하고, 보안에도 신경을 써야 합니다. 이를 통해 효율적이고 신뢰할 수 있는 데이터베이스를 구축할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *