7. 데이터베이스 기초

규미·2025년 10월 31일

CS-study

목록 보기
7/10

1. 관계형 데이터베이스 (RDBMS)

RDBMS (Relational Database Management System), 즉 관계형 데이터베이스 관리 시스템은 데이터를 테이블(Table)이라는 정해진 형식의 2차원 표에 저장하고 관리하는 시스템입니다.

가장 대표적인 예로 MySQL, PostgreSQL, Oracle, MSSQL 등이 있습니다.

  • 테이블 (Table / Relation): 데이터가 실제로 저장되는 입니다. (엑셀 시트를 생각하면 쉽습니다.)
  • 행 (Row / Tuple): 테이블의 가로줄로, 하나의 완전한 데이터 단위를 의미합니다. (예: 한 명의 회원 정보)
  • 열 (Column / Attribute): 테이블의 세로줄로, 데이터의 특정 속성을 나타냅니다. (예: id, 이름, 이메일)
  • 관계 (Relationship): RDBMS의 핵심입니다. 여러 테이블이 특정 값(Key)을 기준으로 서로 논리적으로 연결(관계)될 수 있습니다. (예: 회원 테이블과 주문 테이블이 user_id로 연결됨)

관계 덕분에 데이터의 중복을 최소화하고(정규화), 데이터의 일관성(무결성)을 유지하기 매우 용이합니다.

2. SQL 기본 (DDL, DML, DCL)

  • SQL (Structured Query Language)은 RDBMS와 소통하기 위해(데이터를 관리하고 조회하기 위해) 사용하는 표준 언어입니다. SQL은 그 기능에 따라 크게 3가지로 나뉩니다.

1) DDL (Data Definition Language) - 데이터 정의어

데이터베이스의 구조(Schema)를 정의하거나 수정, 삭제할 때 사용합니다. 데이터의 을 만드는 역할입니다.

  • CREATE: 새로운 데이터베이스나 테이블을 생성합니다.
    • CREATE TABLE Users (id INT, name VARCHAR(50));
  • ALTER: 기존 테이블의 구조를 수정합니다. (열 추가/삭제, 타입 변경)
    • ALTER TABLE Users ADD email VARCHAR(100);
  • DROP: 데이터베이스나 테이블을 완전히 삭제합니다.
    • DROP TABLE Users;
  • TRUNCATE: 테이블의 모든 데이터를 삭제하지만, 테이블 구조(틀)는 남겨둡니다. (로그가 남지 않아 DELETE보다 빠름)

2) DML (Data Manipulation Language) - 데이터 조작어

테이블 안의 실제 데이터를 조작(추가, 조회, 수정, 삭제)할 때 사용합니다. 개발자가 가장 빈번하게 사용하는 SQL입니다.

  • SELECT: 데이터를 조회합니다. (가장 중요!)
    • SELECT FROM Users WHERE name = **홍길동**;
  • INSERT: 테이블에 새로운 데이터를 삽입합니다.
    • INSERT INTO Users (id, name) VALUES (1, **홍길동**);
  • UPDATE: 기존 데이터를 수정합니다.
    • UPDATE Users SET name = **김철수** WHERE id = 1;
  • DELETE: 특정 데이터를 삭제합니다.
    • DELETE FROM Users WHERE id = 1;

3) DCL (Data Control Language) - 데이터 제어어

데이터베이스 사용자의 권한을 관리(부여하거나 뺏는) 데 사용됩니다.

  • GRANT: 특정 사용자에게 특정 작업(예: SELECT, INSERT)을 수행할 권한을 부여합니다.
  • REVOKE: 부여했던 권한을 회수합니다.

3. 키(Key)와 인덱스(Index) 개념

Key와 Index는 데이터베이스의 무결성과 성능을 좌우하는 매우 중요한 개념입니다.

키 (Key)

