SQL

데이터 모델 설계

안자바먹지 2019. 10. 7. 13:33
728x90

1. 모든 테이블에 기본키가 있는지 확인하자

    - 기본키의 후보군 : 유일한 값, 널 값을 가질수 없음, 안정적인 값(갱신할 필요없는 값) , 가능한 간단한 형태

    - 참조무결성 : 외래키가 설정된 자식 테이블의 각 레코드와 일치하는 레코드가 부모 테이블에 존재 하는것

    - 기본키를 정의할 때 대부분의 데이터베이스 시스템은 해당 컬럼에 유일 인덱스를 같이 만든다.

    - 일반적으로 기본키로 조인을 수행하는데, 기본키가 여러 컬럼으로 구성되어 있으면 쿼리가 복잡하고 더 느리다.

    - 하지만 특정한 상황에서는 여러 컬럼을 기본키로 사용하는것이 마땅함 (품목id와 벤더id의 조합처럼...)

    

 

2. 중복으로 저장된 데이터 항목을 제거하자

    - 여기서의 중복의미는 사용자가 동일한 데이터를 한 군데 이상에서 입력하는 상황에 더 가까움

    - 정규화의 목표 : 한 데이터베이스에서 동일한 테이블이든 다른 테이블이든 반복되는 데이터를 최소화 하는것

    - 그래서 테이블을 분할해서 관리함 (ex : 고객,직원,자동차모델,판매 거래내용)

 

 

3. 반복그룹을 제거하자

    - 영향도(비용) 측면에서 컬럼은 비싸고 로우는 싸다. 필요할때 로우를 추가하거나 제거하도로 설계하는 것이 바람직

 

 

4. 컬럼당 하나의 특성만 저장하자

    - 단일컬럼에 특성 값을 두개 이상 저장하는 것은 좋은생각이 아니다.

    - 이름과 성, 주소가 있을때 거리이름,주,동 으로 검색하기 어려울 수 있음

 

 

5. 왜 계산 데이터를 저장하면 좋지 않은지 이해하자

    - 계산필드는 데이터 웨어하우스 시스템에서는 좋을지 몰라도 운영중인 데이터베이스 성능에는 심각한 영향을 미칠        수 있음

    - 계산필드 (ex : 수량 * 합 -> 가격)

    - 계산 컬럼을 현행화 하는 가장 원시적인 방법은 계산에 사용되는 원천 컬럼이 있는 테이블에 트리거를 추가하는

      것 이다. 하지만 트리거는 작성도 어렵고 비용도 비쌈.

    - 몇몇 데이터베이스 시스템에서는 테이블을 생성할 때 계산 컬럼을 정의하는 방법을 제공한다.

    - 오라클 : GENERATED ALWAYS AS ( price * quantity )...

    - 이렇게 만든 컬럼은 index로 사용할 수 없다. 또 부하가 많이 걸림

 

 

6. 참조무결성을 보호하려면 외래키를 정의하자

     - 데이터베이스 스키마를 제대로 설계하려면 관련된 부모 테이블의 기본키 값을 포함하도록 테이블에 외래키를

       정의하는것이 좋다.

     - '다' 관계에 있는 테이블을 생성할 때 FOREIGN KEY 제약조건을 추가해야 한다.

 

 

7. 테이블 간 관계를 명확히 하자

    - 이론적으로 관련 컬럼의 데이터 타입이 같으면 테이블 간에 어떤 관계든 맺을 수 있다. 하지만 반드시 하는건 아님

    

 

8. 제3정규화로도 부족하면 더 정규화 하자

    - 제1정규화 : 하나의 속성이 단일값을 갖게 하는것

    - 제2정규화 : 테이블의 모든 컬럼이 완전 함수적 종속을  만족하는것, 이 의미는 기본키 중에 특정 컬럼에만

                      종속적 컬럼이 없어야 한다. 

종업원 기술 근무지
홍길동 C 서울
홍길동 Java 서울
김철수 Python 경기도

이 테이블에서 후보키는 종업원과,기술이다. 즉 종업원과 기술은 복합키 이다. 그러므로 기본키를 제외한 컬럼은 근무지이다. 근무지는 종업원 + 기술로 정해지는게 아니라 종업원으로도 충분히 정해질 수 있다. 즉 부분적 함수종속  관계를 가지고 있는것이다.

 

    - 제3정규화 : 1정규화,2정규화를 만족하고 이행적함수종속관계를 갖지 않는것.

                      이행적함수종속관계란? 만약 A값을 알 때,B값을 알 수 있고 B값을 알 때 C값을 알 수 있는것

                      학번 -> 학과 -> 학과번호를 알수 있기 때문...

학번 학과 학과번호
1001 컴공 001
1002 화공 002

 

    - 제3정규화를 만족하는 것처럼 보이더라도 데이터 이상 현상을 일으키는 설계 실수를 쉽게 저지를 수 있다.

  

 

9. 데이터 웨어하우스에는 역정규화를 사용하자

    - 정규화를 통해 분리되었던 관계에서 중복을 허용하고 다시 통합하거나 분할하여 구조를 재조정하는것

728x90