본문 바로가기

CS지식

데이터베이스 CS 지식

반응형

관계형 데이터베이스 ( RDBMS )

테이블 구조를 기반으로 데이터를 저장하고 관리하는 시스템

 

SQL ( Structured Query Language )

데이터를 관리하기 위한 표준 언어

SQL 명령어는 기능에 따라 DDL, DML, DCL로 나뉩니다.

 

DDL - 데이터 정의어 ( CREATE, ALTER, DROP등 ) 의 명령어로 데이터베이스, 테이블을 생성, 수정, 삭제를 담당

 

DML - 데이터 조작어 ( SELECT, INSERT, UPDATE, DELETE ) 명령어로 데이터의 조회, 삽입, 수정, 삭제 담당

 

DCL - 데이터 제어어 ( GRANT, REVOKE )의 명령어로 데이터베이스의 접근 및 권한을 부여

 

 

스키마 설계

데이터베이스의 구조를 정의하는 과정으로 테이블, 열, 데이터 타입 등을 설계합니다.

CREATE TABLE users {
	id varchar(50),
    	name varchar(10),
    	age int()
}

 

조인 ( JOIN )

두개 이상의 테이블을 연결하여 데이터를 검색

SELECT users.name, orders.amount FROM users JOIN orders ON users.id = orders.user_id;

 

JOIN 종류

더보기

INNER JOIN - 교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여준다.


LEFT OUTER JOIN - 기준테이블값과 조인테이블과 중복된 값을 보여준다.(왼쪽테이블 기준으로 join)

 

RIGHT OUTER JOIN - LEFT OUTER JOIN과는 반대로 오른쪽 테이블 기준으로 JOIN


FULL OUTER JOIN - 합집합, A와 B테이블의 모든 데이터 검색


CROSS JOIN - 모든 경우의 수를 전부 표현해주는 방식( A가 4개 B가 5개면 총 4 * 5 = 20개의 데이터 검색 )


SELF JOIN - 자기자신과 자기자신을 Join ( 하나의 테이블을 여러번 복사해서 조인한다 생각 )

 

 

 


 

비관계형 데이터베이스 ( NoSql )

NoSql 데이터베이스는 고정된 스키마 없이 유연한 데이터 구조를 제공

 

문자형 데이터베이스

JSON과 같은 문서 형식으로 데이터를 저장 - MongoDB

 

키 - 값 저장소

키와 값의 쌍으로 데이터를 저장 - Redis

 

그래프 DB

노드와 엣지로 데이터를 저장하며, 그래프 구조를 기반으로 데이터를 관리 - Neo4j

 

컬럼형 데이터베이스

테이블의 열을 중심으로 데이터를 저장 - Cassandra

 


주요 데이터베이스 개념

키 ( Key )

1. Primary Key ( 기본키 ): 각 행을 고유하게 식별하는 데 사용되는 컬럼입니다.

 

2. Foreign Key ( 외래키 ): 다른 테이블의 기본 키를 참조하는 컬럼으로, 테이블 간의 관계를 정의합니다.

 

3. Candidate Key ( 후보키 ) : Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합

( 기본키로 사용할수 있는 속성들 )

 

4. Alternate Key ( 대체키 ) : 후보키 중 기본키를 제외한 나머지 키 ( 보조키 )

 

5. Super Key ( 슈퍼키 ) : 유일성은 만족하지만, 최소성은 만족하지 못하는 키


SQL - JOIN

1. INNER JOIN - 교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여준다.


2. LEFT OUTER JOIN - 기준테이블값과 조인테이블과 중복된 값을 보여준다.(왼쪽테이블 기준으로 join)

 

3. RIGHT OUTER JOIN - LEFT OUTER JOIN과는 반대로 오른쪽 테이블 기준으로 JOIN


4. FULL OUTER JOIN - 합집합, A와 B테이블의 모든 데이터 검색


5. CROSS JOIN - 모든 경우의 수를 전부 표현해주는 방식( A가 4개 B가 5개면 총 4 * 5 = 20개의 데이터 검색 )


6. SELF JOIN - 자기자신과 자기자신을 Join ( 하나의 테이블을 여러번 복사해서 조인한다 생각 )

 


SQL Injection

사용자가 입력한 데이터를 통해 악의적으로 SQL 쿼리를 실행하는 공격 기법

방지하기 위해 준비된 쿼리 ( Prepared Statements ) , ORM을 사용


SQL  vs  NoSql

Sql : 스키마가 고정되어 있고, 복잡한 쿼리와 트랜잭션을 지원 

 

