[Database] 2. 관계형 데이터베이스 설계하기

1. 관계형 데이터베이스란?

1.1. 관계형 데이터베이스의 정의

- Relational Database (RDB)

- 데이터를 테이블 형태로 관리하는 데이터베이스 시스템

- 테이블에는 행(row)과 열(column)의 형태로 저장되며, 각 행은 고유한 식별자(primary key)를 가지고 있음

- 데이터 구조를 사전에 정의하고, SQL(Structured Query Language)를 사용하여 데이터를 조작하고 검색함

- 중복 데이터 저장을 방지하기 위해 테이블을 분리시키고 테이블 간 관계를 형성함 (1:1, 1:N. N:M)

- 위와 같이 테이블 간의 관계는 기본 키(primary key)와 외래 키(foreign key)라는 개념을 사용해 맺어질 수 있음

- 외래 키는 기본 키를 참조하는 필드로, 주문 테이블의 고객 번호 필드가 외래 키가 되어, 테이블을 연결하는 역할을 함

 

1.2. 관계형 데이터베이스의 목적

테이블 구조화

- 데이터를 테이블 형태로 구조화하여 저장하므로 데이터가 일관성 있게 관리됨

 

데이터 무결성

- 제약 조건과 트랜잭션을 사용하여 데이터 무결성을 보장함

 

데이터 검색

- SQL을 사용하여 복잡한 쿼리를 실행해 데이터를 검색하고 필터링할 수 있음

 

데이터 관계

- 여러 테이블 간의 관계를 정의하여 데이터를 관리하고 조인을 사용해 연관된 데이터를 연결함

 

1.3. RDB와 NoSQL

- DBMS의 종류는 크게 관계형 데이터베이스(RDB)와 NoSQL(Not Only SQL)로 나뉨

  RDB NoSQL
데이터 저장 모델 table JSON document, key-value, graph 등
개발 목적 데이터 중복 감소 애자일, 확장 가능성, 수정 가능성
종류 Oracle, MySQL, PostgreSQL 등 MongoDB, DynamoDB 등
스키마 엄격한 데이터 구조 유연한 데이터 구조
장점 - 명확한 데이터 구조 보장
- 데이터 중복 없이 한 번만 저장
- 데이터 중복이 없어 데이터 수정 용이
- 유연하고 자유로운 데이터 구조
- 새로운 필드 추가가 자유로움
- 수평적 확장(scale-out) 용이
단점 - 시스템이 커지면 Join문이 많은 복잡한 쿼리
- 수평적 확장이 까다로워 비용이 큰 수직적 확장(scale-up)이 주로 사용됨
- 데이터 중복 발생 가능
- 중복 데이터가 많기에 데이터 변경 시 모든 컬렉션에서 수정 필요
- 명확한 데이터 구조를 보장하지 않음
사용 - 데이터 구조가 변경될 여지 없이 명확한 경우
- 데이터 update가 잦은 시스템
- 정확한 데이터 구조가 정해지지 않은 경우
- update가 자주 이뤄지지 않는 경우
- 데이터 양이 매우 많은 경우

- RDB와 비교하여 NoSQL의 특징은, ACID와 Transaction을 지원하지 않는다는 것

 

ACID와 트랜잭션이란?

 

[Database] 4. 트랜잭션과 무결성

1. 트랜잭션이란? 1.1. 트랜잭션의 정의 - 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위 - 데이터베이스의 상태를 변화시킬 때, 이를 완전하게 수행하거나 하나도 수행하지

ssoyeong.tistory.com

 

2. 관계형 데이터베이스 설계하기

- 올바른 설계는 데이터의 효율적인 저장과 검색, 데이터 무결성 유지를 보장함

Step 0. 배경

- 온라인 서점의 데이터베이스를 설계하자

- 책, 저자, 주문, 고객에 대한 정보를 저장하자

 

Step 1. 요구사항 분석

- 어떤 데이터가 필요한지, 데이터 간의 관계는 어떻게 되는지를 이해해야 함

- 다음과 같은 정보가 필요할 수 있음

 

Step 2. 엔티티 식별

- 데이터베이스에서 사용할 엔티티를 식별함

- 각 엔티티는 데이터의 논리적인 그룹을 나타냄

- , 저자, 주문, 고객이 엔티티가 될 수 있음

# 엔티티란?
업무 수행을 위해 기업이 알아야할 대상이 되는 사람, 장소, 사물, 사건 및 개념

# 앤티티 충족 요건
업무에 유용한 정보를 제공해야 함
명확한 속성 유형이 하나 이상 존재해야 함
각각의 인스턴스를 구분할 수 있어야 함
최소한 하나 이상의 다른 엔티티와 관계를 가져야 함

 

Step 3. 속성 정의

- 각 엔티티에 속한 속성을 정의함

- 속성은 엔티티의 특성이나 필드를 나타냄

- 엔티티의 속성으로는 제목, ISBN, 가격 등이 있을 수 있음

 

Step 4. 관계 정의