Key는 테이블의 각 행(Row)을 식별하거나 테이블 간의 관계를 맺는 데 사용되는 특별한 열(Column)입니다.

  • 기본 키 (Primary Key, PK)
    • 테이블에서 각 행(Row)을 유일하게 식별할 수 있는 값입니다.
    • 절대 중복되어서는 안 되며(UNIQUE), NULL 값(빈 값)을 허용하지 않습니다. (NOT NULL)
    • 테이블 당 오직 하나만 가질 수 있습니다. (예: user_id, student_id)
  • 외래 키 (Foreign Key, FK)
    • 다른 테이블의 기본 키(PK)를 참조하는 열입니다.
    • 두 테이블을 연결(관계)하는 다리 역할을 합니다.
    • 참조 무결성을 보장합니다. (예: 주문 테이블의 user_id는 반드시 회원 테이블에 존재하는 user_id여야 함)
  • (참고) 후보 키 (Candidate Key): 기본 키가 될 수 있는 자격(유일성 + 최소성)을 갖춘 모든 키들.
  • (참고) 슈퍼 키 (Super Key): 행을 유일하게 식별할 수 있는 (최소성을 만족하지 않아도 되는) 열의 집합.

인덱스 (Index)

Index는 데이터베이스의 SELECT 조회 속도를 획기적으로 향상시키는 기술입니다.

  • 개념: 책 맨 뒤의 찾아보기(Index)와 같습니다.
  • 동작 원리:
    • Index가 없다면? DB는 WHERE 절의 조건(예: name = **홍길동**)을 찾기 위해 테이블의 모든 데이터를 처음부터 끝까지 스캔합니다. (Full Table Scan)
    • Index가 있다면? DB는 먼저 해당 열(예: name)에 대해 만들어진 Index 테이블(B-Tree 구조)을 탐색합니다. Index에는 홍길동이라는 값이 실제 데이터의 어느 위치(주소)에 저장되어 있는지 기록되어 있어, 해당 주소로 바로 찾아갈 수 있습니다.
  • 장점:
    • SELECT (조회) 속도가 매우 빨라집니다.
  • 단점 (Trade-off):
    • INSERT, UPDATE, DELETE (쓰기/수정) 속도는 느려집니다. (데이터가 변경될 때마다 Index 테이블도 함께 수정되어야 하기 때문)
    • Index를 저장하기 위한 추가 저장 공간이 필요합니다.

결론: Index는 조회(SELECT)가 자주 발생하는 열(WHERE 절에 자주 쓰이는 열)에 대해 전략적으로 생성해야 합니다.


1. 관계형 데이터베이스 (RDBMS) 심화

RDBMS (Relational Database Management System), 즉 관계형 데이터베이스 관리 시스템은 데이터를 테이블(Table)이라는 정해진 형식의 2차원 표에 저장하고 관리하는 시스템입니다.

  • 테이블 (Table / Relation): 데이터가 실제로 저장되는 .
  • 행 (Row / Tuple): 하나의 완전한 데이터 단위. (예: 한 명의 회원 정보)
  • 열 (Column / Attribute): 데이터의 특정 속성. (예: id, 이름)

RDBMS의 핵심: 관계 (Relationship)

RDBMS가 관계형이라고 불리는 이유는 테이블 간에 논리적인 연결(관계)을 맺을 수 있기 때문입니다. 이는 Foreign Key(외래 키)를 통해 구현되며, 데이터의 중복을 최소화하고 일관성을 유지합니다.

  • 1:1 (일대일 관계): User 테이블과 User_Profile 테이블처럼, 하나의 데이터가 다른 테이블의 데이터 하나와만 연결됩니다.
  • 1:N (일대다 관계): User 테이블과 Post 테이블처럼, 한 명의 유저가 여러 개의 게시글을 작성할 수 있습니다. (가장 일반적인 관계)
  • N:M (다대다 관계): Student 테이블과 Subject 테이블처럼, 한 명의 학생이 여러 과목을 수강하고 한 과목을 여러 학생이 수강할 수 있습니다. (이 경우, Student_Subject라는 중간 테이블(매핑 테이블)을 두어 1:N 관계 두 개로 풀어냅니다.)

RDBMS의 보증수표: ACID

