23.12.05 데이터베이스의 기본 2
1. 필드와 레코드
- 회원이라는 엔티티는 member 라는 테이블로 속성인 이름, 아이디 등을 가지고있다
- name, ID, 주소 등의 필드를 가진다
- 이 테이블에 쌓이는 행 단위의 데이터를 레코드 = 튜플 이라고함
예) MySQL 기준
엔티티 : 책
속성 : 책의 제목, 저자의 아이디, 출판년도, 장르, 생성일시, 업데이트일시
테이블 : Book
MySQL 구현시 코드 입력
CREATE TABLE book (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
author_id INT,
publishing_yaer VARCHAR(255),
genre VARCHAR(255),
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (id)
);
1) 필드 타입 (기준 MySQL)
(1) 숫자 타입
타입 | 용량(바이트) | 최소값(부호 있음) | 최소값(부호 없음) | 최대값(부호 없음) | 최대값(부호 있음) |
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -263 | 0 | 263-1 | 264-1 |
(2) 날짜 타입
A) DATE : 1000-01-01 ~ 9999-12-31. 3바이트
B) DATETIME : 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59. 8바이트
C) TIMESTAMP : 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07. 4바이트
(3) 문자 타입
A) CHAR(30)
- 안에 수를 입력해서 몇 자까지 입력할지 정함 현재는 30글자
- 고정 길이 문자열이고 0 ~ 255 사이의 값을 가짐
- 레코드를 저장할 때 무조건 선언한 길이 값으로 고정됨
예) CHAR(100) 으로 선언 후 10글자 저장해도 100바이트로 저장됨
- 유동적이지 않은 길이를 가진 데이터의 경우 효율적
B) VARCHAR(30)
- 안에 수를 입력해서 몇 자까지 입력할지 정함 현재는 30글자
- 가변 길이 문자열이고 0 ~ 65,535 사이의 값을 가짐
- 입력된 데이터에 따라 용량을 가변시켜 저장
예) VARCHAR(100) 으로 선언 후 10글자의 이메일을 저장하면
10글자에 해당하는 바이트 + 길이기록용 1바이트로 저장됨
- 유동적인 길이를 가진 데이터에 효율적
C) TEXT
- 큰 문자열 저장에 쓰이고 주로 게시판의 본문을 저장할 때 쓰임
D) BLOB
- 이미지, 동영상 등 큰 데이터 저장에 쓰임
- 보통은 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장
E) ENUM
- 문자열을 열거한 타입
- x-small, small, medium, large, x-large 형태로 쓰이고, 이중 하나만 선택하는 단일 선택만 가능
- ENUM 리스트에 없는 값을 삽입하면 빈문자열이 대신 삽입됨
- x-small 등이 0, 1 등으로 매핑되어 메모리를 적게 사용함
- 최대 65,535 개의 요소를 넣을 수 있다
- 공간적으로 이점이 있지만 애플리케이션 수정에 따라 DB의 정의한 목록을 수정해야함
F) SET
- 문자열을 열거한 타입
- 여러개의 데이터를 선택
- 비트 단위의 연산을 할 수 있음
- 최대 64개의 요소를 넣을 수 있다
- 공간적으로 이점이 있지만 애플리케이션 수정에 따라 DB의 정의한 목록을 수정해야함
2. 관계
1) 1:1 관계 : 테이블을 두 개의 테이블로 나눠 구조를 더 이해하기 쉽게 만들어 준다
2) 1:N 관계 : 쇼핑몰을 운영한다고 했을 때 한 유저당 여러개의 상품을 장바구니에 넣을 수 있다 이경우가 1:N 관계
물론 하나도 넣지 않는 0개의 경우도 있으니 0도 포함되는 화살표를 통해 표현해야함
즉, 한 개체가 다른 많은 개체를 포함하는 관계
3) N:M 관계 : 학생과 강의의 관계를 정의한다면? 학생도 강의를 많이 들을 수 있고 강의도 여려 명의 학생을 포함할 수
있다
중간에 학생_강의 라는 테이블이 끼어 있는데 N:M은 두개를 직접 연결해서 구축하지 않고
1:N, 1:M 이라는 관계를 갖는 테이블 두개로 나누어 설정함
3. 키
- 테이블 간의 관계를 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치
1) 기본키 (Primary Key) : PK 또는 프라이머리키라고 부르며 유일성과 최소성을 만족하는 키
(1) 기본키에 해당하는 데이터는 ID 처럼 중복되어서는 안됨 PDT-002가 중복되기 때문에 ID라는 필드는 기본키가
되지 말아야 한다
(2) ID는 기본키로 설정가능. 물론 {ID, name} 이라는 복합키를 기본키로 설정할 수 있지만 최소성을 만족하지 않는다
기본키는 자연키 또는 인조키 중에 골라 설정함
A) 자연키
- 유저 테이블을 만든다고 가정하면 주민등록번호, 이름, 성별 등의 속성이 있다
- 이름, 설별 등은 중복된 값이 들어올 수 있으므로 부적절하고 남는 것은 주민등록번호
- 이런식으로 중복된 값들을 제외하며 중복되지 않는 것을 자연스레 뽑다가 나오는키
- 언젠가는 변하는 속성을 가짐
B) 인조키
- 회원 테이블을 만든다고 가정하면 주민등록번호, 이름, 성별 등의 속성이 있다
- 인위적으로 유저 아이디를 부여하면 고유 식별자가 생겨남 auto increment 등으로 설정
- 자연키와는 대조적으로 변하지 않음 따라서 보통 기본키는 인조키로 설정함
2) 외래키(Foreign Key) : FK라고도하며, 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는데
사용
(1) 외래키는 중복되어도 괜찮다
(2) client라는 테이블의 기본키인 ID가 product라는 테이블의 user_id라는 외래키로 설정될 수 있다
3) 후보키(candidate key) : 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키
4) 대체키(alternate key) : 후보키가 두개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들
5) 슈퍼키(super key) : 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키