문제은행 DB 설계 분투기 5 - 스키마 정제, varchar와 text 타입의 차이

양태환·2023년 9월 11일

인턴기

목록 보기
5/14

부분키가 무엇인가 하여
찾아보았습니다.

부분키

부분키를 이해하기 위해서는 먼저 강한 엔티티 타입, 약한 엔티티 타입을 알아야합니다.

강한 엔티티 타입은
자신이 가진 애트리뷰트만을 이용해서 엔티티를 고유하게 식별할 수 있는 타입을 말합니다.

약한 엔티티 타입은
자신이 가진 애트리뷰트만을 이용해서 엔티티를 고유하게 식별할 수 없는 타입을 말합니다.

약한 엔티티 타입이 고유한 식별을 위해 강한 엔티티 타입에서 가져온 애트리뷰트와 함께 사용되는 약한 엔티티 타입의 애트리뷰트를 부분키라고 합니다.

즉 쉽게 줄이면 '약한 엔티티의 복합키 중 약한 엔티티의 애트리뷰트' 라고 할 수 있겠네요

스키마 정제 - 릴레이션 정규화&역정규화

릴레이션 정규화

정규화의 목적은 중복과 갱신이상이 생기지 않도록 하는 것입니다.

  1. 함수적 종속성의 관계를 보고
    완전 함수적 종속이라면 놔두고
    부분 함수적 종속이라면 분해하는 게 좋다고한다.

  2. 릴레이션을 분해한다.
    여러 정규형을 만족하는지 확인하면서 정규화를 진행하면 된다.

제1정규형 : 모든 애트리뷰트가 원자값을 가진다.
제2정규형 : 제1정규형 만족하면서 키가 아닌 애트리뷰트는 릴레이션 R의 기본 키에 완전 함수적 종속한다. (복합키의 경우에만 살펴보면 됨)
제3정규형 : 제2정규형 만족하면서 키가 아닌 모든 애트리뷰트들이 릴레이션 R의 기본키에 이행적으로 종속하지 않는 것
BCNF : 제3정규형을 만족하고, 모든 결정자가 후보키이어야함.

이렇게 정규화가 진행될수록 중복이 감소하고 갱신 이상도 감소된다.
하지만 성능도 점점 감소될 수 있기 때문에
높은 정규형을 만족하는 것이 최적의 릴레이션 스키마는 아님

릴레이션 역정규화

역 정규화 : 성능을 위해 보다 낮은 정규형으로 되돌아가는 것 검색 질의들의 수행속도를 높이기 위해서 분해된 두 개 이상의 릴레이션을 합치는 것 그렇기에 데이터 중복 및 갱신 이상에 대한 대가를 치르면서 성능상의 요구를 만족시키는 것이다.

이 역정규화는 실제로 쿼리문을 만들어보면서 생각해봐야 어디에 역정규화가 필요한지 알 수 있을 것 같습니다.


SQL문 관련 사소한 오류 해결

SQL문 빨간 줄

일단 실제 MySQL에 테이블을 만들어보고 오늘 할 일을 리스트를 정하려고합니다.
그런데 unsigned MEDIUMINT 타입에서 unsigned 명령어를 쓸 수 없더라구요
왜 그런지 찾아봤습니다.

찾아보니 위치가 타입의 앞이 아닌 뒤에 입력해주더라구요
TINYINT unsigned 로 입력했더니 이상이 없었습니다.

DEFAULT "Y", "N" 에서 빨간 줄이 뜨는데

DEFAULT "Y"처럼 하나의 값만 적어줘야 합니다.

MySQL 실행 단축키 잠깐 학습 - 참조 링크

MySQL 테이블 만들기&설정

참조 링크

근데 자꾸 오류가 뜨네요

Error Code: 1064. You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
 syntax to use near 'CREATE TABLE `QUSTN_INFO` (
  `QUSTN_NO` varchar(50) NOT NULL,
  `CNTRCT_NO` va' at line 1	0.000 sec

라고 뜹니다.

버전 확인을 해보라고 하니
확인해보겠습니다.

제가 가진 버전은 v8이구요

버전 5에 대한 얘기를 많이 들어서
버전 5와 8에 대한 차이를 검색해보았습니다.

그런데 테이블 CRUD에 대한 얘기가 없는 걸 보니 혼란스럽습니다.
분명 CRUD에 대한 문법이 달라져서 이런 것 같다는 생각이 들어서 찾아보니