ACID는 RDBMS가 트랜잭션(Transaction)을 처리할 때 반드시 보장해야 하는 4가지 핵심 원칙입니다. 트랜잭션이란 은행 송금처럼 모두 성공하거나 모두 실패해야 하는 하나의 작업 단위를 의미합니다.

  • Atomicity (원자성): 트랜잭션은 All or Nothing입니다. 작업이 완전히 성공(COMMIT)하거나, 하나라도 실패하면 모두 실패(ROLLBACK)하여 작업 이전 상태로 돌아가야 합니다. (예: A가 B에게 송금 시, A의 잔고 감소와 B의 잔고 증가는 반드시 동시에 성공해야 합니다.)
  • Consistency (일관성): 트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 일관성 있는(유효한) 상태를 유지해야 합니다. (예: 송금 후에도 계좌 잔고가 음수가 되는 등 DB의 규칙(제약조건)을 어기면 안 됩니다.)
  • Isolation (고립성/격리성): 여러 트랜잭션이 동시에 실행될 때, 서로에게 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 합니다. (예: A가 B에게 송금하는 도중에 다른 트랜잭션이 A의 잔고를 조회하면, 송금 전이나 후의 완결된 값만 보여줘야 합니다.)
  • Durability (지속성): 성공적으로 완료된(COMMIT된) 트랜잭션의 결과는 시스템에 장애가 발생하더라도(예: 정전) 영구적으로 저장되어야 합니다.

2. SQL 심화 (DDL, DML, DCL + DQL, TCL)

  • SQL (Structured Query Language)은 RDBMS와 소통하기 위해 사용하는 표준 언어입니다. SQL은 기능에 따라 5가지로 나눌 수 있습니다.

① DDL (Data Definition Language) - 데이터 정의어

데이터베이스의 구조(Schema)를 정의, 수정, 삭제합니다. (데이터의 관리)

  • CREATE: 테이블 생성. (CREATE TABLE Users ...)
  • ALTER: 테이블 구조 수정. (ALTER TABLE Users ADD email ...)
  • DROP: 테이블 완전 삭제. (DROP TABLE Users;)
  • TRUNCATE: 테이블 데이터만 삭제. (구조는 남김)

② DML (Data Manipulation Language) - 데이터 조작어

테이블 안의 실제 데이터를 조작(추가, 수정, 삭제)합니다.

  • INSERT: 데이터 삽입. (INSERT INTO Users ...)
  • UPDATE: 데이터 수정. (UPDATE Users SET ...)
  • DELETE: 데이터 삭제. (DELETE FROM Users ...)

③ DQL (Data Query Language) - 데이터 질의어

데이터를 조회합니다. (많은 곳에서 DML의 일부로 보기도 하지만, SELECT는 워낙 중요하고 방대하여 따로 분류하기도 합니다.)

  • SELECT: 데이터를 조회. (SELECT FROM Users ...)

④ DCL (Data Control Language) - 데이터 제어어

데이터베이스 사용자의 권한을 관리합니다.

  • GRANT: 사용자에게 권한을 부여합니다.
  • REVOKE: 사용자의 권한을 회수합니다.

⑤ TCL (Transaction Control Language) - 트랜잭션 제어어

ACID 특성을 보장하는 트랜잭션을 제어할 때 사용합니다. DML 작업(INSERT, UPDATE, DELETE)을 논리적인 작업 단위로 묶습니다.

  • COMMIT: 모든 작업을 최종 확정하고 데이터베이스에 영구 저장합니다.
  • ROLLBACK: 작업 중 문제가 발생했을 때, 마지막 COMMIT 시점(혹은 SAVEPOINT)으로 모든 작업을 되돌립니다.
  • SAVEPOINT: 트랜잭션 내에 임시 저장 지점을 만들어, 전체가 아닌 특정 지점까지만 ROLLBACK 할 수 있게 합니다.

3. 키(Key)와 인덱스(Index)

키 (Key)의 종류

Key는 테이블의 각 행(Row)을 식별하거나 테이블 간의 관계를 맺는 데 사용되는 특별한 열(Column)입니다.

  • 슈퍼 키 (Super Key): 행을 유일하게 식별할 수 있는 모든 열의 조합입니다. (유일성은 만족하지만, 최소성은 만족하지 않아도 됨) (예: (학번), (주민등록번호), (학번, 이름))
  • 후보 키 (Candidate Key): 슈퍼 키 중에서 최소한의 열로만 구성된 키입니다. (유일성 + 최소성 만족) (예: (학번), (주민등록번호))
  • 기본 키 (Primary Key, PK):
    • 후보 키 중에서 개발자가 선택한 대표 키입니다.
    • 테이블 당 오직 하나만 존재하며, NULL과 중복을 허용하지 않습니다.
    • 행을 식별하는 가장 중요한 역할을 합니다. (예: 학번)
  • 대체 키 (Alternate Key): 후보 키 중에서 기본 키로 선택되지 않은 나머지 키들입니다. (예: 주민등록번호)
  • 외래 키 (Foreign Key, FK):
    • 다른 테이블의 기본 키(PK)를 참조하는 열입니다.
    • 두 테이블을 연결(관계)하는 다리 역할을 하며, 참조 무결성을 보장합니다.

