컴퓨터/database

데이터베이스 암기 노트

김크리 2020. 10. 6. 21:27

데이터 모델링

모델 : 다양한 현상에 대해 일정한 표기법에 의해 표현해 놓은 모형이다.
모델링 : 표기법에 의해 규칙을 가지고 표기하는 것이다. 즉, 모델을 만들어가는 일 자체

특징

1. 추상화
2. 단순화
3. 명확화

진행

개념적으로 갈 수록 추상적이다.

1. 개념적 데이터 모델링
추상화 수준이 높고, 업무 중심적이며 포괄적인 수준의 모델링을 진행한다. 전사적 데이터 모델링, EA 수립시 이용한다.

2. 논리적 데이터 모델링
시스템으로 구축하고자 하는 업무에 대해 Key, 속성, 관계 등을 정확하게 표현한다. 재사용성이 높다.

3. 물리적 데이터 모델링
실제 데이터베이스에 이식할 수 있도록 성능, 저장 등 물리적인 성격을 고려하여 설계한다.

스키마

데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합이다.
스키마는 데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의한다.

1. 외부 스키마
2. 개념 스키마
3. 내부 스키마

정규화

반정규화
1차정규화
2차정규화
3차정규화
BCNF 정규화

트랜잭션(Transaction)

특성(ACID)

원자성(Atomicity), All or nothing
트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
일관성(Consistency)
트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.
독립성(Isolation)
하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다.
지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.

격리수준(Isolation Level)

DBMS에서 여러 사용자가 동일한 데이터를 동시에 수정하려고 할 때, 발생하는 상황을 정확하게 정의할 수 있도록 제공하는 기능중 하나이다.
1단계 : Read Committed
DBMS의 기본 격리수준이다. 커밋된 데이터만 읽는 격리 수준이다.
커밋하지 않은 데이터를 읽을 수 있다면, 이를 Dirty Read라고 부른다.

2단계 : Repeatable Read
데이터 조회시 항상 동일한 데이터 응답을 보장하는 격리 수준이다.

3단계 : Serializable
모든 작업을 하나의 트랜젝션에서 처리하는 것과 같은 높은 격리 수준을 제공한다. 높은 격리 수준에 따라 동시성 처리 효율은 떨어진다.

조인(join)

내부조인(INNER JOIN)

동등조인, 자연조인, 교차조인

외부조인(OUTER JOIN)

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, SELF JOIN\

Nested Loop Join

바깥 테이블의 처리 범위를 하나씩 접근하면서 추출된 값으로 안쪽 테이블을 조인하는 방식이다.
중첩 루프문과 동일한 원리이다.
좁은 범위에 유리하다.
순차적으로 처리한다.
문자열 비교에서 대소문자를 구분하지않는다.
Hash Join
Sort Merge Join

인덱스(Index)

인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 찾아보기와 유사한 개념이다.
Insert, Update, Delete 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 존재한다.
- 인덱스는 B tree 자료 구조로 구현
- 인덱스에 들어간 key가 바뀌면
B 트리의 균형이 깨지면서 B 트리 구조를 수정해야 할 경우가 생긴다. -> 추가적인 I/O. 성능 하락

클러스터드 인덱스
- 테이블 당 한 개만 생성 가능하며,
- 행 데이터를 인덱스로 지정한 컬럼에 맞춰 정렬 (보통 PK)
- 데이터를 직접 정렬해서 순서를 구현

논-클러스터드 인덱스
- 테이블 당 여러 컬럼에 대해 생성 가능
- 별도의 공간에 인덱스 테이블을 생성하여, 정렬 효과를 구현

문서 데이터베이스(Document DB)

JSON 유사 형식의 문서로 데이터를 저장 및 쿼리하도록 설계된 비관계형 데이터베이스 유형이다.
문서 데이터베이스에서는 유연한 인덱싱, 쿼리, 문서 모음에 대한 분석을 지원한다.

관계형 데이터베이스(RDBMS, Relation DataBase Management System)

Oracle

대규모 데이터 베이스를 지원한다.
고성능 트랜잭션 처리를 제공하여 속도가 빠르다.
SQL 문을 실행하는 가장 효율적인 방법을 선택한다. 비용을 최소화 하기 위해 테이블과 인덱스를 분석한다.

