😺Data Base/😻 SQLD

[RDBMS] 관계형 데이터 모델링 2

디카페인라떼 2022. 9. 16. 15:38

참고한 강의

 

논리적 데이터 모델링

 : ERD를 관계형 데이터베이스 모델에 어울리게 변환하는 과정

=> Mapping rule을 중점으로 보면 됨

 

논리적 데이터 모델링
  • 개념적 모델링이 잘 되어있다면 기계적으로 하면되기 때문에 상대적으로 쉬움!
  • 뽑아낸 개념을 관계형 패러다임에 어울리는 이상적인 모습으로 정리해 주는 것
  • Mapping Rule
    • erd로 표현한 내용을 관계형 데이터베이스에 맞는 형식으로 전환할때 사용하는 방법론
    • Entity -> Table
    • Attribute -> column
    • Relation ->PK,FK
 일대일 관계

  • 외래키 설정
    • 의존하는 테이블(혼자서 잘 못지냄) : 자식 (외래키)  => 휴면저자 (외래키 : author_id)
    • 의존 되는 테이블(혼자서 잘지냄) : 부모  => 저자

 

일대다 관계

  • 외래키 설정
    • n 에게 주면 됨.

 

 

다대다 관계

👉 외래키가 여러개인 경우 JOIN 불가능

  • 매핑 테이블 추가 ->erd에 추가 + 스키마에 추가
    • 두개의 테이블이 결합 시에 의미있는 정보 등을 추가 가능 
    • 스키마에만 추가하면 됨 (사진)

  • erd에 반영? (할필요가 없음)

  • 스키마에만 추가하면 됨 

논리적데이터모델링2 : 정규화 Nomalization
  • 정규화 Nomalization
    • 평범한 표를 관계형 데이터 베이스에 어울리는 표로 만드는 공정

  • 1정규화 -> 2 정규화 -> 3 정규화 .. 이런 식으로 순차적으로 바꾸는 식
제 1 정규화 
Atomic columns 각행의 각 칼럼의 값들이 원자적이어야 한다.
  • Atomic : 어떤 것이 더이상 쪼개질 수 없는 성질

1. 원자적이지 않은 칼럼 찾기 => 하나의 컬럼안에 여러개(하나초과)의 값이 들어가 있음) => tag
=> 하나의 값으로 찾기도 어렵고 (select where)
     정렬하기도 어렵고 (order by)
      join하기도 어려움

 

(1) 같은 행을 반복해서 여러개의 값을 따로 쓴다 -> 정보의 중복 발생

(2) 태그1 태그2로 나눠서 해준다 -> 태그가 추가될수록 전체 테이블의 컬럼이 추가됨 / null이 생김 (유연하지않음)

 

🚩 표를 쪼개기!

  • 토픽과 태그는 (n:m) =>매핑 테이블 필요!
  • 토픽의 PK 와 태그의 PK를 같이 쓰므로써 원자적으로 함

 

제 2정규화
No partial dependencies  부분 종속성이 없어야 한다! (부분종속성제거)
  • 표의 기본키중에 중복키가 없어야 한다! (없으면 안해도됨)
  • 부분적으로 종속되는 컬럼만 모으고 전체종속되는 정보들만 모으기

1. 부분 종속성에 따른 중복 발생

🚩 중복되는 부분을 따로 표로 만듦.

 

 

제 3 정규화
No transitive dependencies 이행적 종속성 제거

  • 이행적 종속성
    • author_id는 title에 따라 달라짐 -> author_id는 title에종속
    • author_name과 author_profile은 author_id에 종속됨
    •  => 이행적 종속성이 있다면 안좋은...것.. = 중복

  • 중복인 부분을 따로 테이블로 만듦 
    • 남은 테이블 + author_id 같이 주고
    • 중복 테이블의 중복 내용 삭제  * 외래키는 중복 허용
  •  이행적종속성이 눈에 보이지 않는 경우
    • 같은 성질인 것들은 분명 같은 PK가 있을 것이다...

 

  •  바로 하려는 것보다는 이것이 무엇이다
  •  왜 쓰는가 정도를 이해하고 아는 게 중요함.

 


