TIL 220909

강지훈·2022년 9월 8일
0

[데이터베이스의 기본#2]
필드와 레코드, 그리고 타입

회원이란 엔터티는 member라는 테이블로 속성인 이름, 아이디 등을 가지고 있으며
name, ID, address 등의 필드를 가집니다. 그리고 이 테이블에 쌓이는 행(row)
단위의 데이터를 레코드라고 합니다. 또한, 레코드를 튜플이라고도 합니다.

예를 들어 '책'이라는 엔터티를 정의하고 이를 기반으로 테이블을 만들어 보겠습니다.
먼저 어떤 속성들이 있을까요? 책의 제목, 책의 가격, 책의 ISBN, 책의 저자, 책의 출판년도 등이 있겠죠? 일단 수많은 '속성' 중에서 이름, 저자의 아이디, 출판년도 , 장르, 생성일시, 업데이트 일시만 있다고 해봅시다.

필드 타입
플드는 타입을 갖습니다. 예를 들어 이름은 문자열이고 전화번호는 숫자겠죠?
이러한 타입들은 DBMS마다 다르며, 이 책에서는 MySQL 기준으로 설명하겠습니다.
여러 가지 타입이 있고 대표적인 타입인 숫자, 날짜 , 문자 타입에 대해 알아보겠습니다.

숫자타입
숫자타입으로는 TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 등이 있습니다.
INT: 4바이트, -21억~21억
날짜타입
날짜타입으로는 DATE, DATETIME, TIMESTAMP 등이 있습니다.

DATE
날짜 부분은 있지만 시간 부분은 없는 값에 사용됩니다. 지원되는 범위는 1000-01-01
~ 9999-12-31 입니다. 3바이트의 용량을 가집니다.

DATETIME
날짜 및 시간 부분을 모두 포함하는 값에 사용됩니다. 지원되는 범위는 1000-01-01
00:00:00에서 9999-12-31 23:59:59 입니다. 8바이트의 용량을 가집니다

TIMESTAMP
날짜 및 시간 부분을 모두 포함하는 값에 사용됩니다. 1970-01-01 00:00:01 에서
2038-01-19 03:14:07 까지 지원합니다. 4바이트의 용량을 가집니다.
1970-01-01 00:00:01 = 1

문자타입
문자 타입으로는 CHAR, VARCHAR, TEXT , BLOB, ENUM , SET 이 있습니다.

CHAR 와 VARCHAR
CHAR 또는 VARCHAR 모두 그 안에 수를 입력해서 몇 자까지 입력할지 정합니다.
예를 들어 CHAR(30)이라면 최대 30바이트까지 입력할 수 있습니다.
CHAR는 테이블을 생성할 때 선언한 길이로 고정되며 길이는 0에서 255사이의 값을 가집니다. 레코드를 저장할 때 무조건 선언한 길이 값으로 '고정'해서 저장됩니다.
VARCHAR는 가변 길이 문자열입니다. 길이는 0에서 65,535 사이의 값으로 지정할 수 있으며, 입력된 데이터에 따라 용량을 가변시켜 저장합니다. 예를 들어 10바이트의 이메일을 저장할 경우 10바이트에 해당하는 바이트 + 길이기록용 1바이트로 저장하게 됩니다.
VARCHAR(10000)으로 선언했음에도 말이죠

CHAR의 경우 유동적이지 않은 길이를 가진 데이터의 경우 효율적이며 유동적인 길이를 가진 데이터는 VARCHAR로 저장하는 것이 좋습니다.

TEXT와 BLOB
두 개의 타입 모두 큰 데이터를 저장할 때 쓰는 타입입니다.
TEXT는 큰 문자열 저장에 쓰며 주로 게시판의 본문을 저장할 때 씁니다.
BLOB은 이미지, 동영상 등 큰 데이터 저장에 씁니다. 그러나 보통은 아마존의 이미지 호스팅 서비스은 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장합니다.

ENUM 과 SET
ENUM 과 SET 모두 문자열을 열거한 타입입니다.
ENUM은 ENUM('x-small' , 'small' ,'medium','large','x-large') 형태로
쓰이며, 이 중에서 하나만 선택하는 단일 선택만 가능하고 ENUM 리스트에 없는 잘못된 값을 삽입하면 빈문자열이 대신 삽입됩니다.
ENUM을 이용하면 x-small 등이 0,1 등으로 매핑되어 메모리를 적게 사용하는 이점을 얻습니다.
ENUM은 최대 65,535개의 요소들을 넣을 수 있습니다.

SET은 ENUM과 비슷하지만 여러 개의 데이터를 선택할 수 있고 비트 단위의 연산을 할 수 있으며 최대 64개의 요소를 집어넣을 수 있다는 점이 다릅니다.
참고로 ENUM이나 SET을 쓸 경우 공간적으로 이점을 볼 수 있지만 애플리케이션의 수정에 따라 데이터베이스의 ENUM이나 SET에서 정의한 목록을 수정해야 한다는 단점이 있습니다.

[데이터베이스의 기본 #3]
관계
데이터베이스에 테이블은 하나만 있는 것이 아닙니다. 여러 개의 테이블이 있고 이러한 테이블은 서로의 관계가 정의되어 있습니다. 이러한 관계를 관계화살표로 나타냅니다.

1:1 관계
예를 들어 유저당 유저 이메일은 한 개씩 있겠죠? 이 걍우 1:1 관계가 됩니다

1:1 관계는 테이블을 두 개의 테이블로 나눠 테이블의 구조를 더 이해하기 쉽게 만들어 줍니다.

1:N 관계
예를 들어 쇼핑몰을 운영한다고 해봅시다. 한 유저당 여러 개의 상품을 장바구니에 넣을 수 있겠죠? 이 경우 1:N 관계가 됩니다.
물론 하나도 넣지 않는 0개의 경우도 있으니 0도 포함되는 화살표를 통해 표현해야 합니다.
이렇게 한 개체가 다른 많은 개체를 포함하는 관계를 말합니다.

N:M 관계
학생과 강의의 관계를 정의하면 어떻게 될까요? 학생도 강의를 많이 들을 수 있고
강의도 여러 명의 학생을 포함할 수 있습니다. 이경우 N:M이 됩니다.

지금 보면 중간에 학생_강의라는 테이블이 끼어 있습니다. N:M은 테이블 두 개를 직접적으로 연결해서 구축하지는 않고 1:N , 1:M이라는 관계를 갖는 테이블 두 개로 나눠서 설정합니다.


테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치로 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있습니다.

키들은 앞의 그림과 같은 관계를 가집니다. 슈퍼키는 유일성이 있고 그 안에 포함된 후보키는 최소성까지 갖춘 키입니다. 후보키 중에서 기본키로 선택되지 못한 키는 대체키가 됩니다. 유일성은 중복되는 값은 없으며, 최소성은 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것을 말합니다.

기본키
기본키(Primary Key)는 줄여 PK 또는 프라이머리키라고 많이 부르며, 유일성과 최소성을 만족하는 키입니다.
이는 테이블의 데이터 중 고유하게 존재하는 속성이며 기본키에 해당하는 데이터는 앞의 그림의 ID처럼 중복되어서는 안 됩니다. PDT-0002가 중복되기 때문에 ID라는 필드는 기본키가 되지 말아야 합니다.

다음 그림에서 ID는 기본키로 설정할 수 있겠죠?
물론 { ID , name} 이라는 복합키를 기본키로 설정할 수 있지만 그렇게 되면
최소성을 만족하지 않습니다. 기본키는 자연키 또는 인조키 중에 골라 설정합니다.

자연키
예를 들어 유저 테이블을 만든다고 가정하면 주민등록번호, 이름 , 성별 등의 속성이 있습니다. 이 중 이름, 성별 등은 중복된 값이 들어올 수 있으므로 부적절하고 남는 것은 주민등록번호입니다. 이런 식으로 중복된 값들을 제외하며 중복되지 않는 것을 '자연스레'뽑다가 나오는 키를 자연키라고 합니다. 자연키는 언젠가는 변하는 속성을 가집니다.

인조키
예를 들어 유저 테이블을 만든다고 했을 때 회원 테이블을 생성한다고 가정하면
주민등록번호, 이름 , 성별 등의 속성이 있습니다.
여기에 인위적으로 유저 아이디를 부여합니다.
이를 통해 고유 식별자가 생겨납니다 오라클은 Sequence, MySQL은 auto increment 등으로 설정합니다. 이렇게 인위적으로 생성한 키를 인조키라고 합니다.
자연키와는 대조적으로 변하지 않습니다. 따라서 보통 기본키는 인조키로 설정합니다.

외래키
외래키(Foreign Key)는 FK라고도 하며, 다른 테이블의 기본키를 그대로 참조하는 값으로
개체와의 관계를 식별하는 데 사용합니다.
외래키는 중복되어도 괜찮습니다. 앞의 그림을 보면 client라는 테이블의 기본키인 ID가
product라는 테이블의 user_id라는 외래키로 설정될 수 있음을 보여줍니다.
또한 user_id는 a_2라는 값이 중복되는 것을 볼 수 있습니다.

후보키
후보키는(candidate key)는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키입니다.

대체키
대체키(alternate key)는 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 말합니다.

슈퍼키
슈퍼키(super key)는 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키입니다.

profile
never stop

0개의 댓글