MySQL

오픈소스로 무료로 사용 가능하다.
update 성능이 postgre보다 우수하다.
Nested Loop Join만 지원한다.
간단한 데이터 트랜잭션을 위한 데이터베이스가 필요한 웹 기반 프로젝트에 널리사용된다.
로드가 많거나 복잡한 쿼리는 성능이 저하된다.

PostgreSQL

오픈 소스로 무료로 사용가능하다.
다양한 join 방법을 제공한다.(nested Loop join, hash join, sort merge join)
update시 과거 행을 삭제하고 변경된 데이터를 가진 새로운 행을 추가하는 형태이어서 update 가 느리다.
처리 속도를 빠르게 하기 위해 여러 CPU를 활용하여 쿼리를 실행한다.
데이터베이스 클러스터 백업기능을 제공한다.
동시성을 효율적으로 처리하여 매우 높은 수준의 동시성을 달성한다.

비관계형 데이터베이스(NOSQL, Not Only Sql)

대량의 데이터를 효율적으로 처리가 필요할때, 데이터의 분산처리, 빠른 쓰기 및 데이터의 안정성이 필요할때 사용한다.

종류
1. Key-Value storage : Redis, memcache, Oracle, Coherence
2. 열 지향 와이드 컬럼 스토어 : Cassandra, HBASE, Cloud Database
3. Document DB : MongoDB, Couchbase, MarkLogic, PostgreSQL, MySQL, DynamicDB, MS-DocumentDB
4. 그래프형 : Neo4j

레디스(Redis, REmote Dictionary Server)
메모리 기반의 "키-값" 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 조회하기에 빠른 읽기/쓰기 속도를 보장하는 비관계형 데이터베이스이다. <String, Set, Sorted Set, Hash, List> 대표적으로 총 5가지의 데이터 형식을 지원한다.

데이터가 메모리와 디스크에 저장되어 불의의 경우에 데이터 복구가 가능하다.

쓰기 성능 증대를 위한 클라이언트 측 샤딩(sharding)을 지원한다.

Value 값으로 문자열, 리스트, Set, Sorted set, Hash 등 여러 데이터 형식을 지원하기에 다양한 방식으로 데이터를 활용할 수 있다.
리스트형 데이터 입력/삭제가 MySQL에 비해 약 10배정도 빠르다고 한다.

여러 프로세스에서 동시에 같은 Key에 대한 갱신을 요청할 경우, Atomic 처리로 데이터 부정합 방지 Atomic 처리 함수를 제공한다.(원자성)

메모리를 활용하며 영속적인 데이터를 보존한다.(영속성)
인메모리, 비 관계형 데이터 베이스

Mysql
Mysql Document-store
관계형 데이터베이스와 문서 데이터베이스 간의 크로스 오버할 수 있다.
다양한 언어 및 환경을 커버하는 공통 API이다.
관계형 테이블에 대한 쉬운 CRUD 작업 및 문서 데이터베이스 형대의 모음이다.
Doc-store의 문서는 JSON으로 표현되며, MySQL에서 지원된다.
컬렉션 내에 여러 문서가 저장되는 하나의 InnoDB 테이블이다.

옵티마이저

SQL을 빠르고 효율적으로 수행할 최적의 처리경로를 생성해주는 DBMS 내부의 핵심 엔진이다.

힌트(Hint)

SQL 튜닝의 핵심부분으로 일종의 지시구문이며 SQL에 포함되어 쓰여져 옵티마이저의 실행계획을 원하는 대로 바꿀 수 있게 해줍니다. (/*+ hint +*/)

뷰(View)

1. 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.
2. 뷰는 저장장치 내에 물리적으로 존재하지 않지만 사용자에게 있는 것처럼 간주된다.
3. 뷰는 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용된다.
뷰는 조인문의 사용 최소화로 사용상의 편의성을 최대화한다.

특징

1. 뷰는 기본테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용하며, 조작도 기본 테이블과 거의 같다.

2. 뷰는 가상 테이블이기 때문에 물리적으로 구현되어 있지 않다.

3. 데이터의 논리적 독립성을 제공할 수 있다.

4. 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다.

5. 뷰를 통해서만 데이터에 접근하게 하면 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다.