물리적 데이터 모델링
  • 논리적 데이터 모델링이 관계형 데이터베이스 패러다임에 잘 맞는 이상적인 표를 만드는 것이었다면, 
  • 물리적 데이터 모델링은 선택한 데이터베이스 제품에 만는 현실적인 고려는 하는 방법론
  • 제일 중요한 것 -> 성능!
    • find slow query 병목이 발생하는 부분 찾기
    • 성능을 상향 시키기위한 행위 하기 
  • 보통 하는 것
    • index (읽기 성능 상승 / 쓰기 성능 저하)
    • application (cache 저장/데이터베이스 부하 저하)
    • denormalization (역정규화 - 표의 구조 바꾸기) : 위의 두가지다 안될 경우..최후의 방법

 

역정규화 ? Denormalization
  • 정규형으로 만든 이상적인 표를 성능이나 개발의 편의성을 위해서 구조를 바꾸는 것
  • 쓰기의 편리함을 위해 읽기의 성능을 포기
    • 정규화가 성능을 떨어뜨리는 건 아님

   1) 하나의 표안에서 컬럼 바꾸기
   2) 하나의 표를 여러개로 쪼개기
   3) 테이블과 테이블사이의 관계성을 조작해서 지름길 만들기 등등..
   
 👉  역정규화는 규칙이 있는건 아님
        엄밀한 공정이 아니라 이러한 게 있다는 샘플..
        상황에 맞게 선택하여 하면 됨.

 

역정규화 1
하나의 표 안에서 컬럼 조작하기 : JOIN을 줄이기

🚨 Join을 하게 되어 성능이 떨어짐

 

🚩중복을 허용해버림 
   => 조인을 하지않아 성능이 좋음
   -> 정규화 이전의 문제가 그대로 옴 (중복)
   -> 태그 테이블은 또 따로 그대로 있음... (문제)
   -> 프로그램이 고장날수도 있지만 역정규화를 하는 이유는 오로지 성능!

 

 

역정규화2
컬럼을 조작해서 계산을 줄이기 : 파생 컬럼의 형성 => 계산작업을 줄이기

🚨 Group By 를 하게 되어 성능이 떨어짐

 

🚩컬럼을 하나 더 추가해줌!
   -> Group by 가아니라 select만 해주면됨 (계산작업이 줄어듬)
   -> 새로 생성된 칼럼을 계속 유지하기위한 노력을 해줘야 함

 

역정규화3
표를 쪼개기
대체로 여러 대의 서버로 분산할 때 생각할 수 있는 방법

🚨한 컬럼의 양이 방대하여 성능에 문제가 생기는 경우

🚩컬럼을 기준으로 테이블을 분리
    => 컬럼의 갯수가 적어서 한계가 있음

 

🚩행을 기준으로 테이블을 분리
   => 한계가 없음..대신 관리가 힘듦

 

👉 샤딩 : 여러대의 컴퓨터로 스케일 아웃하는 것 : 어려움 (최후의방법)

      사용자가 누구냐에 따라서 데이터를 저장하는 서버가 다르게 ..  무한히 많은 처리량 가능
      관리가 어려움... 완전 코너에 몰렸을때...

 

역정규화4
관계의 역정규화 : 관계성을 조작해서 지름길을 만들기 (JOIN을 줄여서 지름길을 만들기)

🚨저자의 태그명과 태그 id를 조회희망

 

🚩저자 id 를 추가하여 (관계성 추가) join을 줄임

'😺Data Base > 😻 SQLD' 카테고리의 다른 글

[DB] Transaction - Atomicity 원자성 이해하기  (0) 2022.09.19
[DB] Index  (0) 2022.09.17
[RDBMS] 관계형 데이터 모델링 1  (0) 2022.09.14
[DB] 트랜잭션 Transaction 이란?  (0) 2022.09.10
[SQL] 기초 SQL 문법  (0) 2022.09.08