관리 메뉴

♠개발자의 작은 서재♠

정규화(Normalization)와 비정규화(Denormalization)의 개념 및 장단점 본문

IT 면접 질문 총정리!!/데이터베이스

정규화(Normalization)와 비정규화(Denormalization)의 개념 및 장단점

♠디지털 모험일지♠ 2024. 10. 29. 20:11

1. 정규화(Normalization)

  • 개념:
    정규화는 데이터베이스에서 중복 데이터를 줄이고 데이터 일관성을 유지하기 위해 데이터를 여러 테이블로 나누는 과정입니다. 데이터가 한 곳에만 저장되도록 설계하여, 데이터 수정 시 다른 곳에 반영할 필요 없이 한 곳만 업데이트하면 됩니다. 이를 통해 데이터 무결성을 높이고, 저장 공간을 효율적으로 사용할 수 있습니다.

  • 정규화 과정 (Normalization Forms):

    • 제 1 정규형 (1NF): 각 열에 하나의 값만 저장하고, 중복된 열을 제거합니다.
    • 제 2 정규형 (2NF): 기본 키에 의존하지 않는 열을 별도의 테이블로 분리합니다.
    • 제 3 정규형 (3NF): 기본 키가 아닌 열 간의 종속성을 제거하여 독립적인 테이블로 나눕니다.
  • 쉽게 설명: 정규화는 데이터를 깔끔하게 정리해 중복되지 않도록 테이블을 나누는 과정입니다. 마치 문서에서 중요한 정보를 분류하여 필요한 곳에만 저장하는 것과 비슷합니다.

  • 예시:
    예를 들어, 고객과 주문 정보를 저장하는 데이터베이스가 있다고 가정해 보겠습니다.

    -- 정규화 전 (중복 데이터 포함)
    CREATE TABLE orders (
        order_id INT,
        customer_name VARCHAR(100),
        customer_address VARCHAR(100),
        product_name VARCHAR(100)
    );
    
    -- 정규화 후 (데이터를 나눔)
    CREATE TABLE customers (
        customer_id INT,
        customer_name VARCHAR(100),
        customer_address VARCHAR(100)
    );
    
    CREATE TABLE products (
        product_id INT,
        product_name VARCHAR(100)
    );
    
    CREATE TABLE orders (
        order_id INT,
        customer_id INT,
        product_id INT
    );

    정규화 전 테이블에는 고객 이름과 주소가 여러 주문마다 중복되어 있지만, 정규화 후에는 customers, products, orders 테이블로 나누어 중복을 줄이고 데이터 일관성을 높였습니다.

  • 장점:

    • 데이터 중복 최소화: 데이터가 여러 곳에 중복되지 않아 수정할 때 실수를 줄일 수 있습니다.
    • 데이터 무결성 유지: 데이터가 일관되게 유지되므로, 특정 값이 바뀌면 한 곳만 수정하면 됩니다.
    • 저장 공간 절약: 중복된 데이터가 줄어들어 저장 공간이 효율적으로 사용됩니다.
  • 단점:

    • 복잡한 조회 쿼리: 여러 테이블을 참조해야 하므로, 데이터를 조회할 때 JOIN을 사용해 복잡해질 수 있습니다.
    • 성능 저하 가능성: JOIN이 많아지면 쿼리 성능이 저하될 수 있습니다.

2. 비정규화(Denormalization)

  • 개념:
    비정규화는 성능 향상을 위해 데이터를 일부러 중복하여 저장하는 과정입니다. 정규화로 인해 데이터가 여러 테이블로 나눠졌을 때, 빈번한 JOIN 연산이 성능을 저하시킬 수 있습니다. 이럴 때 비정규화를 통해 특정 데이터를 중복 저장하여 JOIN 없이 한 테이블에서 필요한 정보를 조회할 수 있게 합니다.

  • 쉽게 설명: 비정규화는 "필요한 정보를 한곳에 모아서 쉽게 접근하도록 하는" 과정입니다. 마치 복잡한 서류를 한 번에 확인하기 위해 필요한 정보들을 여러 곳에 복사해 두는 것과 비슷합니다.

  • 예시:
    앞선 예시의 정규화된 테이블을 다시 비정규화해 보겠습니다. 예를 들어, orders 테이블에서 고객 정보와 제품 이름을 자주 조회해야 한다면, orders 테이블에 고객 이름과 제품 이름을 다시 추가하여 JOIN을 줄일 수 있습니다.

    -- 비정규화 후 (데이터 중복 포함)
    CREATE TABLE orders (
        order_id INT,
        customer_id INT,
        customer_name VARCHAR(100),  -- 중복된 고객 이름
        customer_address VARCHAR(100),  -- 중복된 고객 주소
        product_id INT,
        product_name VARCHAR(100)  -- 중복된 제품 이름
    );

    이렇게 하면 고객 이름이나 제품 이름을 조회할 때 customersproducts 테이블을 JOIN하지 않아도 됩니다. 다만, 고객 정보가 바뀔 경우 orders 테이블의 데이터도 같이 수정해야 합니다.

  • 장점:

    • 조회 속도 향상: 필요한 정보가 한 테이블에 모두 있어서 JOIN 없이도 빠르게 데이터를 조회할 수 있습니다.
    • 간단한 쿼리: 여러 테이블을 참조할 필요가 없기 때문에 쿼리가 간단해집니다.
  • 단점:

    • 데이터 중복 증가: 여러 테이블에 중복된 데이터가 저장되므로, 데이터 일관성을 유지하기가 어려울 수 있습니다.
    • 데이터 수정 복잡성: 중복된 데이터가 많아지면서 한 곳의 데이터가 수정되면 관련된 모든 곳에서 동일한 데이터를 수정해야 하는 부담이 생깁니다.
    • 저장 공간 낭비: 중복 데이터로 인해 저장 공간이 더 많이 필요할 수 있습니다.

3. 정규화와 비정규화의 선택 기준

  • 정규화가 적합한 경우:
    • 데이터 일관성이 매우 중요한 경우, 즉 데이터가 자주 변경되어 여러 곳에서 동기화가 필요할 때.
    • 데이터가 큰 규모가 아니라서 성능 이슈가 크지 않은 경우.
    • 저장 공간이 제한적이고, 데이터를 효율적으로 관리해야 하는 경우.
  • 비정규화가 적합한 경우:
    • 읽기 속도가 중요한 경우, 즉 조회 성능이 중요하고, 업데이트가 자주 발생하지 않는 경우.
    • 대량의 데이터를 다루는 시스템으로, JOIN으로 인해 조회 성능이 크게 저하되는 경우.
    • 데이터의 변경이 적고, 주로 조회만 일어나는 시스템인 경우.

정규화와 비정규화는 서로 상반된 개념이지만, 데이터 일관성, 저장 공간, 성능 요구 사항을 고려하여 혼합해서 사용하는 경우가 많습니다.

Comments