6. 기본 테이블의 기본키를 포함한 속성(열) 집합으로 뷰를 구성해야지만 삽입, 삭제, 갱신, 연산이 가능하다.

7. 일단 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다.

8. 뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.

장점

1. 논리적 데이터 독립성을 제공한다.

2. 동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구를 지원해준다.

3. 사용자의 데이터관리를 간단하게 해준다.

4. 접근 제어를 통한 자동 보안이 제공한다.

단점

1. 독립적인 인덱스를 가질 수 없다.

2. ALTER VIEW 문을 사용할 수 없다. 즉, 뷰의 정의를 변경할 수 없다.

3. 뷰로 구성된 내용에 대한 삽입/갱신/연산/삭제에 제약이 따른다.

JDBC(Java Database Connectivity)

DB에 접근할 수 있도록 Java 에서 제공하는 API이다.

JDBC drive loading - Connection - SQL Execute - Resource return

ORM(Object-Relational Mapping) : 객체를 통해 간접적으로 데이터베이스 데이터를 다르눈 객체 관계 매퍼(ex. JPA)

SQL Mapper : SQL 문장으로 직접 데이터 베이스 데이터를 다루는 SQL Mapper (ex. Mybatis)

Lock

데이터의 일관성을 보장하기위한 방법이다. 오라클과 같이 고가의 DBMS는 Lock을 통한 무결성과 일관성을 유지하는 능력이 뛰어나다.

1. Shared Lock
보통 데이터를 읽을때 사용한다. 원하는 데이터에 lock을 걸었지만 다른 세션에서도 읽을 수 있다.
2. Exclusive Lock
보통 데이터를 변경할 때 사용한다. 해당 lock이 해제되기 전까지는 다른 공유lock, 배타적 lock을 설정할 수 없다.(읽기/쓰기 불가능)

Blocking
Lock들의 경합이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 의미한다. 이를 해결하기위해 Transaction commit 또는 rollback을 진행한다.

Dead lock
트랜잭션 간의 교착상태를 의미한다. 두개의 트랜젝션 간에 각각의 트랜젝션이 가지고 잇는 리소스의 Lock을 휙득하려고 할 때 발생한다.

데이터베이스 링크(Database Link)

클라이언트 또는 현재의 데이터베이스에서 네트워크상 다른 데이터베이스에 접속하기 위한 접속 설정을 정의하는 오라클 객체이다.

리플리케이션(Replication)

두 개 이상의 DBMS 시스템을 Master / Slave로 나누어 동일한 데이터를 저장하는 방식이다.

파티셔닝(Partitioning)

큰 테이블이나 인덱스를 관리하기 쉬운 단위로 분리하는 방법을 의미한다.
데이터 가용성 향상, 대량의 데이터 관리 용이성, 성능 향상 등의 장점이 있다.
Range, List, Composite, Hash, Horizontal, Vertical 파티셔닝이 존재한다.

샤딩(Sharding)

파티셔닝(Partitioning)과 유사하다. 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법을 의미한다.
샤딩을 적용하면 프로그래밍, 운영적 복잡도는 높아지는 단점이 있다.

InnoDB

MySQL을 위한 데이터베이스 트랜잭션-세이프 스토리지 엔진이다.
commit, rollback, 장애복구, row-level locking, 외래키 등을 지원한다.

데이터 유형

CHAR
- 고정 길이 문자열 정보
- 기본 길이 1바이트, Oracle 최대 2000바이트, SQL Server 최대 8000바이트
- 고정 길이 문자열 정보이기 때문에, 우측 공백(tailing space)를 넣어 지정된 길이를 맞춘다.

VARCHAR(2)
- Character Varying 의 약자로, 가변 길이 문자열 정보
- 최소 길이는 1바이트, Oracle 최대 4000바이트, SQL Server 최대 8000바이트
- 최대 길이를 갖기만 가변 길이로 조정이 되기 때문에 할당된 변수값의 바이트만 적용된다.
- 길이가 변할 수 있는 값은 VARCHAR를 사용하고, 길이가 일정한 데이터는 CHAR를 사용하는 것이 좋다.

NUMBERIC
-정수, 실수 등 숫자 정보

DATE
- 날짜와 시각 정보