Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 오버플로우
- 코루틴
- 팁
- C#
- File
- 키보드
- JSON
- 리액트네이티브
- Explicit Conversion
- 명시적형변환
- 중단
- OnMouseClick
- 저장
- Subscribe
- Fetch
- Unity
- useEffect
- oveflow
- 리액트
- 불러오기
- implicit Conversion
- 유니티
- >.NET
- 훅
- 암시적형변환
- 마우스
- 구독
- GetKey
- stopcoroutine
- 클래스
Archives
- Today
- Total
Log to grow
[rdbms] DB schema 설계시 주의할 점 2가지(확장성, 정규화) 본문
DB를 설계할 때 쉽게 실수할 수 있는 부분이 2가지 있다.
바로 확장성을 고려하지 않는 것과 정규화를 하지 않는 것이다.
이 경우, 데이터의 구조가 변했을 때 쉽게 설계를 수정할 수 없고, 중복 레코드를 발생시킨다.
1. 확장성
1.1 Primary key에 의미를 부여하지 말자.
primary key는 just index로서의 역할만할 뿐, 의미를 부여하는 순간 확장성이 무너진다.
1.2 NULL을 허용해야 하는지 고려하자.
- 반드시 속성의 값이 존재해야 하는지 꼭 고려해야 한다.
ex) 학교에서의 특수반 -> 특수반은 모든 학년이 포함될 수 있으므로 학년 ID(FK)가 NULL일 수 있음
student_id (PK) | student_name | grade (FK) | class | |
1 | 김철수 | 1 | 1 | |
2 | 박영희 | 2 | 3 | |
3 | 바둑이 | NULL | 특수반 |
- NULL은 수집되지 못한 데이터를 뜻하기도 한다.
만약 어떤 속성에 NULL을 허용하지 않았다면, 이 속성이 수집되지 않았을 때 표현할 수 있는 방법이 없다.
이 경우 수집되지 않은 데이터에 대한 처리를 위해 가능성이 있다면 반드시 NULL을 허용해야 한다.
1.3 고정관념으로 column을 생략하지 말자.
위와 똑같은 예제로 설명할 수 있다.
어차피 반은 1,2,3반이니 class 속성을 int로 정의하고 class_name을 생략한다고 하면 특수반을 고려할 수 없다.
또한, 어떤 학교는 반에 이름을 붙여 표시한다면 (우반, 열반) 이 경우 표현할 수 없다.
student_id (PK) | student_name | grade (FK) | class_id(FK) | class_name |
1 | 김철수 | 1 | 1 | NULL |
2 | 박영희 | 2 | 3 | NULL |
3 | 바둑이 | NULL | 10 | 특수반 |
2. 정규화
2.1. 속성은 반드시 하나의 값을 가져야 한다. (제 1 정규화)
- 정규화 되지 않은 table
user_id | user_name | device |
1 | 김철수 | 아이폰 12, 갤럭시s20 |
device 칼럼에 두 개의 값이 포함되어 있으므로 정규화에 어긋난다.
따라서, 두 개의 테이블로 나눠 정규화한다.
- user 테이블
user_id | user_name |
1 | 김철수 |
- device 테이블
id | user_id | device |
1 | 1 | 아이폰 12 |
2 | 1 | 갤럭시s 20 |
'BE > rdb' 카테고리의 다른 글
[mysql] mysql 로컬 서버 실행 오류로 접속이 안될 때 (0) | 2020.11.21 |
---|---|
[rdbms] 7가지 꼭 지켜야할 네이밍 규칙 (naming convention) (1) | 2020.11.10 |
Comments