ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2-4. 데이터베이스 정규화
    SQL 2019. 3. 29. 00:39

    데이터베이스 정규화 (Database Normalization)

     데이터베이스 정규화는 데이터베이스 내의 데이터를 효율적으로 체계화하는 과정입니다. 정규화 과정거치는 데에는 2가지 이유가 있습니다.


    • 중복 데이터 삭제. 예를 들면, 하나의 이상의 테이블에서 동일한 데이터를 저장한 경우입니다.
    • 데이터 종속성을 보장합니다.

     이 두 가지 모두 데이터베이스가 사용하는 공간을 줄이고, 논리적으로 저장된 데이터를 보장하는 데에 있어 가치있는 목표입니다. 정규화는 좋은 데이터베이스 구조를 만드는데 도움을 주는 몇 가지 지침으로 구성되어 있습니다.


     정규화 가이드라인은 여러 정규화 유형(= 정규형)으로 나뉘어져 있습니다. 데이터베이스 구조를 설계하는 방법 또는 형식으로써 정규화 유형에 대해 생각해봅시다. 정규형의 목적은 제1정규형, 제2정규형, 제3정규형의 규칙을 적용하여 데이터베이스를 체계화하는 것입니다.


     일반적으로 제3정규형만으로도 충분하지만 좀 더 나아가 제4정규형, 제5정규형까지 도달하는 것은 여러분의 선택입니다.


      1. 제1정규형 (1NF)
        제1정규형 (1NF)은 체계화된 데이터베이스를 위한 매우 기본적인 규칙을 가지고 있습니다.

         - 테이블의 컬럼이 될 필요 데이터 항목들을 정의합니다. 관련있는 데이터 항목들을 테이블에 배치합니다.
         - 데이터의 그룹이 반복되지 않았는지 확인합니다.
         - 기본 키가 있는지 확인합니다.

        1NF의 첫 번째 규칙:
         데이터 항목들을 정의해야 합니다. 이는 저장된 데이터에 대해 생각하고, 데이터를 컬럼으로 구성하고, 각 컬럼에 포함된 데이터의 형식이 무엇인지 정의하고, 마지막으로 서로 연관된 컬럼들을 테이블에 배치하는 것을 의미합니다.

         예를 들어, Location 테이블에는 회의 지역과 관련된 모든 컬럼을, MemberDetails 테이블에는 회의 참석자와 관련된 모든 컬럼을 배치하는 것을 말합니다.

        1NF의 두 번째 규칙:
         다음 단계는 구성한 테이블에서 반복되는 데이터 그룹은 없는지 확인하는 것입니다. 다음과 같은 테이블을 가지고 있다고 생각해봅시다.
        CREATE TABLE CUSTOMERS(
               ID      INT          NOT NULL,
               NAME    VARCHAR(20)  NOT NULL,
               AGE     INT          NOT NULL,
               ADDRESS CHAR(25),
               ORDERS  VARCHAR(155)
        );


         따라서 여러 주문을 가지는 단일 고객을 이 테이블에 덧붙이면 다음과 같습니다.

         ID

        NAME 

        AGE 

        ADDRESS 

        ORDERS 

         100

        Sachin 

        36 

        Lower West Side 

        Cannon XL-200

         100

        Sachin 

        36

        Lower West Side 

        Battery XL-200

         100

        Sachin 

        36

        Lower West Side 

        Tripod Large 

         
         하지만 1NF에 따르면 중복된 데이터의 그룹은 없는지 확인을 해야 합니다. . 그래서 위의 테이블을 두 개의 테이블로 나누고, 아래와 같은 키를 사용하여 테이블을 연결합니다.

        CUSTOMERS 테이블:

        CREATE TABLE CUSTOMERS(
               ID      INT         NOT NULL,
               NAME    VARCHAR(20NOT NULL,
               AGE     INT         NOT NULL,
               ADDRESS CHAR(25),
               PRIMARY KEY(ID)
        );
        cs


        이 테이블은 다음과 같은 레코드를 가집니다.

        ID 

        NAME 

        AGE 

        ADDRESS 

        100

        Sachin 

        36 

        Lower West Side 


        ORDERS 테이블:

        CREATE TABLE ORDERS(
               ID          INT NOT NULL,
               CUSTOMER_ID INT NOT NULL,
               ORDERS      VARCHAR(155),
               PRIMARY KEY(ID)
        );
        cs


        이 테이블은 다음과 같은 레코드를 가집니다.

        ID 

        CUSTOMER_ID 

        ORDERS 

         10

        100 

        Cannon XL-200 

         11

        100 

        Battery XL-200

         12

        100 

        Tripod Large 


        1NF의 세 번째 규칙:
         제1정규형의 마지막 규칙으로, 이미 생성한 각 테이블마다 기본 키를 설정해야 합니다.

      2. 제2정규형 (2NF)
         제2정규형은 1NF의 규칙을 모두 충족해야하며 기본 키로 선언된 어떤 컬럼의 부분적인 종속성이 없어야 한다고 명시되어 있습니다.

        고객의 ID, 고객 이름, 주문 ID와 주문의 상세 내용, 구매 날짜를 저장하고자 할 때의 고객-주문 관계에 대해 생각해봅시다. 
        CREATE TABLE CUSTOMERS(
               CUST_ID      INT         NOT NULL,
               CUST_NAME    VARCHAR(20NOT NULL,
               ORDER_ID     INT         NOT NULL,
               ORDER_DETAIL VARCHAR(20NOT NULL,
               SALE_DATE    DATETIME
               PRIMARY KEY(CUST_ID, ORDER_ID)
        );
        cs


         이 테이블은 제1정규형에 해당하고, 제1정규형의 모든 규칙을 준수하고 있습니다. 이 테이블에서 기본 키는 CUST_ID와 ORDER_ID로 구성되어 있습니다. 이 컬럼들은 동일한 고객이 좀처럼 똑같은 주문을 하지 않는다는 가정 하에 식별 가능한 유일한 컬럼입니다.

         그러나, 이 테이블은 기본 키와 컬럼에 부분적인 종속성을 가지기 때문에 제2정규형에 해당하지 않습니다. CUST_NAME은 CUST_ID에 종속적이고, 고객의 이름과 그가 구매한 것끼리 실제로 연결되지 않았습니다. 상세 주문 내용과 구매 날짜 또한 ORDER_DTAIL 또는 주문의 SALE_DATE와 CUST_ID 사이에 연결 관계가 없으므로 ORDER_ID에는 종속적이지만 CUST_ID에는 종속성을 가지지 않고 있습니다. 

         이 테이블을 제2정규형을 준수하도록 하려먼 컬럼들을 세 개의 테이블로 각각 분리해야 합니다.

         먼저, 다음의 문장으로 고객 상세 정보를 저장하는 테이블을 생성합니다.

        CREATE TABLE CUSTOMERS(
               CUST_ID   INT         NOT NULL,
               CUST_NAME VARCHAR(20NOT NULL,
               PRIMARY KEY(CUST_ID)
        );
        cs


         다음으로 각 주문의 상세 내용을 저장하는 테이블을 생성합니다.

        CREATE TABLE ORDERS(
               ORDER_ID     INT         NOT NULL,
               ORDER_DETAIL VARCHAR(20NOT NULL,
               PRIMARY KEY(ORDER_ID)
        );
         
        cs


         마지막으로 고객의 모든 주문을 기록하기 위해 CUST_ID와 ORDER_ID를 저장하는 세 번째 테이블을 생성합니다.

        CREATE TABLE CUSTOMERORDERS(
               CUST_ID   INT      NOT NULL,
               ORDER_ID  INT      NOT NULL,
               SALE_DATE DATETIME,
               PRIMARY KEY(CUST_ID, ORDER_ID)
        );
         
        cs


      3. 제3정규형 (3NF)
        다음과 같은 조건을 만족하는 테이블을 제3정규형이라고 합니다.
         - 제2정규형에 해당하는 테이블
         - 기본 키가 아닌 모든 필드가 기본 키에 종속적인 경우

        기본 키가 아닌 필드의 종속성은 데이터 사이에 있습니다. 예들 들면, 아래의 테이블에서 거리 명, 도시와 주(state)는 서로 분리될 수 없게 우편번호로 묶여 있습니다.  

        CREATE TABLE CUSTOMERS(
               CUST_ID   INT         NOT NULL,
               CUST_NAME VARCHAR(20NOT NULL,
               DOB       DATE,
               STREET    VARCHAR(200),
               CITY      VARCHAR(100),
               STATE     VARCHAR(100),
               ZIP       VARCHAR(12),
               EMAIL_ID  VARCHAR(256),
               PRIMARY KEY(CUST_ID)
        );
        cs


         우편번호와 주소 사이의 종속성은 전이 종속성(transitive dependency)이라고 합니다. 제3정규형을 적용하기 위해서 해야 할 일은 거리, 도시와 주 필드를 우편번호 테이블이라고 할만한 자신의 테이블로 옮기는 것입니다. 

        CREATE TABLE ADDRESS(
               ZIP    VARCHAR(12),
               STREET VARCHAR(200),
               CITY   VARCHAR(100),
               STATE  VARCHAR(100),
               PRIMARY KEY(ZIP)
        );
        cs


         그 다음, 아래와 같은 문장으로 CUSTOMERS 테이블을 수정합니다.

        CREATE TABLE CUSTOMERS(
               CREATE TABLE CUSTOMERS(
               CUST_ID   INT         NOT NULL,
               CUST_NAME VARCHAR(20NOT NULL,
               DOB       DATE,
               ZIP       VARCHAR(12),
               EMAIL_ID  VARCHAR(256),
               PRIMARY KEY(CUST_ID)
        ); 
        cs


         전이 종속성을 없애는 것은 두 가지 측면에서 이점을 가집니다. 첫 번째로 데이터 중복의 수가 감소하고, 이로 인해 테이터베이스의 규모가 보다 작아집니다. 

         두 번째 이점은 데이터 무결성입니다. 중복된 데이터가 바뀔 때,  특히 변경할 데이터들이 데이터베이스의 서로 다른 다수의 장소에 분산되어 있다면 단지 몇 개의 데이터를 업데이트하는 것만으로도 큰 위험이 따릅니다. 예를 들어, 주소와 우편번호 데이터가 세 개 또는 네 개의 가각 다른 테이블에 저장되어 있다고 한다면, 우편번호 상의 몇 가지 변화는 세 개 또는 네 개의 테이블의 모든 레코드에 영향을 끼치게 될 것입니다.


    'SQL' 카테고리의 다른 글

    4. SQL 문법  (0) 2019.04.11
    3. SQL RDBMS 데이터베이스의 종류  (0) 2019.04.03
    2-3. 데이터 무결성  (0) 2019.03.27
    2-2. SQL 제약조건  (0) 2019.03.19
    2-1. SQL의 RDBMS 개념  (0) 2018.12.02
Designed by Tistory.