- 각 엔티티 간의 관계를 정의함

- 이 관계는 외래 키를 통해 표현됨

- 예를 들어, 엔티티와 저자 엔티티 간에는 "책이 저자에 의해 쓰였다"라는 관계가 있음

- 이 관계를 정의하기 위해 엔티티에 저자ID라는 외래 키를 추가함

- 이러면 각 책은 하나 이상의 저자와 연결됨 (공동 저자가 있을 수 있음)

- 1:1, 1:N. N:M 등의 관계가 생길 수 있음 (N:M인 경우, 두 테이블에는 상대의 기본 키를 외래 키로 가지고 있음)

 

Step 5. 정규화

- 데이터베이스 정규화를 수행하여 데이터 중복을 최소화하고 데이터 무결성을 유지함

 

정규화란?

 

[Database] 3. 정규화

1. 정규화란? 1.1. 정규화의 배경 - 관계형 데이터베이스가 등장하면서 데이터 모델링에 새로운 접근 방식이 도입됨 - 이 접근 방식은 데이터를 테이블로 구성하고, 각 테이블의 구조를 정의하여

ssoyeong.tistory.com

 

Step 6. 물리적 설계

- 데이터베이스의 물리적 구조를 정의하고 데이터를 저장하고 검색하는 방법을 결정함

 

6.1. 스키마 정의

- 논리적 설계에서 정의한 논리적 데이터 모델을 바탕으로, 테이블과 인덱스의 물리적 스키마를 정의함

- 이는 각 테이블의 열 및 데이터 형식, 제약 조건, 기본 키, 외래 키 등을 포함함

- 스키마 정의는 DDL문을 사용하여 수행됨

 

6.2. 인덱스 설계

- 데이터를 빠르게 검색하기 위해 필요한 인덱스를 정의함

- 어떤 열에 인덱스를 생성할 것인지 결정하고, 인덱스 유형(B-tree, 해시 등)을 선택함

 

인덱스란?

 

[Database] 6. 인덱스

1. 인덱스란? 1.1. 인덱스의 정의 - 데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 자료구조 - 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것 - 주로 두 가지 구성

ssoyeong.tistory.com

 

6.3. 저장 구조 결정

- 데이터베이스 테이블을 어떻게 저장할지 결정함

- DBMS의 물리적 스토리지 구조와 관련 있음 (테이블 스페이스, 데이터 파일, 로그 파일, 캐시 등의 구조를 고려)

 

6.4. 파티셔닝 및 클러스터링

- 대용량의 테이블의 경우, 데이터 파티셔닝을 통해 데이터를 여러 개의 논리적 파티션으로 분할하고

- 클러스터링을 통해 데이터를 물리적으로 저장하는 방식을 결정할 수 있음

- 이를 통해 데이터베이스의 성능을 최적화할 수 있음

 

6.4.1. 파티셔닝(Partitioning)

- 데이터를 여러 개의 논리적 파티션으로 분할하여 저장하는 기술

 

가로 파티션(Horizontal Partitioning)

- 주로 열을 기준으로 테이블을 분할할 기준을 선택함

- 파티션 함수를 정의하여 데이터를 어떻게 분할할지 결정함

CREATE TABLE sales (
    sale_id INT AUTO_INCREMENT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p0 VALUES LESS THAN (1990),
    PARTITION p1 VALUES LESS THAN (2000),
    PARTITION p2 VALUES LESS THAN (2010),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

 

6.4.2. 클러스터링(Clustering)

- 인덱스를 효율적으로 관리하기 위한 기술로, 클러스터드 인덱스(Clustered Index)라고도 함

- MySQL에서는 InnoDB  스토리지 엔진을 사용하는 경우에만 사용할 수 있음

- InnoDB 테이블을 생성하고 클러스터드 인덱스를 정의함. 보통 기본 키 열이 클러스터드 인덱스가 됨

- 클러스터드 인덱스는 테이블의 데이터를 물리적으로 정렬하여 저장함. 이로써 검색 성능이 향상됨

- 아래의 경우, user_id 열이 클러스터드 인덱스로 설정되며, 이 인덱스를 사용하여 데이터를 검색하면 성능이 향상됨

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    email VARCHAR(255)
) ENGINE=InnoDB;

 

Step 7. 구현 및 테스트

- 데이터베이스를 실제로 구현하고 데이터를 채워 넣음

- 데이터베이스 시스템을 테스트하여 예상대로 동작하는지 확인함

 

Step 8. 유지보수 및 최적화

- 데이터베이스를 운영하는 동안 발생하는 문제를 해결하고 데이터베이스 성능을 최적화하기 위해 유지보수를 수행함

 

 

참고자료

https://hyuuny.tistory.com/158

https://noahlogs.tistory.com/37

https://hyun-am-coding.tistory.com/entry/Chapter-11-%EA%B4%80%EA%B3%84%ED%98%95-DB-%EC%84%A4%EA%B3%84-%EA%B3%BC%EC%A0%95