개발 지식 기록/북스터디

데이터베이스

엉망진창좌충우돌 2024. 2. 16. 06:12

데이터베이스의 기본

데이터베이스 (DB, DataBase)

- 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음

- 특정 조직의 업무를 수행하는 데 필요한 상호 관련된 데이터들의 모임

- 여러 사람들이 공유하는 사용할 목적으로 통합 관리되는 데이터들의 모임

 

DBMS (DataBase Management System)

- 해당 데이터베이스를 제어, 관리하는 통합 시스템

- DBMS를 통해 데이터베이스를 관리하여 응용 프로그램들이 데이터베이스를 공유하고, 사용할 수 있는 환경을 제공

- 데이터베이스 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리 언어(query language)를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다.

 

※ DBMS의 기능
1) 데이터 정의 - 데이터에 대한 형식, 구조, 제약조건들을 명세하는 기능
2) 데이터 조작 - 특정한 데이터를 검색하기 위한 질의, 데이터베이스의 갱신, 보고서 생성 기능
3) 데이터 제어
- 데이터 무결성(Integrity)
- 보안(Security) / 권한(Authority) 검사
- 동시성 제어(Concurrency Control)
4) 데이터 공유 - 여러 사용자와 프로그램이 데이터베이스에 동시에 접근하도록 하는 기능
5) 데이터 보호 - 하드웨어나 소프트웨어의 오동작 또는 권한이 없는 악의적인 접근으로부터 시스템을 보호
6) 데이터 구축 - DBMS가 관리하는 기억 장치에 데이터를 저장하는 기능
7) 유지보수 - 시간이 지남에 따라 변화하는 요구사항을 반영할 수 있도록 하는 기능

 

※  DBMS의 종류
1) 계층형(Hierarchical DataBase)
- 데이터 간의 관계가 트리 형태의 구조
2) 네트워크형(Network DataBase)
- 계층형 데이터베이스의 단점을 보완하여 데이터 간 N:N(다대다) 구성이 가능한 망형 모델
- CODASYL이 제안한 것으로, CODASYL DBTG모델이라고도 한다.
3) 관계형(Relational DataBase)
- 키(Key)와 값(Value)으로 이루어진 데이터들을 행(Row)과 열(Column)로 구성된 테이블 구조로 단순화시킨 모델
4) 객체 지향형(Object-Oriented DataBase)
- 객체지향 프로그래밍 개념에 기반하여 만든 데이터베이스 모델
- 비정형 데이터들을 데이터베이스화할 수 있도록 하기 위해 만들어진 모델
5) 객체 관계형(Object-Relational DataBase)
- 관계형 데이터베이스에 객체 지향 개념을 도입하여 만든 데이터베이스 모델
6) NoSQL
- Not Only SQL의 줄임말로 SQL뿐만 아니라 다양한 특성을 지원한다는 의미
7) NewSQL
- RDBMS의 SQL과 NoSQL의 장점을 결합한 관계형 모델

 

엔터티

엔터티(개체, Entity)

- 데이터베이스에 데이터로 표현하려고 하는 현실 세계의 대상체

- 저장할 만한 가치가 있는 중요 데이터를 가지고 있는 사람이나 사물 등

- 서비스의 요구 사항에 맞춰 속성이 정해진다.

 

※ 약한 엔터티와 강한 엔터티

A가 혼자서는 존재하지 못하고 다른 것(B)의 존재 여부에 따라 종속적일 때 A는 약한 엔터티, B는 강한 엔터티

 

 

릴레이션

릴레이션(Relation)

- 정보를 구분하여 저장하는 기본 단위

- 관계형 데이터베이스에서는 '테이블', NoSQL 데이터베이스에서는 '컬렉션'

더보기

※ 릴레이션
- 데이터들을 2차원 테이블의 구조로 저장한 것
릴레이션의 구성
- 릴레이션 스키마 : 릴레이션 이름과 릴레이션에 포함된 모든 속성의 이름으로 정의하는 릴레이션의 논리적인 구조
- 릴레이션 인스턴스 : 릴레이션 스키마에 실제로 저장된 데이터의 집합
릴레이션의 특징
- 튜플의 유일성 : 릴레이션 안에는 똑같은 튜플이 존재할 수 없음
- 튜플의 무순서성 : 튜플 사이에는 순서가 없음
- 속성의 무순서성 : 속성 사이에는 순서가 없음
- 속성의 원자성 : 속성은 더 이상 분해할 수 없는 원자값만 가진다.
- 튜플들의 삽입, 갱신, 삭제작업이 실시간으로 일어나므로 릴레이션은 수시로 변한다.

 

