<aside>
❗
데이터베이스 모델링(Database Modeling)이란
- 데이터베이스를 어떻게 분류해서 저장할지를 설계하는 행위를 데이터베이스 모델링이라고 한다.
→ 필요할 때 쉽게 조회 및 수정, 삭제 가능
- 데이터 모델링, 데이터베이스 설계(DB 설계)라고도 부른다.
왜 배우는가 ??
- 특정 규칙을 가지고 일관되게 데이터를 저장할 수 있게되기 때문
→ 효율적으로 데이터를 다룰 수 있게 됨
- 실제 운영 서비스들은 주로 데이터의 종류와 양이 아주 많음
- 규칙성 없이 저장했다가 데이터끼리 꼬일 수 있다.
</aside>
<aside>
❗
관계형 데이터베이스의 기본 구조
- 관계형 데이터베이스는 여러 테이블로 구성됨
- 테이블은 열과 행으로 이루어져 있다.
</aside>
<aside>
❗
PK(기본키), FK(외래키)
<aside>
❗
PK(기본키)
- 특정 데이터를 식별하기 위한 고유값
- PK는 중복되어서는 안 되며, 비어 있어서도 안 된다.
- 또한 바뀔 가능성이 있는 값으로 설정해서는 안 된다.
→ 혼란을 야기하고 성능에도 안 좋다.
- 현업에서는 Auto Increment(숫자 1씩 증가) 방식이나 UUID(랜덤값)으로 설정
즉, 서비스와 관련 없는 별개의 값을 사용하는 것이 좋다.
</aside>
<aside>
❗
FK(외래키)
- 다른 테이블의 데이터와 관계를 연결하기 위한 키
- 일반적으로 기본키를 FK로 많이 사용
다른 테이블의 기본키와 고유키(UNIQUE)로 설정 가능
</aside>
- posts 테이블 입장에서 user_id 속성은 **외래키(FK)**이다.
참조 무결성
- 적절하지 않은 FK를 넣었을 때, DB에서 에러를 발생시킨다.
- 즉, 적절하지 않은 FK를 넣는 걸 방지해준다.
- 이를 참조무결성이라고 한다.
- 참조무결성은 말 그래도 [참조할 때 **결점(모순되는 점)이 없도록 유지하는 특성]**을 의미
- 데이터 일관성 보장 - FK가 가리키는 PK가 부모 테이블에 존재해야 함
- 데이터베이스 무결성 유지 - 부모 PK를 삭제할 때, PK를 참조하는 FK가 있으면
오류를 발생하거나 Cascade 옵션을 사용해 함께 삭제
- 데이터 타입 호환성 - PK의 타입과 FK의 타입이 일치해야 함
</aside>
<aside>
❗
데이터베이스 네이밍 규칙
- 테이블명과 컬럼명을 지을 때, 소문자로만 작성한다.
- 운영체제에 따라 대소문자를 구분하기도 구분하지 않기도 함
snake_case를 사용한다.
- 대소문자를 사용하지 못하기 때문에 단어를 구분하려면 띄어쓰기를 해야 함
하지만 띄어쓰기를 할 수 없으므로 단어를 구분하기 위해 snake_case를 사용 추천
축약어를 사용하지 않는다.
- 여러 명이 같이 개발을 하기 때문에 남들도 알아볼 수 있도록 작성해야 한다.
fst_nm // 나쁜 예시
first_name // 좋은 예시
SQL문을 작성할 때, 예약어만 대문자로 표현해라
- SQL문법 자체는 대소문자를 구분하지 않지만
- 가독성을 위해 예약어만 대문자로 작성하는 것이 좋다.
SELECT name, age
FROM users
WHERE age = 20
AND name = '재성';
테이블명을 지을 때는 복수형을 사용한다. (선택)
- 여러 개의 데이터를 가지고 있음을 나타낼 때 주로 사용
- 회사마다 다르기 때문에 선택해서 사용
- 일관되게 단수형을 사용할지 복수형을 사용할지 결정해야 한다.
user
users
post
posts
</aside>
DB 설계시 몰라도 설계할 수 있음 개념들
DB 설계 시 꼭 기억해야 할 핵심 원칙 1가지
<aside>
❗
DB 설계의 핵심은 ‘중복 없애기’
이것만 기억하면 된다.
- 위의 표와 같이 게시글 데이터가 DB에 많이 쌓여있다고 가정하자. 여기서
박재성
이 쓴 게시글이 3개가 있다고 하자. 그러다 어느 날 박재성
이라는 사람이 박지성
으로 개명을 했다. 그래서 게시글에 작성된 작성자의 이름도 전부 박재성
에서 박지성
으로 고쳐주어야 한다. 그럼 위 게시글의 모든 데이터를 뒤져서 박재성
이라는 이름을 전부 찾아서 박지성
으로 고쳐야 한다.
- 그런데 위 테이블에서 1, 2번 게시글의 작성자 이름만 고치고, 실수로 132번의 게시글을 안 고쳤다. 그러다 6개월 정도가 지난 후 132번 게시글에 신고가 들어왔다. 그런데 데이터베이스에서 작성자 이름인
박재성
이라는 사용자를 암만 뒤져도 안 나오는 것이다. 즉, 데이터가 꼬여버린 것이다.
- 이런 문제가 발생한 가장 근본적인 이유는 데이터 중복 때문이다. 중복되는 데이터가 많으면 많을수로 무언가를 수정할 때 중복되는 모든 데이터를 찾아서 고쳐야 한다. 이 때, 실수로 중복된 데이터를 누락해서 수정을 하지 않는 경우가 발생하고, 이렇게 되면 데이터들 사이에 모순이 생겨버린다.
- 저장된 데이터들 중에서 모순되는 상황이 생긴 현상을 보고 이상현상(Anomaly)라고 얘기한다.
위의 경우 이상현상 중 갱신이상에 해당한다. DB 설계할 때, 이 용어는 하나도 중요하지 않음
정리
- 데이터 중복으로 인해 발생할 수 있는 문제를 이상현상이라고 부른다.
- 이상현상을 해결하기 위해 정규화 과정을 거친다.
이런 문제를 해결하기 위해 만들어낸 DB 설계 방법이 정규화이다.
정규화
- 데이터들 사이의 발생한 모순의 근본적인 원인이 데이터 중복이다.
→ 이를 해결하려면, 데이터 중복을 없애야 함
매우 중요 !!!!
- DB를 설계하면서 중복을 없애는 과정이 정규화이다.
- 정규형에는 총 6가지 종류의 정규형이 있다. 하지만 실제 현업에서 적용시키는 정규형은 1정규형, 2정규형, 3정규형이다. BCNF, 4정규형, 5정규형을 적용시키면 지나치게 테이블이 분리되어서 관리가 복잡해지기 때문이다.
- 각 정규형을 보면 너무 어렵게 느껴진다. 위 의미를 이해하는 데까지만 해도 시간이 너무 오래 걸린다. 하지만 실제 현업에서는 위의 정규형을 하나하나씩 떠올리면서 설계하지 않는다. 위의 각 정규형 의미를 모르더라도 DB를 설계하는 방법을 알려줄 예정이다. 내가 알려준 방법대로만 DB 설계를 하고 난 뒤에 결과물을 보면, 1정규형~3정규형을 전부 다 지킨 테이블이 설계가 된다.
정리
- 데이터 중복이 생기게 설계하면, 데이터끼리 꼬이게 된다.
데이터 중복이 발생하지 않도록 설계해야 한다.
참고
참고) 면접용 답변 방법
RDBMS에서 데이터 모델링을 할 때는 정규화를 통해 데이터 중복을 최소화할 수 있게 설계해야 합니다. 그래야 삽입 이상, 수정 이상, 삭제 이상과 같은 이상현상을 방지할 수 있으며 데이터 무결성을 지킬 수 있습니다.
</aside>
DB 설계 전체 과정
<aside>
❗
1. 저장해야 하는 데이터 파악하기
- 데이터베이스를 설계하기 전에 어떤 데이터를 저장해야 하는지 파악해야 한다.
그러려면 대략적인 UI(화면) 디자인이 나와있어야 한다.
** 디자인을 보고 필요한 데이터를 추출해야한다.
- UI 디자인이 나오기 전이라면 요구사항이라도 정리되어 있어야
어떤 데이터를 저장해야 하는지 파악할 수 있다.
2. 그룹핑해서 분류하기
- 저장해야 하는 데이터를 묶어서 그룹핑할 수 있는 상위 개념을 찾아야 한다.
[예시]
- 아이디, 패스워드, 이름, 이메일 → 사용자
- 영화 이름, 영화에 출연한 배우, 영화 상영 시간 → 영화
- 게시글 제목, 게시글 내용, 게시글 생성 시간 → 게시글
3. 6가지 규칙을 적용시키면서 테이블 분리해나가기
</aside>
<aside>
❗
저장할 데이터 파악하기 / 그룹핑해서 분류하기
[요구사항]
현업에서 아래와 같이 글로만 된 요구 사항만 가지고 DB 설계를 하는 일은 잘 없다. UI(화면) 디자인이 나왔을 때 UI 디자인을 보면서 DB 설계에 들어가는 편이다. 하지만 지금은 연습을 하기 위함이니까 아래 요구사항만 가지고 설계를 해보자.
- 회원가입 기능
- 로그인 기능
- 게시글 작성 기능
- 게시글 조회 기능
저장할 데이터 파악하기
- 요구 사항을 보고 어떤 데이터를 저장할지 파악해야 함
→ 이를 파악해야 어떤 방식으로 데이터를 분류해서 저장할지 결정 가능
- 언젠가는 이 데이터를 꺼내쓰거나 조회할 일이 있을 것 같으면 저장
- 회원가입 기능
- 로그인 기능
- 게시글 작성 기능
- 게시글 조회 기능
그룹핑해서 분류하기
- 데이터를 묶어서 그룹핑 할 수 있는 상위 개념이 필요
그룹핑 된 하나의 그룹을 엔티티라고 한다.
[엔티티 VS 릴레이션]
엔티티 - 현실 세계의 객체나 개념을 나타내는 모델(개념적 구조)
즉, 상위 개념이 엔티티
Ex) 학생, 수업, 교수
</aside>