😈 오타 발견 p162
- ER다이어그램으로 나타내다 : 밑에서 5번째 (entityt)-> entity
정규화
- 데이터베이스 안에 있는 데이터를 정리하는 순서.
- 정규화를 진행하면 이렇게 불필요하게 발생하는 데이터 중복을 줄일 수 있고, 데이터를 관리하기 쉬운 구조로 만들 수 있다.
같은 데이터가 여러 곳에 흩어져 있는 일이 없어지기 때문에 데이터를 변경하고 싶은 경우, 수정 범위를 최소한으로 좁힐 수 있다.
수정을 하면서 누락이 발생하는 것을 방지하므로 데이터의 모순을 예방
제 1정규형
릴레이션에 속하는 속성 값이 모두 원자값만으로 구성되어야 한다.
- 원자값 : 더 이상 쪼개질 수 없는 단위를 말한다.
- 하나의 데이터 안에서 반복적으로 나오는 항목이 배제되어 있다.
제2정규형
- 제1정규형이면서, 기본키에 속하지 않은 속성 모두가
기본키에 완전함수 종속인 정규형- 컬럼에 대응하여 값이 정해지는 종속 관계 컬럼이 있는 경우 해당 컬럼을 다른 테이블로 분리시킨다.
- 행을 하나로 특정할 수 있는 컬럼과 종속관계인 것을 다른 테이블로 분리
제3정규형
- 제2정규형이면서, 이행적 함수 종속성을 제거한 정규형
- 기본키 이외의 속성이 그 외 다른 속성을 결정할 수 없는 것
- 제2정규형 후, 그 외의 종속 관계가 존재하는 컬럼을 다른 테이블로 나눔
종속 관계를 제거함으로써 동일한 데이터가 여러 레코드에 걸쳐 등록되는 것을 막을 수 있고,
나중에 정보를 편집할 때 하나의 값을 바꾸면 다른 대응되는 데이터 모두에 반영된다.
제3정규형을 하면 종속관계가 없어져 데이터의 부정합이 일어나는 것을 막을 수 있다.
1) 데이터 타입은 컬럼마다 저장하는 값의 포맷에 따라 숫자형, 문자열형, 날짜형 등을 부여
2) 제약이나 속성과 관련하여 초깃값을 설정할 것인지 여부
3) 데이터가 비어있는 상태를 허용하지 않도록 할 것인지 여부
4) 다른 레코드와 같은 값을 넣을 수 없도록 부여할 것인지 여부
5) 자동으로 순번을 저장할 것인지 여부
6) 제약을 부여할 것인지 여부
<명명규칙>
- 테이블 이름이나 컬럼 이름에는 영어와 숫자, 언더바(underbar)만을 사용
- 대문자를 쓰지 않고 모두 소문자로 통일하여 첫 글자에 숫자는 쓰지 않는다
- 테이블 이름은 복수형으로 한다
- 다른 사람이 이해하기 쉬운 이름으로 짓는다(줄임말은 피한다)
- 다른 테이블의 주 키와 join하기 위한 컬럼은
테이블 이름(단수형태)_id
로 통일한다(user_id, item_id)등
- 컬럼에 어떤 종류의 값이 저장되어 있는지 알 수 있게 한다(boolean형의 경우
is_OOO
, 날짜의 경우OOO_at
등)
- 컬럼 이름에
OOO_flag
는 피한다.(예를 들어 delete_flag가 아닌is_delete
로 하면 true일 때 삭제된 상태라는 것을 알 수 있음
동의어 : 다른 이름인데 같은 의미를 가진 단어
ex) item이나 product 둘 중 하나로 통일
동음이의어: 같은 이름인데도 다른 의미
ex) 판매자와 구매자를 저장할 때 모두 user라고 하는 이름을 붙이면,
구별할 수 없게 되어버려 혼란의 근원이 된다.
이러한 경우에는 seller나 buyer 등의 이름을 생각할 수 있다.
요구사항 정의를 통해 엔티티(Entity)와 속성(Attribute)을 추출한다.
페이지에 기능으로 이용할 필요가 있는 정보고 기재해 나간다.
요구사항 정의나 ER 다이어그램 등의 내용에 따라 필요한 테이블이나 컬럼을 정하는 테이블 정의를 하게 된다.
만약 필요하다면 정규화를 실시하고 테이블을 분리하는 것 등도 검토한다.
ER 다이어그램에서는 즐겨찾기 기능으로 인해 사용자와 책은 다대다 관계
사용자 테이블과 책 테이블 사이에 즐겨찾기 테이블을 새로 만들고,
양쪽 테이블의 ID를 저장하는 컬럼을 만들어두면, 양쪽 테이블을 연결 시킬 수 있다.
한 사용자와 여러 개의 책, 한 권의 책에서 여러 사용자와 결합할 수 있어 다대다를 실현할 수 있다.
컬럼에 부여하는 데이터 타입과 제약, 속성을 결정한다.
각각의 테이블에 id
컬럼은 다른 레코드 값과 중복되지 않도록 주 키로 하고 자동으로 순번을 부여하도록 함
다른 테이블과 관계를 맺기 위해 ID를 저장하는 컬럼은
테이블명(단수계열)_id
로 통일하고 외부키로 했다.
books 테이블 등록일자를 저장하는 컬럼은 날짜가 저장되는 컬럼이라는 것을 알 수 있도록 OOO_at
으로 되어있다.
소규모의 데이터베이스라면 중간 과정을 생략하거나 익숙해지면,
제1정규형, 제2정규형……이라고 하는 것을 의식하지 않아도 자연스럽게 정규화된 테이블 설계를 할 수 있을 것이다.
프로젝트 규모나 만드는 시스템, 자신의 스킬(skill)에 따라 설계 수단을 구분하여 사용한다.