728x90
반응형

DataBase 설계 시 고려해야 하는 것 중엔 정규화와 비정규화(역정규화)가 있다.

정규화

  • 데이터 중복을 최소화하고 무결성을 유지하는 과정

장점

    • 데이터 모델을 여러 작은 테이블로 분해
  • 각 테이블이 하나의 주제에 집중하도록 설계
  • 데이터 중복 줄이고, 업데이트 이상 현상 방지
    • 저장 공간 효율적, 데이터 무결성 보장
    • 데이터베이스 구조의 단순화
    • 데이터 간의 관계가 명확해짐

단점

  • 그러나 과도한 정규화는 쿼리 복잡도 증가시킴 (JOIN)
  • 성능 저하도 가능

정규화 과정

제 1 정규화 (1NF)

  • 테이블의 칼럼이 원자값(Atomic Value: 하나의 값)을 갖도록 테이블 분해
    • 각 칼럼이 하나의 속성만을 가져야 함
    • 하나의 칼럼은 같은 종류나 타입의 값을 가져야 함
    • 각 칼럼이 유일한 이름을 가져야 함
    • 칼럼의 순서가 상관없어야 함
이름 나이 수강과목
홍길동 20 C,C++
이순신 21 Java
이도 34 DB, 운영체제

에서

이름 나이 수강과목
홍길동 20 C
홍길동 20 C++
이순신 21 Java
이도 34 DB
이도 34 운영체제

제 2정규화(2NF)

  • 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 분해하는 것
  • 부분적 종속: 기본키 중에 특정 칼럼에 종속되는 것
  • 완전 함수 종속: 기본키의 부분집합이 결정자가 되어선 안됨을 의미
  • 조건
    • 제 1 정규화를 만족해야함
    • 모든 칼럼이 부분적 종속이 없어야 함.
    • 모든 칼럼이 완전 함수 종속을 만족해야 함
이름 수강과목 강사명 성적
홍길동 C 광해군 95
홍길동 C++ 선조 100
이순신 Java 선조 70
이도 DB 세종 80
이도 운영체제 태종 85
  • 특정 학생의 성적을 알기 위해선 이름과 수강과목을 알아야 함
  • 특정 과목의 강사는 과목명만 알면 알 수 있다.
  • 위 테이블의 기본키는 이름과 과목으로, 복합키이다.
  • 반면 지도교수 칼럼은 과목에만 종속되므로, 제 2정규화를 만족하지 않음
이름 수강과목 성적
홍길동 C 95
홍길동 C++ 100
이순신 Java 70
이도 DB 80
이도 운영체제 85
강사명 수강과목
광해군 C
선조 C++
선조 Java
세종 DB
태종 운영체제

으로 테이블을 나눈다는 의미


제 3정규화

  • 이행적 종속(Transitive Dependencies) 을 없애도록 테이블을 분해함
  • 이행적 종속: A -> B, B -> C이 성립할 때, A -> C이 성립함을 의미함
  • 조건
    • 제 2 정규화를 만족해야 함
    • 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.
ID 등급 할인율
101 VIP 70%
102 Gold 40%
103 Bronze 20%
  • 이렇게 데이터가 있으면, ID 를 통해 할인율을 알 수 있다
    • 따라서 제 3정규형을 만족하지 않는다.
ID 등급
101 VIP
102 Gold
103 Bronze
등급 할인율
VIP 70%
Gold 40%
Bronze 20%

BCNF (Boyce-Codd Normal Form)

  • 제 3정규형을 좀 더 강화한 버전
  • 조건
    • 제 3정규형을 만족해야 함
    • 모든 결정자가 후보키 집합에 속해야 함
      • 후보키 집합에 없는 칼럼이 결정자가 되어선 안된다는 의미
이름 수강과목 지도교수
홍길동 C 광해군
홍길동 C++ 선조
이순신 Java 선조
이도 DB 세종
이도 운영체제 태종
* 강사의 이름을 이름과 과목으로 조회할 수 있다.
* 그러나 같은 과목을 다른 강사가 가르칠 수 있기 때문에, 수강과목 -> 지도교수 이란 종속은 성립하지 않음
* 하지만 지도교수 -> 수강과목이라는 종속은 성립
이름 지도교수
홍길동 광해군
홍길동 선조
이순신 선조
이도 세종
이도 태종
지도교수 수강과목
광해군 C
선조 C++
선조 Java
세종 DB
태종 운영체제
으로 나눌 수 있다.

제 4정규화

  • 일반적으로 BCNF 정규화까지만 함
728x90
반응형
728x90
반응형
  • 디자인 패턴은 코드를 잘 작성할 수 있도록 하는 지침서. 레시피라고 말할 수 있다.

생성 패턴

싱글톤 패턴 Singleton

  • 하나의 클래스 인스턴스를 전역에서 접근 가능하게 함
  • 따라서 해당 인스턴스가 한 번만 생성되도록 보장

팩토리 메서드 패턴 Factory Method

  • 객체를 생성하기 위한 인터페이스를 정의하고 서브 클래스에서 어떤 클래스를 인스턴스를 생성할지 결정하는 패턴

추상 팩토리 패턴 Abstract Factory

  • 관련된 객체들의 집합을 생성하는 인터페이스 제공
  • 구체적인 팩토리 클래스를 통해 객체 생성을 추상화하는 패턴

빌더 패턴 Builder

  • 복잡한 객체의 생성 과정을 단순화하고, 객체를 단계적으로 생성하며 구성하는 패턴

프로토타입 패턴 Prototype

  • 객체를 복제하여 새로운 객체를 생성하는 패턴
  • 기존 객체를 템플릿으로 사용
728x90
반응형
728x90
반응형

솔리드 (SOLID) 원칙

  • 솔리드 원칙은 코드를 올바르게 사용할 수 있게 하는 지침서이다
  • 여담으로 디자인패턴은 코드를 잘 만들 수 있게 하는 레시피이다.

단일 책임 원칙 (Single Responsiblity Principle; SRP)

  • 소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.

개방 폐쇄 원칙 (Open Close Principles; OCP)

  • 확장에 대해선 열려 있어야 하고 수정에 대해선 닫겨 있어야 한다.

리츠코프 치환 원칙 (Liskov Substitution Principle; LSP)

  • 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.

인터페이스 분리의 원칙 (Interface Segregation Principle; ISP)

  • 하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.

*의존관계 역전 원칙 (Dependency Inversion Principle; DIP) *

  • 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.
728x90
반응형

'백엔드 Backend' 카테고리의 다른 글

[결합도/응집도] 결합도와 응집도란  (0) 2024.10.24
악성코드 종류  (0) 2024.10.16
비동기 Asynchronous 란?  (0) 2024.10.04
[백엔드] REST API 란?  (0) 2024.09.27
[백엔드] gRPC란  (3) 2024.09.26

+ Recent posts