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
'Computer Science' 카테고리의 다른 글
[Database] 5. 트랜잭션의 격리 수준과 락 (0) | 2023.09.30 |
---|---|
[Database] 4. 트랜잭션과 무결성 (0) | 2023.09.12 |
[Java] 1. JVM과 자바 코드 실행 과정 (0) | 2023.09.09 |
[Database] 3. 정규화 (0) | 2023.09.07 |
[Database] 1. 데이터베이스가 필요한 이유 (0) | 2023.09.05 |