속성

속성(Attribute)

- 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보

- 서비스의 요구 사항을 기반으로 관리해야 할 필요가 잇는 속성들만 엔터티의 속성이 된다.

더보기

- 릴레이션의 각 열을 속성 또는 Attribute라고 한다.
- 데이터를 구성하는 가장 작은 논리적인 단위

- 개체의 특성을 기술
- 속성의 수 = 디그리(Degree) = 차수

도메인

도메인

- 하나의 속성이 가질 수 있는 값의 범위

 

필드와 레코드

필드는 속성과 비슷하다

 

※ 필드타입

- 숫자 타입

타입 용량(바이트) 최솟값(부호 있음) 최솟값(부호 없음) 최댓값(부호 있음) 최댓값(부호 없음)
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 -2^63
(-92233720036854775808)
0 2^63-1
(92233720036854775807)
2^64-1
(18446744073709551615)

 

- 날짜 타입

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 00:00:01 ~ 2038-01-19 03:14:07, 4바이트

 

- 문자 타입

CHAR

: 고정 길이의 문자열, 길이는 0에서 255 사이의 값, 레코드를 저장할 때 무조건 선언한 길이 값으로 '고정'해서 저장된다.

VARCHAR

: 가변 길이 문자열, 길이는 0에서 65,535 사이의 값, 입력된 데이터에 따라 용량을 가변시켜 저장

TEXT

: 큰 문자열 저장에 쓰며 주로 게시판의 본문을 저장할 때 사용

BLOB

: 이미지, 동영상 등 큰 데이터 저장에 사용

ENUM

: ENUM 리스트로 설정한 것 중 단일 선택만 가능, ENUM 리스트에 없는 잘못된 값을 삽입하면 빈 문자열이 대신 삽입된다.

설정된 값들이 0,1 등으로 매핑되어 메모리를 적게 사용한다.

최대 65,535개의 요소들을 넣을 수 있다.

SET

: ENUM과 비슷하지만 여러 개의 데이터를 선택할 수 있고 비트 단위의 연산을 할 수 있으며 최대 64개의 요소를 집어넣을 수 있다.

(ENUM 이나 SET을 쓸 경우 공간적으로 이점을 얻을 수 있지만 애플리케이션 수정에 따라 DB의 ENUM이나 SET에서 정의한 목록을 수정해야 한다는 단점이 존재)

 

레코드

- 릴레이션의 행(row)

- 튜플(Tuple)이라고도 함

- 튜플의 수 = 카디널리티(Cardinality) = 기수

 

그외 용어들

더보기

차수(Degree)

- 하나의 릴레이션에서 속성의 전체 개수

 

카디널리티(Cardinality)

- 하나의 릴레이션에서 튜플의 전체 개수

 

관계

관계(Relationship)

- 서로 다른 개체가 맺고 있는 의미 있는 연관성

- 1:1  개체 집합 A의 원소가 개체 집합 B의 원소 1개와 대응

- 1:N  개체 집합 A의 각 원소는 개체 집합 B의 원소 여러 개와 대응할 수 있고, 개체 집합 B의 각 원소는 개체 집합 A의 원소 1개와 대응

- N:M  개체 집합 A의 각 원소는 개체 집합 B의 원소 여러 개와 대응할 수 있고, 개체 집합 B의 각 원소도 개체 집합 A의 원소 여러 개와 대응

 

새발(Crow-feet) 표기법

출처 : 해시넷

N:M은 테이블 두 개를 직접적으로 연결해서 구축하지 않고, 1:N, 1:M 관계를 갖는 테이블 두 개로 나눠서 설정

 

키(Key)의 개념
- 릴레이션에서 다른 튜플들과 구별할 수 있는 유일한 기준이 되는 컬럼
키(Key)의 종류

출처 - 해시넷


1) 후보키(Candidate Key)
- 릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별할 수 있는 속성들의 부분집합

- 모든 릴레이션은 반드시 하나 이상의 후보키를 가져야 한다.
- 튜플에 대한 유일성과 최소성을 만족시켜야 한다.
2) 기본키(Primary Key)
- 후보키 중에서 선택한 주키(Main Key)
- 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성

