Primary Key, Foreign Key, Entity-Relation Model

Primary Key(기본 키)란 각 데이터들을 고유한 값으로 구분(+무결성 보장)해주는 기본적인 필드/컬럼을 의미합니다.

Foreign Key(외래 키)란 2개 이상의 테이블 간 관계를 정의하고 데이터 무결성을 유지하는 데 사용하는 필드/컬럼을 의미합니다.

ER Model이란 DB 설계를 위한 개념적 모델링 도구로, 실제 데이터를 Entity(개체)/Attribute(속성)/Relationship(관계) 라는 요소로 표현하는 모델을 말한다.

  1. Entity(개체) : 독립적으로 존재 가능한 객체나 개념을 나타냄( 테이블 자체로 표현 )

  2. Attribute(속성) : 개체의 특성을 나타냄( 테이블의 필드/컬럼으로 표현 )

  3. Relationship(관계) : Entity 간의 연관성을 표현한 것을 나타냄 ( 외래 키를 통해 테이블 간의 연결을 표현 )

정규화

DB 설계에서 데이터의 중복을 줄이고, 데이터 무결성을 유지하기 위해 수행되는 프로세스로,
여러 단계로 나눠지며 단계마다 아래와 같은 규칙들이 있습니다.

  1. 제 1 정규화(1NF) : 각 필드/컬럼이 하나의 값만을 표현하도록 해야한다!

  2. 제 2 정규화(2NF) : 복합 키가 있는 테이블의 경우, 특정 키에만 종속된 필드/컬럼들은 별도의 테이블로 분리하여 관리해야 한다!

  3. 제 3 정규화(3NF) : 기본 키가 아닌 필드/컬럼에 종속된 필드/컬럼들은 별도의 테이블로 분리하여 관리해야 한다!

무결성

무결성은 데이터의 정확성/일관성/신뢰성 을 유지하는 것을 의미하며 구체적으로 4가지로 구분할 수 있습니다.

  1. 개체 무결성 : 테이블의 기본 키는 NULL이 아닌 고유 값이여야 한다!

  2. 참조 무결성 : 외래 키가 참조하는 값은 반드시 연결된 테이블에 존재해야 한다!

  3. 도메인 무결성 : 컬럼의 값은 정의된 데이터 타입과 범위 내에 값이여야 한다!

  4. 사용자 정의 무결성 : 사용자가 정의한 규칙에 따라 데이터의 정확성을 보장해야 한다!

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

  1. Atomicity(원자성) : Transaction 내부 작업들은 하나의 작업으로 취급되어 실패/성공이 일관적이다 -> 연대책임

  2. Consistency(일관성) : 수정할 테이블의 규칙을 만족하며 데이터들을 수정해야만 변경사항들이 적용된다 -> 로마에선 로마법을 따라라

  3. Isolation(격리성) : 사용하는 테이블을 외부의 다른 작업에서 테이블을 사용하지 못한다 -> 욕심쟁이 ( 하지만 욕심줄이기 가능 )

  4. Durability(영속성) : Transaction 작업에 대한 결과(실패/성공)가 영구적으로 유지되도록 보장해준다 -> 상남자 스타일 “한다고하면 무조건 끝낸다”

LOCK

ACID 특징 중 I 즉 격리성에 대한 설명으로, 격리 수준을 얼마나 높게 설정하냐의 기본적인 기준입니다.

  1. 공유 락(Shared Lock): 여러 트랜잭션이 동시에 읽기 작업을 할 수 있도록 허용합니다.

  2. 배타 락(Exclusive Lock): 하나의 트랜잭션이 데이터를 수정할 때, 다른 트랜잭션의 접근을 차단합니다.

주의사항

  1. 범위 최소화 : 트랜잭션을 너무 길게 유지하면 Deadlock이 발생할 수 있음

  2. Deadlock 방지 : 트랜잭션 간 Lock 순서를 일관되게 유지하여 교착 상태를 방지해야함

  3. 오류 처리 : 트랜잭션 중 오류가 발생하면 롤백을 통해 데이터 일관성을 유지해야함

  4. 성능 고려 : 트랜잭션의 격리 수준(Isolation Level)을 적절히 설정하여 성능과 일관성 사이의 균형을 맞춰야함

DB Index

DB INDEX 는 데이터를 빠르게 검색하기 위해 사용되는 자료구조로 주로 사용되는 종류로는 B-Tree/B+Tree와 Hash Index가 있습니다!

  1. B-Tree (Balanced Tree):

    • 계층적 구조로, 루트 노드부터 잎(leaf) 노드까지 균형을 유지하는 자료 구조로, 각 노드는 여러 키와 포인터를 포함하며 키는 정렬된 상태로 저장됨

    • 비교적 큰 데이터 블록을 읽고 쓰는 저장 시스템에 적합

  2. B+Tree

    • 잎(leaf) 노드에만 데이터를 저장하며, 비리프 노드는 값을 포함하지 않음

    • 위 특성 덕분에 메모리 사용이 최적화되며, 모든 리프 노드까지의 경로 길이가 동일하여 효율적인 탐색이 가능함

    • 또한 잎 노드끼리 LinkedList 처럼 연결되어 있어 범위 탐색에 더욱 유리한 구조

  3. Hash Index:

    • 해시 함수를 사용하여 키를 특정 위치에 매핑하는 자료 구조로, 동등 검색(=)에 매우 빠르지만, 범위 검색에는 적합하지 않음

    • 메모리 기반 데이터베이스에서 주로 사용됨