프로젝트 하면 뭐가 어렵나요? 저는 무조건 설계요...😒
프로젝트의 모든 과정이 힘들겠지만 유독 설계가 어렵다.
이론을 제대로 이해해야 최적화가 되고 경험이 부족하면 잘못된 길로 빠지고... 흑흑 너무 어려워....
어렵다고 안하면 취업에 실패해 은행을 털다 감옥에 들어가기 때문에 확실히 정리해보자.
정보처리기사를 취득한 사람이라면 모두가 알고있을 개논물(개념 - 논리 - 물리)이 DB 설계의 과정이다.
요구사항 분석
개념적 설계
논리적 설계
물리적 설계
딱딱한 이론을 게시판 예제로 물렁하게 만들어보자
요구사항 분석 ➡️ 게시판에 뭐가 필요하지? (회원정보, 게시글, 게시판, 댓글, 로그인 정보 등등)
개념적 설계 ➡️ 요구사항 분석을 통해 게시판에 필요한 데이터들을 파악한 후 관계 설정 (ER 다이어그램으로 표현)
논리적 설계 ➡️ 개념적 설계에서 한 관계 설정과 데이터들을 표로 만들자
테이블과 컬럼 정의 + 속성 및 제약조건 설정
뭔가_엄청_멋있는 SQL 근데 게시판을 만들어주는
혼공SQL에서 배우는 내용의 대부분이 물리적 설계!
"게시판"을 낱낱히 모든 것을 해부한다는 마음가짐..
DB 설계를 하면 가장 먼저 하게되는 단계이면서 가장 쉬워보이는 단계이다. 하지만 제일 중요하고 가장 어려운 단계라 생각한다.
요구사항 분석은 기능적/비기능적 요구사항으로 구분하는데 DB 설계 시 항상 고민해야하는 부분이다.
그럼 게시판을 예시로 요구사항을 도출해보자!
최대한 간단히 도출했는데도 DB에 적용하려면 생각할 부분이 엄청 많은 것을 볼 수 있다.
혼공SQL에서 배운 제약조건, 기본키-외래키 관계 설정 등 다양하게 생각을 하며 최적화를 해야한다
요구사항 분석을 통해 개체와 속성, 관계를 도출하고 ERD로 작성하는 과정이 개념적 설계이다.
1. ERD (Entity - Relationship Diagram)
Entity = 개체, Relationship = 관계
즉, 개체와 관계를 중점으로 만든 다이어그램을 의미한다
개체(Entity)
속성(Attribute)
관계(Relationship)
E-R 다이어그램에서 릴레이션 스키마를 만들려면 규칙이 필요하다.
모든 개체는 릴레이션으로 변환
다대다(N:M)관계는 관계를 릴레이션으로 변환
1:N 관계는 외래키로 표현
약한 개체가 참여하는 1:N 관계는 외래키를 포함해 기본키로 지정
1:1 관계는 외래키로 표현
다중 값 속성은 독립 릴레이션으로 변환
지금까지 배워온 모든 SQL 작성법을 통해 논리적 설계 내용을 토대로 실제 데이터베이스를 구현하는 과정
레시피(설계 과정)대로 했는데 맛없다. ➡️ 디테일(정규화)의 부족
정규화는 ERD 내에서 중복요소를 찾아 제거하는 과정
그럼 정규화는 어떻게 하는걸까?
➡️ 암스트롱의 공리(Armstrong's Axioms)와 함수 종속성 (Functional Dependency)을 알아야한다.
정규화를 위해 함수 종속성을 파악해야하고 함수 종속성을 파악하기 위해 암스트롱의 공리를 이용한다고 이해하면 된다....! 정확하지 않음
관계형 데이터베이스는 이산수학의 relation 및 function의 개념을 이용해 정의되었기 때문에 그 성질 또한 이산수학의 개념과 유사하다.
순수한 이론이고 이를 이용해 함수 종속성을 파악할 수 있다.
구분 | 추론 규칙 | 설명 |
---|---|---|
기본 | 재귀적 규칙(reflexivity rule) | Y가 X의 부분 집합이면 X→Y, X⊇Y이면 X→Y이다. |
기본 | 확대의 공리(augmentation rule) | X→Y이면, XZ→YZ |
기본 | 이행의 공리(transitivity rule) | X→Y이고 Y→Z이면 X→Z |
부수 | 합집합의 성질(union rule) | 만약 X→Y이고 X→Z이면 X→YZ |
부수 | 분해 규칙(decomposition rule) | X→YZ이면 X→Y이고 X→Z |
부수 | 유사 이행 (pseudo transitivity) | 만약 X→Y이고 YZ→W이면 XZ→W |
함수 종속성?
함수 종속성의 종류
결정자 함수 종속성 (Boyce-Codd Normal Form, BCNF)
➡️ 함수적 종속성이 되는 결정자가 후보키가 아닌 경우
➡️ X→Y 에서 X가 후보키가 아님
➡️ 교수→과목
➡️ Boyce/Codd 정규화 대상
다중값 종속성 (Multivalued Dependency, MVD)
➡️ 한 관계에서 둘 이상의 독립적인 다중값 속성 존재하는 경우
➡️ 4차 정규화 대상
조인 종속성 (Join Dependency)
➡️ 관계 중 둘로 나눌 때에 원래의 관계를 회복할 수 없지만 셋 또는 그 이상으로 분리하면 복원 가능한 경우
➡️ 5차 정규화 대상
함수적 종속의 문제
함수적 종속성이 어떤 문제를 일으키는가?
앞에서 정규화는 ERD 내의 중복요소를 찾아 제거하는 과정이라 설명했다. 실제로 데이터베이스의 중복은 여러 문제를 일으키는데 이것을 이상(Anomly)
이라 한다.
제 4,5 정규화를 사용해야하는 함수적 종속성이 있지만 대부분 제 1,2,3 + Boyce/Codd 정규화를 시도한다.
그 이유는 어느 정도의 중복을 인정하는 것이 더 효율적이기 때문이다. 즉, 제 4,5 정규화는 고도 정규화로 오히려 쿼리 성능 및 유지 관리 작업에 영향을 미친다는 뜻이다.
제 1 정규화
테이블의 컬럼이 원자값(Atomic Value)을 갖도록 테이블을 분해
말이 어려우니 바로 예제로 알아보자
예시)
추신수와 박세리 선수는 취미가 두 개씩 있다. 이는 원자값이 아니므로 제 1 정규형을 만족하지 않는다.
수학에서 배운 함수와 비슷하게 받아들이면 된다. 하나의 x값에 y값이 두 개 있는 느낌
적용)
제 1 정규화를 적용하면 아래와 같은 결과가 나온다. (컬럼이 원자값으로만 구성된 모습 확인)
제 2 정규화
제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족 하도록 테이블을 분해
예시)
적용)
강좌이름→강의실의 새로운 테이블을 생성해서 정규화를 진행
모든 데이터가 완전 함수 종속을 만족
제 3 정규화
제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
이행적 종속이란 단어가 익숙하지 않으니 비슷한 삼단논법이라 생각하자.
예시)
적용)
BCNF 정규화
제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록테이블을 분해하는 것
예시)
적용)
DB 설계의 과정, 정규화 과정의 정확한 개념
데이터베이스 설계와 정규화 모두 데이터 중복성을 줄여 효율적이고 확장 가능한 데이터베이스를 생성할 수 있게 도와준다.
기능 종속성을 이해하고 데이터베이스 설계 과정에 활용함으로써 비즈니스 요구 사항을 충족할 수 있다
출처
<ERD, 데이터베이스 모델링>
https://mangkyu.tistory.com/27
https://nirsa.tistory.com/99
rawfish님 velog
https://siyoon210.tistory.com/26
https://behappyaftercoding.tistory.com/30
https://victorydntmd.tistory.com/126
frank님 블로그
<정규화>
https://needjarvis.tistory.com/610
https://mangkyu.tistory.com/28
Inpa님 블로그 - 역정규화와 정규화에 대한 방법에 대한 부연 설명
https://ybdeveloper.tistory.com/86