인덱스 (Index) 동작 원리

Index는 데이터베이스의 SELECT 조회 속도를 획기적으로 향상시키는 기술입니다. 책 맨 뒤의 찾아보기(Index)와 같습니다.

인덱스의 자료구조: B-Tree

인덱스는 대부분 B-Tree (Balanced Tree)라는 자료구조로 구현됩니다.

  • 특징: B-Tree는 데이터가 정렬된 상태로 저장되며, 트리의 높이가 항상 균형 있게(Balanced) 유지됩니다.
  • 왜 빠른가?: 데이터가 100만 건이어도, B-Tree의 높이(Depth)는 몇 단계 되지 않습니다. (예: 3~4) 따라서 데이터를 찾을 때 몇 번의 탐색만으로 원하는 데이터의 실제 주소(pointer)를 빠르게 찾을 수 있습니다. (Full Table Scan이 O(N)O(N)이라면, Index 탐색은 O(logN))

Clustered vs. Non-Clustered 인덱스

  • 클러스터형 인덱스 (Clustered Index)
    • "국어사전" 자체와 같습니다. 데이터가 인덱스 키(보통 PK)를 기준으로 물리적으로 정렬되어 저장됩니다.
    • 테이블 당 하나만 생성할 수 있습니다.
    • 그 자체로 정렬된 데이터이므로, 범위 검색(BETWEEN, >)에 매우 빠릅니다.
  • 비클러스터형 인덱스 (Non-Clustered Index)
    • "책 뒤의 찾아보기"와 같습니다.
    • 실제 데이터는 정렬되어 있지 않고, 인덱스 페이지만 따로 만들어 정렬합니다.
    • 인덱스 페이지에는 찾는 값과 실제 데이터의 물리적 주소가 저장됩니다.
    • 테이블 당 여러 개 생성할 수 있습니다. (예: name에도, email에도 인덱스 생성 가능)

인덱스의 장단점 (Trade-off)

  • 장점:
    • SELECT (조회) 속도가 WHERE, JOIN, ORDER BY 절에서 매우 빨라집니다.
  • 단점 (치명적):
    • 쓰기 속도 저하: INSERT, UPDATE, DELETE 시, 데이터뿐만 아니라 B-Tree 인덱스 구조도 재정렬하고 수정해야 하므로 성능이 저하됩니다.
    • 추가 저장 공간: 인덱스를 저장하기 위한 별도의 디스크 공간이 필요합니다.

결론: Index는 조회(SELECT)가 압도적으로 많고, 데이터 변경(INSERT 등)이 적으며, WHERE 절에 자주 쓰이는 열(카디널리티가 높은 열)에 대해 전략적으로 생성해야 합니다.

5개의 댓글

comment-user-thumbnail
2025년 11월 2일

간략한 개념 정리 후에 뒤에서 심화 내용을 알려주어 더 이해가 쉬웠던 것 같습니다!

답글 달기
comment-user-thumbnail
2025년 11월 3일

설명이 자세하게 작성되어 있었고 명령어도 정리해주셔서 좋았어요

답글 달기
comment-user-thumbnail
2025년 11월 3일

RDBMS의 핵심 원칙에 대해서 강종하면서 설명하니까 이해하기 쉬웠습니다!

답글 달기
comment-user-thumbnail
2025년 11월 3일

기초 내용에서 그치지 않고 심화 내용을 다뤄주시니 좋았습니다!

답글 달기
comment-user-thumbnail
2025년 11월 3일

인덱스에 대해 자세히 설명되어있어 도움이 됐습니다!

답글 달기