- Null 값을 가질 수 없다.(개체 무결성)

- 기본키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없다.(개체 무결성)

- 기본키는 자연키 또는 인조키 중 설정

 

유일성? 최소성?

더보기

유일성 : 릴레이션 안에는 똑같은 튜플이 존재할 수 없음

최소성 : 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것.

(하나의 속성으로도 기본키로 사용이 가능할 때 다른 속성과 함께 묶여 기본키로 사용되었을 경우 유일성은 만족할 수 있지만 최소성을 만족할 수 없다.)

자연키? 인조키?

더보기

자연키 : 중복된 값들을 제외하며 중복되지 않는 것을 '자연스레' 뽑다가 나오는 키, 언젠가 변하는 속성을 지닌다.

인조키 : 인위적으로 셍성한 키, 변하지 않기 때문에 보통 기본키는 인조키로 설정한다.

 

3) 대체키(Alternate Key)
- 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키
4) 슈퍼키(Super Key)
- 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키
- 튜플에 대한 유일성은 만족하지만, 최소성은 만족시키지 못한다.
5) 외래키(Foreign Key)
- 관계(Relation)를 맺고 있는 릴레이션 R1, R2에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성

- 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는 데 중요한 도구로 사용

- 외래키로 지정되면 참조 테이블의 기본키에 없는 값은 입력할 수 없다.(참조 무결성 조건)

- 중복 가능

 

무결성?

더보기

데이터베이스 무결성 개념
- 데이터의 정확성, 일관성, 유효성이 유지되는 것
데이터베이스 무결성 종류
1) 개체 무결성(Entity Integrity)
- 모든 릴레이션은 기본 키(Primary Key)를 가져야 한다.
- 기본키는 중복되지 않은 고유한 값을 가져야 한다.
- 릴레이션의 기본키는 NULL 값을 허용하지 않는다.
2) 참조 무결성(Referential Integrity)
- 외래키 값은 NULL이거나 참조하는 릴레이션의 기본키 값과 동일해야 한다.
- 각 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없다.

참조 무결성 제약조건

제약조건 설명
제한(Restrict) 문제가 되는 연산을 거절
연쇄(Cascade) 부모 릴레이션에서 튜플을 삭제하면 자식 릴레이션에서 이 튜플을 참조하는 튜플도 함께 삭제
널값(Nullify) 부모 릴레이션에서 튜플을 삭제하면 자식 릴레이션에서 이 튜플을 참조하는 튜플들의 외래키에 NULL 등록
기본값(Default) Null을 넣는 대신에 디폴트 값을 등록

3) 도메인 무결성(Domain Integrity)
- 속성들의 값은 정의된 도메인에 속한 값이어야 한다.
- 성별이라는 컬럼에는 ‘남’, ‘여’를 제외한 데이터는 제한되어야 한다.
4) 고유 무결성(Unique Integrity)
- 릴레이션의 특정 속성에 대해 각 튜플이 갖는 속성 값들이 서로 달라야 한다.
5) 키 무결성(Key Integrity)
- 하나의 릴레이션에는 적어도 하나의 키가 존재해야 한다.
6) 릴레이션 무결성(Relation Integrity)
- 삽입, 삭제, 갱신과 같은 연산을 수행하기 전과 후에 대한 상태의 제약

 

 

ERD와 정규화 과정

ERD(Entity Relationship Diagram)

- 릴레이션 간의 관계를 정의한 것

- 관계형 구조로 표현할 수 있는 데이터를 구성하는 데 유용할 수 있지만 비정형 데이터를 충분히 표현할 수 없다.