CRUD나 SELECT 등의 명령어를 쓸 수 있는 권한을 줘야했습니다.
이 블로그의 도움을 받았습니다. - https://farmerkyh.tistory.com/324

그러고 나서도 오류가 떠서
인터넷에서 CREATE SQL문을 가져와 실행해봤더니 그건 또 되더라구요

CREATE TABLE topic(

id INT(11) NOT NULL AUTO_INCREMENT,

title VARCHAR(100) NOT NULL,

description TEXT NULL,

created DATETIME NOT NULL,

author VARCHAR(30) NULL,

profile VARCHAR(100) NULL,

PRIMARY KEY(id)
);

제가 만드려는 테이블은 이렇습니다.

CREATE TABLE qustn_info (
	QUSTN_NO	varchar(50) NOT NULL,
	CNTRCT_NO	varchar(50)	NOT NULL,
	QUSTN_CONTENT	varchar(2000)	NOT NULL,
	QUSTN_ANSWER	varchar(200)	NOT NULL,
	QUSTN_TYPE	char(10)	NOT NULL,
	QUSTN_LEVEL	char(2)	NOT NULL,
	QUSTN_HINT_TYPE	varchar(50)	NOT NULL,
	QUSTN_HINT	varchar(2000)	NOT NULL,
    PRIMARY KEY(QUSTN_NO)
);

차이점을 자세히 봐보니
테이블의 이름이 소문자냐 대문자냐의 차이가 있더라고요
그래서 테이블 이름을 소문자로 바꿔서 실행해봤더니

오류가 뜹니다.
COMMENT를 없애야 하더라고요

COMMENT도 없애고 실행했습니다.

create가 되었습니다!


그런데 또
원래의 쿼리문에 PRIMARY KEY만 잘 추가해주니까 잘 돌아가더라고요
띠용

CREATE TABLE `TEST_PAPER` (
	`TEST_PAPER_NO`	varchar(50)	NOT NULL,
	`CREAT_DT`	char(14)	NOT NULL,
	`UPDT_DT`	char(14)	NULL,
	`TAKER_NUM`	INT	NOT NULL,
	`AVR_SCORE`	TINYINT UNSIGNED	NOT NULL,
	`USE_YN`	char(1)	NOT NULL,
    PRIMARY KEY(TEST_PAPER_NO)
);

COMMENT 만 지우고 넣어주면 잘 들어가는 것 같습니다.
흠...

어쨋든 쿼리문으로 DB Table 만들기 완료!


이제 복합키인 테이블에서 select문을 쓰려면 where 부분에 꼭 두 개를 써야하는지를 보려고합니다.

select * from test_taker_score where CREAT_USER_CD='CD004';
만 해도 잘 작동하면서 복합키 테이블에서 데이터를 잘 가져오네요


MySQL 문법

MySQL sql문 기본 문법

기본 쿼리문 문법이 잘 기억 안 날때 참고하면 좋을 것 같아 MySQL 기본 문법을 정리해놓은 블로그 링크를 첨부합니다.

MySQL 데이터타입 문법

MySQL 버전 5부터는 varchar(요기) 에 들어가는 숫자가 글자의 숫자라고 하던데
이에 대해서 한 번 알아보겠습니다.
varchar(요기)에 들어가는 숫자는 1byte인 영/문/숫 과 3byte인 한자/한글 에 상관없이 글자수를 얘기한다고 합니다. - 참조한 블로그 글

직접 해보면서 알아볼 수도 있습니다만 일단 지금은 시간이 급박하므로
패스!

그리고 알아보면서 보게 된 글인데
면접 질문에서 이런 것도 나오나봅니다.
varchar와 text의 차이, 그리고 각각은 언제 사용하는 게 좋은지를 물어보네요 - 참조 블로그 링크


나중에 추가로 조사해볼 내용

varchar와 text의 차이

참조 링크

index로 사용
  varchar : 가능
  text : 불가능

max size limit
varchar : 가능 1~65535
varchar : 불가능, 무조건 65535

추가적인 공간 사용
varchar : 1byte <= X <= 255byte 일 때는 1byte, 256 <= X <= 65535 일때는 2byte
text : 무조건 2byte

그리고 65535를 초과하는 긴 글의 경우 TEXT 타입을
그렇지 않는 데이터들을 varchar를 사용한다고한다.

그리고 더 자세한 글을 발견하여 읽어보려하는데
이해가 잘 안 갔다... 그래서 당근의 테그 블로그 링크를 넣어놓고 다음에 다시 와서 공부해보려한다.

profile
당신의 오류 제가 잡아드립니다.

0개의 댓글