용어정리
데이터베이스 (Database): 데이터를 체계적으로 저장하고 관리하는 시스템.
DBMS: 데이터베이스를 관리하고, 데이터를 저장, 수정, 삭제, 검색할 수 있게 해주는 소프트웨어.
RDB : 데이터를 테이블 형태(릴레이션)로 저장하는 데이터베이스
릴레이션: 테이블, 데이터를 행과 열로 저장하는 구조.
튜플: 릴레이션의 한 행, 즉 데이터의 한 레코드.
속성 (Attribute): 릴레이션의 한 열, 즉 데이터 항목의 속성.
스키마 (Schema): 데이터베이스의 구조를 정의하는 청사진, 테이블 간의 관계, 속성, 데이터 타입 등을 포함.
인덱스 (Index): 데이터를 빠르게 검색할 수 있도록 도와주는 자료 구조.
정규화 (Normalization): 데이터 중복을 최소화하고 데이터를 구조화하여 무결성을 유지하는 과정.
무결성 (Integrity):
참조 무결성 (Referential Integrity):
외래 키가 참조하는 값이 항상 올바른 값을 갖도록 보장하는 제약 조건.
개체 무결성 (Entity Integrity):
기본 키는 null 값을 가질 수 없으며, 중복될 수 없다는 제약 조건.
무결성과 정합성
무결성은 DB구조를 지키고 있는가, 정합성은 데이터의 일관성이 유지되고 있는가
데이터 아카이빙(Data Archiving)
사용하지 않거나 필요성이 줄어든 데이터를 별도로 보관하는 것
트랜잭션: 데이터베이스에서 하나의 논리적 작업 단위. 트랜잭션은 ACID 속성을 준수함.
ERD (Entity-Relationship Diagram): 데이터베이스 설계를 시각적으로 표현한 다이어그램, 개체와 그들 간의 관계를 나타냄.
뷰 (View): 실제 테이블에서 데이터를 가져와 보여주는 가상 테이블. 복잡한 쿼리를 간단하게 만들 수 있음.
SQL (Structured Query Language): 데이터베이스와 상호작용하기 위한 표준 언어. 데이터 검색, 삽입, 수정, 삭제 등을 수행.
DML (Data Manipulation Language): 데이터 조작 언어, 데이터를 조회하고 수정하는 데 사용됨 (SELECT, INSERT, UPDATE, DELETE).
DDL (Data Definition Language): 데이터 정의 언어, 데이터베이스 구조를 정의하는 데 사용됨 (CREATE, ALTER, DROP).
DCL (Data Control Language): 데이터 제어 언어, 권한 부여 및 회수에 사용됨 (GRANT, REVOKE).
Key
후보키(Candidate Key) :
튜플을 유일하게 식별하기 위해 사용할 수 있는 속성 집합, 즉 기본키로 사용할 수 있다.
유일성 : Key로 한개의 튜플만 식별할 수 있다.
최소성 : 쓸데없는 속성은 포함하지 않는다.
후보키는 유일성, 최소성 2가지 특성을 만족한다.
기본키(Primary Key) :
후보키 중 선택한 메인 키
Null 값을 가질 수 없으며, 동일한 값이 중복될 수 없다.
보조키(Alternate Key) :
후보키 중 기본키를 제외한 나머지 키
슈퍼키(Super Key) :
유일성은 만족하지만, 최소성은 만족하지 못하는 키
외래키(Foreign Key) :
다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합
Join
Inner Join : 교집합
Left Outer Join, Right Outer Join :
기준 테이블의 모든 행 포함, 조인테이블에 일치하는 값 없는 경우 NULL로 채움
Full Outer Join : 두 테이블의 모든 행 포함, 반대 테이블에 일치하는 값 없으면 NULL로 채움
Cross Join(카르티시안 곱) :
두 테이블의 모든 가능한 행의 조합을 반환하는 연산
조인 조건이 없으며, NULL값 또한 포함되지 않는다.
Self Join : 자기 자신과 조인하는 것. 별칭을 다르게 두어 적용
SQL Injection
해커에 의해 조작된 SQL 쿼리문이 DB에 전달되어 비정상적 명령을 실행시키는 공격
정상적인 SQL :SELECT * FROM users WHERE username = '사용자입력값' AND password = '사용자입력값';
공격 SQL : username에 ' OR 1=1 -- :
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';
이렇게 OR 조건을 넣고, 뒤에 password를 주석처리를 해버린다.
결국 데이터 유출, 데이터 조작, 시스템 손상 등의 문제가 발생할 수 있다.방어 방법
- input을 받을 때 특수문자 여부 검사하기
- SQL 에러 메시지 감추기 : 공격자는 에러 메시지로 정보를 얻을 수 있다.
- Prepared Statement : 쿼리와 데이터를 분리하여, 입력 값이 SQL 문법으로 실행되지 않게 한다.
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?"); pstmt.setString(1, username); pstmt.setString(2, password);
SQL, NOSQL
SQL(관계형 데이터베이스)
SQL을 사용하면 RDBMS(관계형DB 관리시스템)를 통해 데이터를 수정,삭제,저장,조회할 수 있다.
1. 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
2. 데이터는 관계를 통해 여러 테이블에 분산된다.(정규화하기 위해)
3. 하나의 테이블에서 중복 없이 하나의 데이터만을 관리한다.NoSQL(비관계형 데이터베이스)
스키마도 없고, 관계도 없다.
1. Document
Key-Value Database와 같이 데이터 저장에 Key-Value Type를 사용
하지만 Value를 문서로 저장한다.
Value에 있는 문서의 필드에 따라 검색하거나 쿼리할 수 있다.
ex) MongoDB, CouchDB, Amazon DocumentDB2. Graph
노드(데이터)와 엣지(관계)로 구성되며, 소셜 네트워크, 추천 시스템, 경로 탐색 등에 유리하다.
ex) Neo4j, Amazon Neptune, OrientDB3. Key-Value
데이터는 키-값 쌍으로 저장되며, 고유한 키에 대응하는 값은 문자열, 객체, 리스트 등 어떤 형태든 가능하다.
Value에 있는 값의 필드에 따라 검색하거나 쿼리할 수 없다.
단순한 데이터 저장과 빠른 조회가 가능하며, 캐시나 세션 관리와 같은 용도로 사용한다.
ex) Redis, Amazon DynamoDB4. Wide Column
테이블 형식이지만 각 행은 수천 개의 열(컬럼)을 가질 수 있으며, 행마다 다른 열을 가질 수 있는 비정형 테이블 구조
ex) Apache Cassandra, HBase, ScyllaDBSQL vs NoSQL
SQL :
명확하게 정의된 스키마, 데이터 무결성 보장
스키마를 수정하기 힘듦, 수직적 확장만 가능(DB 서버 성능향상)
NoSQL :
스키마가 없어서 유연하고, 저장된 데이터에 새로운 필드 추가가 쉬움
수직, 수평적 확장(서버를 추가해 DB를 분산시킴) 전부 가능
데이터 조회가 빠르지만, 데이터 변경은 오래걸림
Anomaly
1. 삽입 이상 (Insertion Anomaly)
불필요한 데이터를 추가해야 삽입할 수 있는 상황
ex) 기본키에 NULL값을 가진 레코드가 존재할 때2. 갱신 이상 (Update Anomaly)
일부만 변경해 데이터가 불일치하는 모순
ex) 한 학생의 필드를 수정하는데, 모든 DB에서 전부 수정하지 않은 경우3. 삭제 이상 (Deletion Anomaly)
튜플 삭제로 필요한 데이터까지 함께 삭제되는 경우
ex) 한 학생이 수강을 취소할 때, 필요했던 학생의 다른 필드까지 삭제되는 경우
Index
RDBMS에서 검색 속도를 높이기 위한 기술로, B+ 트리 형식을 주로 가진다.
책의 색인처럼 데이터베이스 테이블의 특정 열을 별도의 자료 구조에 저장한 뒤, 검색할 때 해당 자료 구조를 먼저 탐색하여 데이터 위치를 빠르게 찾는 방법B-Tree
이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조이다(위키피디아).
한 노드에 여러개의 값을 저장할 수 있고, 좌우 노드들의 밸런스가 보장된다.
B+ Tree
모든 key와 data를 리프노드에 연결리스트로 저장해 선형탐색이 가능한 구조
인덱싱 장점
빠른 데이터 검색: 인덱스의 주된 목적입니다.
정렬된 데이터 액세스: 인덱스를 통해 정렬된 순서로 데이터에 액세스할 수 있습니다.인덱싱 단점
저장 공간: 인덱스는 추가적인 저장 공간을 필요로 합니다.
삽입/삭제 오버헤드: 인덱스가 있는 테이블에 데이터를 삽입하거나 삭제할 때, 인덱스도 함께 업데이트해야 합니다.인덱싱 유불리
유리할 때: 대규모 데이터에서 조회가 중요할 때, Join이 자주 발생하는 열(테이블 전체 탐색이 아닌, 인덱스를 따라가서 조인하면됨)
불리할 때: 쓰기 작업이 많을 때, 소규모 테이블일 때, 인덱스가 매우 많을 때
정규화(Normalization)
데이터 중복을 줄이고, 무결성을 향상시키는 기법
제 1정규화(1NF)
모든 속성이 원자값(하나의 값)만 갖도록 테이블을 분리하는 것
제 2정규화(2NF)
기본키에 소속된 일부 column이 색인할 수 있는 column이 존재하면 안된다.
제 3정규화(3NF)
2정규화가 진행된 테이블에 이행적 종속을 없애기 위해 테이블을 분리하는 것
기본키가 아닌 속성들은 기본키에 의해서만 색인되어야 한다.역정규화
읽기 성능 개선을 위해 정규화 작업 이전으로 돌리는 것
정규화 장단점
장점
1. 데이터 중복이 최소화돼 한곳만 수정해도 시스템의 일관성 유지 가능
2. 중복이 줄어드는 만큼 DB 공간을 아낄 수 있다.
3. 무결성을 향상해 테이블간의 관계가 명확하게 정의된다. 이는 DB의 오류를 방지하고, 추후 삽입,삭제 등의 연산에 유리하다.
단점
1. Join연산이 필연적으로 늘어나며, 조회 성능이 저하되고 쿼리가 복잡해진다.
2. 설계 및 유지보수에 복잡성이 늘어난다.
트랜잭션
DB의 상태를 변화시키기 위해 수행하는 작업단위
한개 이상의 SQL문장으로 구성, 트랜잭션 시작시 영속성 컨텍스트가 배정되고, 롤백시 쿼리들 취소, 커밋시 쿼리들 적용
A가 B에게 1000원을 송금할 때, A 계좌에서 1000원이 깎였지만 B계좌에 1000원이 늘어나있지 않을 때가 일관적이지 않은 상태이다.트랜잭션 특징(ACID)
Atomicity (원자성): 트랜잭션이 모두 실행되거나 전혀 실행되지 않는 것.
Consistency (일관성): 트랜잭션 실행 전후에 데이터의 일관성이 유지되는 것.
Isolation (격리성): 트랜잭션들이 독립적으로 실행되어야 함.
Durability (내구성): 트랜잭션 완료 후, 데이터는 영구적으로 저장됨.트랜잭션 격리 수준(Isolation Level)
트랜잭션에서 일관성 없는 데이터(트랜잭션 처리 중에 데이터베이스가 임시 상태에 있는 경우)를 허용하는 수준
Locking으로 트랜잭션들을 순서대로 처리하면, ACID원칙의 격리성은 지켜지지만 DB의 성능이 저하된다.
가장 효율적인 Locking 방법을 사용해야 한다.
Read Uncommitted (레벨0) :
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
즉, A를 B로 바꾸는 트랜잭션이 커밋되지 않아도, B를 타 트랜잭션이 읽을 수 있다.
DB의 일관성을 유지할 수 없다.
Read Committed (레벨1) :
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
A를 B로 바꾸는 트랜잭션이 커밋되지 않았다면, B를 접근할 수 없다.
Repeatable Read (레벨2) :
하나의 트랜잭션이 시작된 시점에서 데이터를 읽으면, 그 트랜잭션이 종료될 때까지 다른 트랜잭션이 해당 데이터를 수정할 수 없다. 트랜잭션이 여러 번 같은 데이터를 읽더라도 그 값은 항상 동일합니다.
Serializable (레벨3) :
트랜잭션들이 서로 완전히 독립적으로 실행되는 것처럼 보이도록, 트랜잭션을 직렬화하여 처리 (트랜잭션 간의 동시성 차단)각 레벨의 문제
Dirty Read : 커밋되지 않은 트랜잭션의 데이터를 읽는 것
Non-Repeatable : 동일한 트랜잭션에서 같은 데이터를 여러 번 읽을 때, 다른 트랜잭션이 데이터를 수정한 경우 읽을 때마다 값이 달라질 수 있다.
Phantom Read : 트랜잭션 중에 다른 트랜잭션이 새로운 데이터를 삽입하는 경우, 삽입된 데이터를 읽을 수 있어 데이터 집합이 달라질 수 있다.
Redis
key-value구조의 인메모리 데이터베이스
디스크가 아닌 메모리(RAM)에 저장하기 때문에 디스크 스캐닝이 필요하지 않아 속도가 빠르다.
RAM은 휘발성이기 때문에, snapshot,AOF를 통해 백업한다.
캐싱도 가능해 실시간 채팅에 적합하다.
AOF : 쿼리들을 저장해두고, 서버가 셧다운되면 재실행해서 다시 만들어 놓는 것
캐싱 : 자주 사용하는 데이터를 빠르게 접근할 수 있는 위치에 임시로 저장하여, 원본 데이터에 반복적으로 접근하지 않고 더 빠르게 데이터를 제공하는 기술
저장 프로시저
프로시저 : 특정 작업을 수행하기 위해 재사용 가능한 코드 블록
저장 프로시저 : DB 내에 미리 저장된 SQL 쿼리나 명령어의 집합. DB 서버에 저장돼 있으며, 쿼리문이 필요할 때 인자 값만 전달하면 된다.장단점
장점
1. 프로시저 최초 실행 시 캐시에 저장되고, 이후 컴파일 작업을 거치치 않고 캐시에서 꺼낸다.
2. 프로시저에 매개변수만 담아 전달하면 되므로 클라이언트-서버 간의 트래픽 감소
단점
1. C나 JAVA보다 연산속도가 느리다.
2. SQL과 호환성이 낮아 코드를 재사용하기 힘들고, 디버깅하기 힘들다.
Hadoop vs 샤딩 vs 클러스터링 vs 리플리케이션
Hadoop
하둡은 HDFS를 사용해 대용량 데이터를 여러 블록으로 물리적으로 나눈 뒤 각 노드에 저장. 또한 각 데이터 블록을 3개씩 복제해 안정성 보장
샤딩
테이블을 특정 기준으로 논리적 분할한 뒤 저장하고 검색하는 것을 의미한다. 데이터를 어떻게 분산시킬 것인지, 어떻게 읽을 것인지 결정하는 것이 중요
클러스터링
여러 개의 DB를 수평적인 구조로 구성하여 Failover하는 시스템을 구축하는 방식
동일한 DB 서버를 두 대를 묶고 active-active 상태로 운영하거나 active-stanby 상태로 운영하지만 동기화 시간이 들어간다.
리플리케이션
여러 개의 DB를 master-slave 형태로 구축하고, master에 DML(Write-only)을 하고 slave에 복제(Read-only)하는 방식이다.
비동기 방식으로 노드들 간의 데이터를 동기화하지만 일관성 보장이 힘들다.
Reference
https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html
https://velog.io/@leephoter/RDBMS-%EC%99%80-NoSQL
https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Plus-Tree
https://velog.io/@calis_ws/DB-%EC%A0%95%EA%B7%9C%ED%99%94-%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94