(비정형 데이터 : 비구조화 데이터를 말하며, 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보를 말한다.

 

정규화 과정

정규화의 개념
- 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화
정규화의 목적
- 데이터의 중복을 최소화
- 정보의 무손실 : 정보가 사라지지 않아야 함
- 독립적인 관계는 별개의 릴레이션으로 표현
- 정보의 검색을 보다 용이하게 함
- 이상 현상 최소화
정규화의 장/단점

장점 - 데이터 중복의 최소화
- 저장 공간의 효율적 사용
- 릴레이션에서 발생 가능한 이상 현상 제거
단점 - 처리 명령의 복잡
- 실행 속도 저하
- 분리된 두 릴레이션 간 참조 무결성 유지를 위한 노력 필요
- 분리된 여러 개의 테이블에서 정보를 취합하기 위한 JOIN 연산이 필요

 

이상 현상(Anomaly)
- 데이터 중복으로 인해 릴레이션 조작 시 예상하지 못한 곤란한 현상이 발생
- 이상의 종류
① 삽입 이상 : 데이터를 삽입할 때 불필요한 데이터가 함께 삽입되는 현상
② 삭제 이상 : 한 튜플을 삭제할 때 연쇄 삭제 현상으로 인해 정보 손실
③ 갱신 이상 : 튜플의 속성값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상

 

함수적 종속(Functional Dependency)
1) 함수적 종속의 개념
- 어떤 릴레이션 R의 X와 Y를 각각 속성의 부분집합이라고 가정했을 때
--- X의 값을 알면 Y의 값을 바로 식별할 수 있고, X의 값에 Y의 값이 달라질 때, Y는 X에 함수적 종속이라고 함
--- 이를 기호로 표현하면 X→Y
2) 함수적 종속 관계
- 완전 함수적 종속(Full Functional Dependency)

종속자가 기본키에만 종속되며, 기본키가 여러 속성으로 구성되어 있을 때, 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우

- 부분 함수적 종속(Partial Functional Dependency)
기본키가 여러 속성으로 구성되어 있을 때, 기본키를 구성하는 속성 중 일부만 종속되는 경우

 

기본키가 두개일 때 부분 함수 종속

회원 번호 강의 코드 강의명 강의 점수
M001 P001 미시경제학 80
M002 P002 거시경제학 70
M003 P003 재정학 80
M004 P004 개방거시경제학 100

 

위 릴레이션에서 강의점수는 기본키(회원번호+강의코드)에 종속적이지만, 강의명은 강의 코드에만 종속된다.

강의명이 부분 함수 종속된 관계

 

- 이행적 함수 종속(Transitive Functional Dependecy)
X→Y, Y→Z 이러한 종속 관계가 있을 경우, X→Z가 성립되는 경우

학번 주민번호 이름
001 1111 영희
002 2222 철수
003 3333 민수

 

정규화 과정

기본 정규형 : 제 1정규형, 제 2정규형, 제3정규형, 보이스/코드 정규형

고급 정규형 : 제 4정규형, 제 5정규형

 

1) 제 1정규형(1NF)
- 어떤 릴레이션에 속한 모든 도메인이 원자값만으로 되어 있다.

- 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있어서는 안된다.

고객 번호 이름 여행지
001 철수 서울
002 영희 서울, 인천
003 민수 인천, 광주, 부산

 

고객 번호 이름
001 철수
002 영희
003 민수

 

고객 번호 여행지
001 서울
002 서울
002 인천
003 인천
003 광주
003 부산

 

2) 제 2정규형(2NF)
- 부분 함수적 종속을 모두 제거하여 완전 함수적 종속으로 만든다.

회원 번호 강의 코드 강의명 강의 점수
M001 P001 미시경제학 80
M002 P002 거시경제학 70
M003 P003 재정학 80
M004 P004 개방거시경제학 100

 

강의 코드 강의명
P001 미시경제학
P002 거시경제학
P003 재정학
P004 개방거시경제학

 

회원 번호 강의 코드 강의 점수
M001 P001 80
M002 P002 70
M003 P003 80
M004 P004 100

 

- 강의명은 강의 코드만 가지고 알 수 있다.

- 강의 코드와 강의명을 하나의 릴레이션으로 하고, 강의 점수는 회원 번호와 강의 코드가 필요하기 때문에 이릃 하나의 릴레이션으로 구성한다.

 

3) 제 3정규형(3NF)
- 이행적 함수 종속을 없앤다.

학번 주민번호 이름
001 1111 영희
002 2222 철수
003 3333 민수

 

- 학번을 알면 주민번호를 알 수 있고 주민번호를 알면 이름을 알 수 있다.

- 학번과 주민번호를 하나의 릴레이션으로, 주민번호와 이름을 하나의 릴레이션으로 구성한다.

학번 주민번호
001 1111
002 2222
003 3333

 

주민번호 이름
1111 영희
2222 철수
3333 민수


4) 보이스/코드(BCNF) 정규형
- 결정자 중 후보키가 아닌 것들을 제거, 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태

