데이터베이스(DB, DataBase)는 일정한 규칙이나 규약을 통해 구조화되어 저장된 데이터의 집합입니다. 이 데이터베이스를 제어하고 관리하는 통합 시스템을 DBMS(DataBase Management System)라고 부릅니다.
데이터베이스 내부의 데이터는 각 DBMS마다 정의된 쿼리 언어(query language)를 사용하여 삽입(Insert), 삭제(Delete), 수정(Update), 조회(Select) 등의 작업을 수행할 수 있습니다. 또한, 실시간으로 접근할 수 있고 여러 사용자가 동시에 공유할 수 있다는 특징이 있습니다.
구조는 보통 데이터베이스 -> DBMS -> 응용 프로그램 순서로 연결되어 데이터를 주고받습니다. 예를 들어, MySQL이라는 DBMS가 있고, 그 위에서 작동하는 Node.js나 PHP 같은 응용 프로그램이 데이터베이스에서 필요한 데이터를 꺼내 로직을 처리하는 방식입니다.
👤 엔터티(entity)
사람, 장소, 물건처럼 여러 개의 속성을 가진 명사를 의미합니다. 쉽게 말해 '회원'이라는 엔터티가 있다면, 이 회원은 이름, 아이디, 주소, 전화번호 같은 속성을 갖게 됩니다. 이때 속성은 서비스의 요구 사항에 따라 결정됩니다. 만약 우리 서비스에서 '주소' 정보가 전혀 필요 없다면, 회원 엔터티에서 주소라는 속성은 제외되는 것이죠.
🔗 약한 엔터티와 강한 엔터티
엔터티는 홀로 존재할 수 있는지에 따라 나뉩니다. 예를 들어 A가 혼자서는 존재할 수 없고, B가 있어야만 존재할 수 있다면 A는 약한 엔터티, B는 강한 엔터티가 됩니다. 즉, A는 B에 종속적인 관계입니다.
📑 릴레이션(relation)
데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다. 데이터베이스는 엔터티에 관한 데이터를 하나의 릴레이션에 담아 관리합니다. 이 릴레이션을 관계형 데이터베이스(RDBMS)에서는 '테이블(Table)'이라고 부르고, NoSQL 데이터베이스에서는 '컬렉션(Collection)'이라고 부릅니다.
🆚 테이블과 컬렉션
데이터베이스는 크게 관계형 데이터베이스와 NoSQL 데이터베이스로 나뉩니다. 대표적인 관계형 DB인 MySQL과 NoSQL DB인 MongoDB를 비교해보면 구조가 다릅니다.
- MySQL: 레코드 - 테이블 - 데이터베이스
- MongoDB: 도큐먼트 - 컬렉션 - 데이터베이스
🏷️ 속성(attribute)
릴레이션에서 관리하는 구체적이고 고유한 이름을 가진 정보입니다. '자동차'라는 엔터티가 있다면 차 번호, 바퀴 수, 색상 같은 것들이 속성이 됩니다. 이 중에서도 서비스 운영에 꼭 필요한 정보만 골라내어 엔터티의 속성으로 정의합니다.
🎯 도메인(domain)
릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 범위를 말합니다. 예를 들어 '성별'이라는 속성이 있다면, 이 속성이 가질 수 있는 값은 {남, 여}라는 집합으로 한정되는데, 이것이 바로 도메인입니다.
📝 필드와 레코드
'회원'이라는 엔터티를 member라는 테이블로 만들 때, 이름, 아이디, 주소 같은 속성을 각각 name, ID, address라는 필드(Field)로 정의합니다. 그리고 이 테이블에 실제로 쌓이는 한 줄 한 줄의 데이터를 레코드(Record) 혹은 튜플(Tuple)이라고 부릅니다.
CREATE TABLE book(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
author_id INT,
publishing_year VARCHAR(255),
genre VARCHAR(255),
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY(id)
);
🔢 필드 타입
- 숫자 타입
| 타입 | 용량(바이트) | 최솟값(부호 있음) | 최솟값(부호 없음) | 최댓값(부호 없음) | 최댓값(부호 있음) |
| 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 |
- 날짜 타입
- 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 ~ 2038-01-19, 4바이트)
- 문자 타입
- CHAR vs VARCHAR: 둘 다 문자를 저장하지만 방식이 다릅니다.
- CHAR: 고정 길이입니다. 100글자로 선언해두면 10글자만 저장해도 100바이트 공간을 차지합니다. 길이가 일정한 데이터(예: 주민번호)에 유리합니다.
- VARCHAR: 가변 길이입니다. 10글자를 저장하면 '데이터 10바이트 + 길이 기록용 1바이트'만 사용합니다. 길이가 들쑥날쑥한 데이터(예: 이메일, 제목)에 효율적입니다.
- TEXT vs BLOB: 큰 데이터를 저장할 때 씁니다.
- TEXT: 게시판 본문처럼 큰 문자열을 저장합니다.
- BLOB: 이미지, 동영상 등 바이너리 데이터를 저장합니다. (하지만 보통 파일은 AWS S3 같은 서버에 올리고, DB에는 파일 경로(URL)만 VARCHAR로 저장하는 것이 일반적입니다.)
- ENUM vs SET: 문자열을 미리 정의해두고 선택하는 타입입니다.
- ENUM: 단일 선택만 가능합니다. (예: 사이즈 S, M, L 중 택 1). 내부적으로 숫자로 매핑되어 메모리 효율이 좋지만, 목록을 수정하려면 스키마를 변경해야 하는 단점이 있습니다.
- SET: ENUM과 비슷하지만 여러 개를 중복 선택할 수 있습니다.
- CHAR vs VARCHAR: 둘 다 문자를 저장하지만 방식이 다릅니다.
🤝 관계
데이터베이스의 테이블들은 서로 독립적이지 않고 관계를 맺고 있습니다. 이를 관계 화살표로 표현합니다.

