문제은행 DB 설계 분투기 4 - char과 varchar 중 선정, 새발 표기 꿀팁, 단어 길이 줄이기

양태환·2023년 9월 8일

인턴기

목록 보기
4/14

제가 그린 ERD를 사수님께 보여드리니 네이밍 규칙을 참고해서 수정하라고 하셨습니다.

그래서 수정하기 전
어떤 표기법들을 사용하는지 알아봤고

그러면서 다양한 표기법들, 데이터 타입 선택, 새발 표기법, NULL, 단어개수 줄이기를 배워봤습니다.

1. 네이밍 규칙

대표적으로는 스네이크 표기법과 카멜 표기법이 있네요 - 참조 링크

스네이크 표기법은 _ 밑줄로 각 단어를 연결해주는 방법이고 ex)snake_present
카멜 표기법은 낙타 등처럼 올록볼록하게 단어의 첫 글자를 대문자로 사용하여 연결해주는 방법입니다. ex)camelCase
어쨋든 둘 다 가독성을 높이기 위한 방법이라는 점이 포인트인 것 같습니다.

2. char과 varchar 둘 중 데이터 타입 선택 방법

type을 채워볼까 했습니다. type에 datetime을 써도 될 것 같은데 데이터는 타입을 char(14)로 해놓으셨더라고요.
그래서 varchar와 char 의 차이가 무었인지 궁금했습니다.

CHAR는 고정형 문자열, VARCHAR는 가변길이형 문자열입니다.
같은 CHAR(8), VARCHAR(8)이라도 CHAR(8)에 영문자 하나만 넣어서 1Byte 공간만 사용하고 나머지 7Byte는 비어있더라도 총 8Byte 공간이 사용됩니다.
하지만 VARCHAR(8)에는 영문자 하나만 들어가면 1Byte만 사용하게 되죠.

차이점, 공통점 - 링크
최적의 데이터 타입 선정 방법 - 링크

CHAR형
장점 : 읽어오는 속도가 빠르다.
단점 : 저장 공간이 낭비될 수 있다.

VARCHAR형
장점 : 저장 공간을 아낄 수 있다.
단점 : 읽어오는 속도가 CHAR보다 느리다.

공통점 :

  1. 문자열 데이터 타입으로 싱글쿼터('')로 값을 나타낸다.

  2. 대소문자를 구분한다.

  3. 한글은 한 글자당 3Byte(UTF-8의 경우), 영문자는 알파벳 하나당 1Byte의 크기를 가집니다.

  4. 설정된 크기를 초과할 경우, 메모리를 초과한 나머지 값은 저장되지 않습니다.

※ mysql 5 버전부터는 괄호안의 숫자가 Byte가 아닌 글자 수를 의미한다고 합니다.

날짜/시간을 담을 때 타입 - DATETIME 과 char 각각의 장단점

날짜/시간을 담을 타입에 대한 의견은 각 전문가들 끼리도 다른 것 같습니다. - 찾아본 글

datetime 사용하자쪽 의견: 3-8Byte로 필드 크기가 더 작다, datetime 타입 사용시 내부적으로 하나의 숫자로 보기 때문에 연산시 string형보다 더 빠르다.
char 사용하자쪽 의견 : datetime을 사용하면 조건절을 주기가 까다로워진다, datetime 사용시 인덱스 활용이 불가능하게 됨.

3. 새발 표기법

일단은 '회사 이름'과 '회사 번호' 두 개를 기본키로 하여 복합키 설정을 해놨는데
이 중에서 무엇을 기본키로 사용해야할지는 회사의 방침에 따라야하는 것 같습니다
그래도 사용할 때 이해하기 편한 이름을 사용하지 않을까 싶네요

기본키는 최대한 하나만 있어야 하기 때문에
회사 이름이 겹칠 가능성이 없다면 이름을 기본키로하고 회사별 번호는 부수키로 사용하면 좋을 것 같습니다. -> 질문하여 해결함

그리고 N:M 관계에서는 새발 표기법을 어떻게 그리는지도 정확하게 알고싶네요
광고희망기업 계약정보 테이블과 문제 정보 테이블의 관계는
1:N이므로 문제 정보 테이블에 광고희망기업의 기본키를 외래키로 가져다 놨었습니다.

새발 표기법 잘 그리는 방법
표기법 선택을 위한 틀을 만들어봤습니다.
3-1. 위의 그림을 떠올리며 1:1, 1:N, N:M 관계 확인
3-2. 최소 카디날리티 비율이 0인지 1인지 즉, 전체 참여인지 부분참여인지 확인
3-3. 새발 표기법 맞게 했나, 기본키, 외래키 맞게 했나 확인

이제 조금 감이 잡히네요

4. NULL, NOT NULL 선정 방법

해당 데이터가 NULL을 허용할지 말지 선정하는 방법은 그냥 정말 평범했습니다.
꼭 있어야하는 데이터면 NOT NULL, 없어도 되는 데이터면 NULL을 사용합니다.

이와 관련해서 추가로 연결되는 개념들은

데이터 정렬할 때 NULL은 어느 위치를 갖는가?

였습니다. 오라클은 NULL을 가장 큰 값으로 취급하고
MySQL은 NULL 값을 가장 작은 값으로 취급한다고 합니다.
가장 앞으로 정렬하고 싶다면 이 링크 참고

NULL을 포함한 연산은 결과값 또한 NULL!
NULL은 값이 아니기때문에 비교 연산자 '!=', '=', '<', '>' 등을 사용할 수 없다고 합니다.

MySQL에서의 NULL은 0이나 공백이 아니라 아예 값이 존재하지 않음이라는 점! - 참조 링크

5. 단어 길이 줄이기

그리고 이름을 대문자로 표기하려다보면 긴 이름은 보기 힘듭니다. 그래서 COMPANY와 같은 경우 CMPNY와 같이 줄이죠 이때도 규칙이 있습니다.

단어의 모음을 빼는 것이죠
영어는 모음(A, E, I, O, U)이 빠져도 어느 정도 예상이 가기 때문에
단어의 모음을 빼서 길이를 줄이면 될 것 같습니다

EX)
QUESTION -> QUSTN
CONTRACT -> CNTRCT
OPTION -> OPTN


질문과 답변

회사 이름과 CMPNY_NO 중에 뭘 기본키로 할까요? -> 보통은 COMPANY2309123456 처럼 회사에 일정한 규칙으로 코드를 부여하여 기본키로 사용한다고 합니다. 테이블 이름의 길이도 최대한 줄이나요? -> 테이블 이름의 길이는 너무 긴 경우만 줄이라고 하셨습니다.
profile
당신의 오류 제가 잡아드립니다.

0개의 댓글