(결정자 : 함수 종속 관계에서 특정 종속자(dependent)를 결정짓는 요소, 'X->Y'일 때 X는 결정자, Y는 종속자이다.)

- 후보키는 최소성과 유일성을 만족해야 한다. 즉 후보키만으로 릴레이션에서 튜플을 특정할 수 있는 능력이 있어야 하며, 유일성을 가지는 데 꼭 필요한 속성들로만 구성되어야 한다,

 

 

일반적으로 데이터베이스에서 3NF는 거의 완벽한 수준이고, 데이터베이스의 설계 목표가 3NF를 만드는 것이다.

하지만 간혹 3NF임에도 문제가 있을 수 있다.

학번 과목 교수
1234 데이터베이스 김용주
1234 자료구조 이우정
2587 프로그래밍 박정미
2587 자료구조 고현주
3654 데이터베이스 김용주

 

◎ 가정

각 교수는 한 과목만 담당한다고 가정

각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강

한 수강명은 여러 강사가 담당할 수 있다고 가정

 

함수 종속 관계는 다음과 같다

{학번,과목} -> 교수

교수 -> 과목

 

위와 같을 때 {학번,과목}과 교수의 관계는 문제 없어 보이지만 교수와 과목의 관계가 불안정하다.

- 삽입 이상

새로운 교수가 새로운 과목을 강의하게 되었을 때 기본키인 학번이 NULL이므로 삽입이 불가능하다

- 삭제 이상

학번이 '1234'인 학생이 '자료구조' 수강을 취소하면 '이용주' 교수가 '자료구조' 수업을 맡고 있다는 정보도 삭제된다.

- 갱신 이상

'김용주' 교수의 강의 과목이 변경되었을 경우 '김용주'에 대한 모든 튜플에 대해 변경되어야 한다. 그렇지 않으면 일관성에 문제가 생긴다.

 

이를 해결한 것이 보이스/코드 정규형이다.

 

각 교수는 한 과목만 맡을 수 있으므로 과목 속성에 대해 결정자다.

그렇지만 교수 정보만 가지고는 튜플을 식별할 수 없다. 즉 후보키가 될 수 없다.

교수 속성이 후보키가 될 수 있게 릴레이션을 분할하면 다음과 같다.

학번 교수
1234 김용주
1234 이우정
2587 박정미
2587 고현주
3654 김용주

 

교수 과목
김용주 데이터베이스
이우정 자료구조
박정미 프로그래밍
고현주 자료구조

 

5) 제 4정규형(4NF)
- 다치 종속을 제거
6) 제 5정규형(5NF)
- 조인 종속 이용

 

정규화가 항상 성능이 좋아지는 것은 아니다. 테이블을 나누면 조인이 발생해서 더 느려질 수도 있다. 그럴 경우 반정규화(역정규화)를 해야 한다.

 

반정규화의 개념
- 시스템의 성능향상과 개발 편의성 등을 위해 정규화에 위배되는 중복을 허용하는 기법
반정규화 시 고려사항
- 데이터의 중복이 발생하여 데이터 수정 시 무결성이 깨질 수 있다.
- 읽기 속도는 향상되지만, 삽입/삭제/수정 속도는 느려짐
- 저장 공간의 효율이 떨어짐
- 테이블이 크고 복잡해져 유지보수가 어려움
- 과도한 반정규화는 오히려 성능을 저하시킴
반정규화의 적용순서

순서 설명
반정규화 대상 조사 - 자주 사용하는 테이블에 접근하는 프로세스의 수가 많고 항상 일정 범위만을 조회하는 경우
- 테이블에 대량의 데이터가 있고, 대량의 데이터 범위를 자주 처리하는 경우
- 통계 정보를 필요로 할 때
- 지나치게 많은 조인이 걸려 있을 때
다른 방법으로 유도 - 성능을 고려한 뷰를 생성하고, 뷰를 통해 접근하게 함으로 성능저하 위험 예방
- 인덱스나 클러스터링을 통한 성능 향상
- 파티셔닝 고려
- 애플리케이션의 로직을 변경하여 성능 향상
반정규화 수행 - 반정규화를 수행한다.

 

 

 

참고

[데이터베이스] 제 3, 4, 5, 보이스코드 정규형 (velog.io)

 

[데이터베이스] 제 3, 4, 5, 보이스코드 정규형

제 3, 4, 5 그리고 보이스코드 정규형에 대해 알아봅니다.

velog.io