Nosql : 스키마가 유연하고, 수평적 확장이 용이하며, 특정 요구 사항에 최적화된 데이터베이스


정규화 ( Normalization )

데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 테이블을 분해하는 과정

 

제1 정규화 ( 1NF )

모든 컬럼이 원자 값을 가져야 합니다.

테이블의 컬럼이 원자값 ( Atomic Value, 하나의 값 )을 갖도록 테이블을 분해하는 것

 

 

제2 정규화 ( 2NF )

부분 종속성을 제거합니다.

제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해 하는 것

( 완전 함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미 )

 

 

제3 정규화 ( 3NF )

이행 종속성을 제거합니다.

제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것

( 이행적 종속 : A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미 )

 

 

BCNF 정규화

제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

 


이상 ( Anomaly )

정규화를 해야하는 이유는 잘못된 테이블 설계로 인해 Anomaly ( 이상현상 )가 나타나기 때문

 

  • 삽입 이상 ( Insertion Anomaly ) : 데이터를 삽입할 때 불필요한 데이터를 함께 삽입해야 하는 문제입니다.
  • 갱신 이상 ( Update Anomaly ) : 데이터를 갱신할 때 중복된 데이터가 일관성 있게 갱신되지 않는 문제입니다.
  • 삭제 이상 ( Deletion Anomaly ): 데이터를 삭제할 때 관련된 유용한 데이터도 함께 삭제되는 문제입니다.

트랜잭션 ( Transaction )

데이터베이스의 작업 단위로, 여러 쿼리를 하나의 작업으로 묶어 처리

데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위

 

상태 변화 -> SQL 질의어를 통해 DB에 접근하는 것

insert, delete, update등등 

 

작업 단위 -> 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것

 

트랜잭션의 특징 

ACID 속성

Atomicity       -  원자성

Consistency  -  일관성

Isolation        -  고립성

Durability       -  지속성

 

Commit

하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산

 

Rollback

하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우 

 


트랜잭션 격리 수준 ( Transaction Isolation Level )

트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준 

 

1. Read Uncommitted ( Level 0 )

Select 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층 

트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터다른 트랜잭션이 읽는 것을 허용

( 데이터베이스의 일관성을 유지하는 것이 불가능함 )

 

 

2. Read Committed ( Level 1 ) - 대부분 SQL서버가 Default로 사용되는 Isolation Level

Select 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층

트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨

Commit이 이루어진 트랜잭션만 조회가능 

 

 

3. Repeatable Read ( Level 2 ) - MySql에서 Default로 사용하는 Isolation Level

트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층

트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장

( 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능 )

 

 

4. Serialiuzable ( Level 3 )

트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층

완벽한 읽기 일관성 모드를 제공 

( 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능 )

 


저장 프로시저 ( Stored Procedure )

일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합

데이터베이스에 저장된 SQL 쿼리와 절차의 모음으로, 반복적인 작업을 효율적으로 처리

 

 

프로시저 장점

최적화 & 캐시
프로시저의 최초 실행 시 최적화 상태로 컴파일이 되며, 그 이후 프로시저 캐시에 저장된다.
만약 해당 프로세스가 여러번 사용될 때, 다시 컴파일 작업을 거치지 않고 캐시에서 가져오게 된다.

유지 보수
작업이 변경될 때, 다른 작업은 건드리지 않고 프로시저 내부에서 수정만 하면 된다.

트래픽 감소
클라이언트가 직접 SQL문을 작성하지 않고, 프로시저명에 매개변수만 담아 전달하면 된다. 

즉, SQL문이 서버에 이미 저장되어 있기 때문에 클라이언트와 서버 간 네트워크 상 트래픽이 감소된다.

보안
프로시저 내에서 참조 중인 테이블의 접근을 막을 수 있다.

 

 

프로시저 단점

호환성

구문 규칙이 SQL / PSM 표준과의 호환성이 낮기 때문에 코드 자산으로의 재사용성이 나쁨

 

성능

문자 또는 숫자 연산에서 프로그래밍 언어인 C나 Java보다 성능이 느림

 

디버깅

에러가 발생했을 때, 어디서 잘못됐는지 디버깅하는 것이 힘듬

 


 

 

반응형

'CS지식' 카테고리의 다른 글

클라우드 ( AWS ) 지식  (1) 2024.08.02
운영체제와 WAS 정리  (1) 2024.08.02
네트워크 CS지식  (2) 2024.08.01
동시성 제어 - 뮤텍스와 세마포어  (3) 2024.07.31
동기, 비동기에 대해서  (4) 2024.07.28