Primary Key
)가 있다.id
이다. 엑셀이나 스프레드 시트에도 제일 첫 컬럼은 언제나 변하지 않는 번호(index)가 매겨져 있는 것처럼, 각 로우는 언제나 고유한 번호를 갖고 있다. 이를 고유 키(Primary Key)라고 한다. 이 Primary Key를 통해서 특정 로우를 찾거나, 인용(reference)할 수 있다.RDBMS에서는 테이블끼리의 관계를 맺을 수 있는 유형은 다음 3가지중 하나:
기본적으로 대부분의 RDBMS는 다음과 같은 데이터 타입을 가지고 있다:
Int
, tinyint
, bigint
, float
Timestamp
, Date
, DateTime
Char
, Varchar
, Text
Binary
JSON
, Spatial
, Enum
INT
보다는 TINYINT
가 더 적합할것이다.TEXT
보다는 VARCHAR
가 더 적합할 것이다. 예를 들어, 50자 글자 제한 댓글이라면 VARCHAR(50)
UNSINGED
를 적절히 사용하면 좋다.UNSIGNED
를 사용하도록 하자.UNSIGNED TINYINT
를 사용하면 혹시나 130살까지 사는 사람이 나와도 핸들링 할 수 있다.VARCHAR
를 적절히 잘 사용하자.CHAR
는 실제 값 사이즈와 상관없이 고정된 사이즈를 차지한다. 예를 들어 CHAR(100)
라고 한다면, 📍실제 데이터는 "위코드"와 같이 3글자라고 하더라도 데이터베이스상에는 100글자 만큼의 사이즈를 차지하게 된다.📍VARCHAR
는 📍실제 데이터 사이즈만큼만 차지한다.📍 VARCHAR(100)
의 경우 "위코드" 라는 값을 저장하면 3글자 만큼의 공간만 사용하게 되는것이다.CHAR
이 VARCHAR
보다 생성과 읽기가 약간 빠르다. 하여, 데이터값이 항상 고정이라면 CHAR
을 사용하고 인풋에 따라 변한다면 VARCHAR
을 사용하는것이 효율적이다 (대부분 인풋에 따라 변하는 데이터가 일반적일 것이다).DATETIME
VS TIMESTAMP
TIMESTAMP
를 사용하자.created_at
처럼 해당 로우가 생성된 시점updated_at
처럼 해당 로우가 수정된 시점DATETIME
이나 DATE
사용하자.DATE
DATETIME
DECIMAL
VS FLOAT
FLOAT
은 라운딩 에러가 날 수 있다.DECIMAL
을 사용하자.DECIMAL(5, 2)
→ -999.99 ~ 999.99ENUM
타입에 관하여CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
('polo shirt','small');
SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name | size |
+---------+--------+
| t-shirt | medium |
+---------+--------+
UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;
ENUM
타입은 굉장히 유용하다고 생각될 수 있다.ENUM
보다는 one to one 관계의 normalization이 추천된다.SET
타입에 관하여SET
을 사용하면 정해진 값들의 리스트를 저장할 수 있다. 자료구조 SET과 비슷하지만 저장할 수 있는 값들이 미리 정해져야 한다는 차이점이 있다.
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
ENUM
과 비슷하게 SET
도 단점이 많다. 64개 값 이상 저장할 수 없고, 값에 comma가 들어갈 수 없는 둥 제한이 많기 때문에 SET
보다는 one to many normalization을 사용하는것이 추천된다 (리스트를 표한하기 위해서 one to many normalization이 많이 사용된다.
원자성(Atomicity)
은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 📍모 아니면 도.📍즉, 트랜잭션 작업들이 데이터베이스에 모두 반영되던가 아니면 아예 반영이 안된다는 뜻
일관성(Consistency)
은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. → 즉, col1 이라는 컬럼은 INT값을 넣어야 하는 컬럼이라면, 트랜잭션 과정에도 마찬가지로 INT로 적용된다는 것.
고립성(Isolation)
은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.여러 트랜잭션이 진행될때 하나의 트랜잭션이 완료되기 전에는 다른 트랜잭션들이 결과값을 읽거나 영향을 끼칠 수 없다는 뜻
지속성(Durability)
은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 트랜잭션은 로그에 모든 것이 📍저장된 후에만📍 commit 상태로 간주될 수 있다. → 즉, 트랜잭션이 성공적으로 수행되면 그 결과는 혹시 데이터베이스에 장애가 나도 저장이 된다는 뜻. 예를 들어, MySQL은 트랜잭션 결과를 로그로 하드 디스크에 저장해서 혹시나 트랜잭션 결과 커밋 과정에서 데이터베이스가 다운되도, 로그를 통해 트랜스액션 기록을 읽어들여 커밋 결과를 다시 적용시킨다
SELECT EXISTS (SELECT id FROM table1 WHERE age >= 70)