Primary Key, Foreign Key, Entity-Relation Model
Primary Key(기본 키)란 각 데이터들을 고유한 값으로 구분(+무결성 보장)해주는 기본적인 필드/컬럼을 의미합니다.
Foreign Key(외래 키)란 2개 이상의 테이블 간 관계를 정의하고 데이터 무결성을 유지하는 데 사용하는 필드/컬럼을 의미합니다.
ER Model이란 DB 설계를 위한 개념적 모델링 도구로, 실제 데이터를 Entity(개체)/Attribute(속성)/Relationship(관계) 라는 요소로 표현하는 모델을 말한다.
-
Entity(개체) : 독립적으로 존재 가능한 객체나 개념을 나타냄( 테이블 자체로 표현 )
-
Attribute(속성) : 개체의 특성을 나타냄( 테이블의 필드/컬럼으로 표현 )
-
Relationship(관계) : Entity 간의 연관성을 표현한 것을 나타냄 ( 외래 키를 통해 테이블 간의 연결을 표현 )
정규화
DB 설계에서 데이터의 중복을 줄이고, 데이터 무결성을 유지하기 위해 수행되는 프로세스로,
여러 단계로 나눠지며 단계마다 아래와 같은 규칙들이 있습니다.
-
제 1 정규화(1NF) : 각 필드/컬럼이 하나의 값만을 표현하도록 해야한다!
-
제 2 정규화(2NF) : 복합 키가 있는 테이블의 경우, 특정 키에만 종속된 필드/컬럼들은 별도의 테이블로 분리하여 관리해야 한다!
-
제 3 정규화(3NF) : 기본 키가 아닌 필드/컬럼에 종속된 필드/컬럼들은 별도의 테이블로 분리하여 관리해야 한다!
무결성
무결성은 데이터의 정확성/일관성/신뢰성 을 유지하는 것을 의미하며 구체적으로 4가지로 구분할 수 있습니다.
-
개체 무결성 : 테이블의 기본 키는 NULL이 아닌 고유 값이여야 한다!
-
참조 무결성 : 외래 키가 참조하는 값은 반드시 연결된 테이블에 존재해야 한다!
-
도메인 무결성 : 컬럼의 값은 정의된 데이터 타입과 범위 내에 값이여야 한다!
-
사용자 정의 무결성 : 사용자가 정의한 규칙에 따라 데이터의 정확성을 보장해야 한다!
JOIN
JOIN이란 두 개 이상의 테이블을 연결해 데이터를 조회하는데 사용하며, 수평적 확장을 의미한다!
( 이와 다른 개념으론 UNION이 있으며, 이는 수직적 확장을 의미한다. )
INNER JOIN
두 테이블에서 일치하는 데이터만 반환하는 형식
SELECT *
FROM 테이블A
INNER JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼;
LEFT (OUTER) JOIN
왼쪽 테이블의 모든 데이터와 그에 일치하는 오른쪽 테이블의 데이터를 반환하는 형식
( 왼쪽 테이블에 매칭되는 오른쪽 테이블의 값이 없을 시 NULL 값이 반환됨 )
SELECT *
FROM 테이블A
LEFT JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼;
RIGHT (OUTER) JOIN
오른쪽 테이블의 모든 데이터와 그에 일치하는 왼쪽 테이블의 데이터를 반환하는 형식 ( 오른쪽 테이블에 매칭되는 왼쪽 테이블의 값이 없을 시 NULL 값이 반환됨 )
SELECT *
FROM 테이블A
RIGHT JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼;
FULL OUTER JOIN
두 테이블의 모든 데이터를 반환하는 형식으로 일치하지 않는 값들은 NULL로 반환된다!
SELECT *
FROM 테이블A
LEFT JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼;
UNION
SELECT *
FROM 테이블A
RIGHT JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼;
CROSS JOIN
카테시안 곱(Cartesian Product)라고도 불리며 테이블의 한 행당 다른 테이블의 모든 행들을 대입하여 반환해주는 방식이다!
SELECT *
FROM 테이블A
CROSS JOIN 테이블B
NoSQL(Not Only SQL)
NoSQL은 의미 그대로 비관계형 데이터베이스를 뜻하며, 관계형 베이스와 달리 고정된 형식없이 자료들을 저장할 수 있다!
이로인해 유연성과 확장성 및 성능이 RDBMS(관계형 데이터베이스 관리 시스템)에 비해 좋지만,
데이터의 정확성이나 일관성은 상대적으로 아쉽다는 특징이 있다!
위의 특징들로 인해 NoSQL은 대규모 데이터나, 실시간 처리 및 유연한 데이터 모델이 필요할 때 사용하게된다.
( 반대로 RDBMS는 데이터의 정확성/일관성이 중요한 은행같은 곳에서 사용하게 되는 거죠 )
Transaction
Transaction 이란 하나의 작업 단위로 취급되는 묶여진 모든 작업을 뜻하며, ACID라는 특징을 가지고 있다.
ACID
-
Atomicity(원자성) : Transaction 내부 작업들은 하나의 작업으로 취급되어 실패/성공이 일관적이다 -> 연대책임
-
Consistency(일관성) : 수정할 테이블의 규칙을 만족하며 데이터들을 수정해야만 변경사항들이 적용된다 -> 로마에선 로마법을 따라라
-
Isolation(격리성) : 사용하는 테이블을 외부의 다른 작업에서 테이블을 사용하지 못한다 -> 욕심쟁이 ( 하지만 욕심줄이기 가능 )
-
Durability(영속성) : Transaction 작업에 대한 결과(실패/성공)가 영구적으로 유지되도록 보장해준다 -> 상남자 스타일 “한다고하면 무조건 끝낸다”
LOCK
ACID 특징 중 I 즉 격리성에 대한 설명으로, 격리 수준을 얼마나 높게 설정하냐의 기본적인 기준입니다.
-
공유 락(Shared Lock): 여러 트랜잭션이 동시에 읽기 작업을 할 수 있도록 허용합니다.
-
배타 락(Exclusive Lock): 하나의 트랜잭션이 데이터를 수정할 때, 다른 트랜잭션의 접근을 차단합니다.
주의사항
-
범위 최소화 : 트랜잭션을 너무 길게 유지하면 Deadlock이 발생할 수 있음
-
Deadlock 방지 : 트랜잭션 간 Lock 순서를 일관되게 유지하여 교착 상태를 방지해야함
-
오류 처리 : 트랜잭션 중 오류가 발생하면 롤백을 통해 데이터 일관성을 유지해야함
-
성능 고려 : 트랜잭션의 격리 수준(Isolation Level)을 적절히 설정하여 성능과 일관성 사이의 균형을 맞춰야함
DB Index
DB INDEX 는 데이터를 빠르게 검색하기 위해 사용되는 자료구조로 주로 사용되는 종류로는 B-Tree/B+Tree와 Hash Index가 있습니다!
-
B-Tree (Balanced Tree):
-
계층적 구조로, 루트 노드부터 잎(leaf) 노드까지 균형을 유지하는 자료 구조로, 각 노드는 여러 키와 포인터를 포함하며 키는 정렬된 상태로 저장됨
-
비교적 큰 데이터 블록을 읽고 쓰는 저장 시스템에 적합
-
-
B+Tree
-
잎(leaf) 노드에만 데이터를 저장하며, 비리프 노드는 값을 포함하지 않음
-
위 특성 덕분에 메모리 사용이 최적화되며, 모든 리프 노드까지의 경로 길이가 동일하여 효율적인 탐색이 가능함
-
또한 잎 노드끼리 LinkedList 처럼 연결되어 있어 범위 탐색에 더욱 유리한 구조
-
-
Hash Index:
-
해시 함수를 사용하여 키를 특정 위치에 매핑하는 자료 구조로, 동등 검색(=)에 매우 빠르지만, 범위 검색에는 적합하지 않음
-
메모리 기반 데이터베이스에서 주로 사용됨
-