- 1:1 관계: 유저 한 명당 유저 이메일이 하나만 있는 경우입니다. 테이블 구조를 더 명확하게 이해하기 위해 하나의 큰 테이블을 두 개로 나눌 때 주로 사용합니다.
- 1:N 관계: 유저 한 명이 여러 개의 상품을 장바구니에 담는 경우입니다. 물론 상품을 하나도 담지 않을 수도 있으므로 '0'도 포함하는 화살표로 표현합니다. 하나의 개체가 다른 여러 개체를 포함하는 가장 흔한 관계입니다.
- N:M 관계: 학생도 여러 강의를 들을 수 있고, 강의도 여러 학생을 받을 수 있는 경우입니다. 이 관계는 테이블 두 개를 직접 연결하기보다, 중간에 매핑 테이블을 두어 1:N, 1:M 관계로 풀어내는 것이 일반적입니다.
🔑 키(Key)
테이블 간의 관계를 명확히 하고, 데이터를 빠르게 찾기 위해(인덱싱) 설정하는 장치입니다. 크게 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있습니다. 키를 이해하려면 유일성(중복된 값이 없음)과 최소성(불필요한 속성 없이 꼭 필요한 속성만으로 키를 구성함)을 알아야 합니다.
🔄 기본키 (Primary Key, PK)
유일성과 최소성을 모두 만족하는 키입니다. 테이블에서 데이터를 구분 짓는 고유한 식별자 역할을 하며, 중복 값이나 NULL 값을 허용하지 않습니다.
- 자연키(Natural Key): 주민등록번호처럼 데이터 자체에 이미 존재하는 속성 중 고유한 것을 키로 사용하는 경우입니다. 하지만 비즈니스 로직이 바뀌면 변할 위험이 있습니다.
- 인조키(Artificial Key): 오라클의 Sequence나 MySQL의 Auto Increment처럼 인위적으로 부여한 고유 번호(ID)입니다. 변하지 않기 때문에 보통 기본키로 가장 많이 사용합니다.
🔄 외래키 (Foreign Key, FK)
다른 테이블의 기본키(PK)를 참조하는 값입니다. 테이블 간의 관계를 연결하는 역할을 하며, 데이터의 중복을 허용합니다.
🔄 후보키(Candidate Key)
기본키가 될 자격이 있는(유일성과 최소성을 만족하는) 모든 키들을 말합니다.
🔄 대체키(Alternate Key)
후보키 중에서 기본키로 선택받지 못하고 남은 키들을 말합니다.
🔄 슈퍼키(Super Key)
레코드를 유일하게 식별할 수 있는 유일성은 갖췄지만, 최소성은 갖추지 않아도 되는 키입니다. (예: 아이디+이름을 합쳐서 키로 쓰는 경우)
'Computer Science > Database' 카테고리의 다른 글
| 🔗조인 (0) | 2025.12.03 |
|---|---|
| 🔖 인덱스 (0) | 2025.12.03 |
| 🔍 데이터베이스의 종류 (0) | 2025.12.03 |
| 🔐 트랜잭션과 무결성 (0) | 2025.12.03 |
| 📐 ERD와 정규화 과정 (0) | 2025.12.02 |