Computer Science 공부 기록/03. 데이터베이스

CS 공부 기록 - 데이터베이스 (1)

박세류 2023. 12. 13. 21:29

1. 데이터베이스란

데이터베이스(DB, Database)는 사용자나 프로그램에서 사용하기 위해 저장 및 관리하는 데이터 집합이다.

다음과 같은 요소로 구성한다.

  • Entity (개체, 엔티티)  : 데이터로 표현하려는 대상을 의미, 하나 이상의 속성으로 구성한다.
  • Attribute (속성) : 엔티티의 특성과 상태를 나타내며, DB를 구성하는 가장 작은 논리적 단위다.
  • Relationship (관계) : 개체 간에 어떤 관련이 있는지를 나타내며, 동사로 표현한다.

 

2. 스키마

데이터베이스의 전체적인 구조와 제약 조건을 명시하기 위해 스키마(schema)를 사용한다. 스키마는 데이터베이스의 전체적인 구조를 나타내며, 데이터 구조와 표현 방식, 제약 조건을 정의하는 역할을 한다.

  • 내부 스키마 : 사용자 측면에서 데이터베이스의 전체 구조
  • 개념 스키마 : 데이터베이스의 전체 구조
  • 외부 스키마 : 물리적 저장장치 측면에서 데이터베이스의 구조

 

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

데이터가 2차원 테이블에 저장되며 스키마를 바탕으로 데이터베이스의 구조를 정의한다.

데이터베이스에서 정보를 구분하여 저장하는 기본 단위를 릴레이션(relation)이라고 하고, 릴레이션을 실제로 구현한 객체를 테이블(table)이라고 한다. 회원 엔티티의 이름, 아이디, 주소, 전화번호를 테이블로 저장하고, 테이블을 이용해 데이터의 종속성과 관계를 나타낸다.

  • 행(row) = 튜플(tuple) = 레코드(record) = 가로 한 줄
  • 열(column) = 속성(attribute) = 필드(field) = 세로 한 줄
  • 도메인(domain) : 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합. 성별 필드의 {남, 여}는 도메인이다.

3-1. 키(key)

데이터베이스에서 튜플을 구분하기 위한 속성 또는 속성의 집합을 의미한다.

  • 유일성 : 하나의 키 값으로 튜플을 식별할 수 있는 특성
  • 최소성 : 튜플을 식별하는 데 필요한 속성만으로 이루어져 있는 특성

다음과 같은 다섯 가지 키가 있다.

  • 슈퍼 키 : 유일성을 만족하지만, 최소성을 만족하지 않아도 된다.
  • 후보 키 : 유일성과 최소성을 만족해야 한다.
  • 기본 키 : 후보 키 중에서 메인이 되는 키로 NULL을 가지면 안된다.
  • 대체 키 : 후보 키 중 기본 키를 제외한 키이다.
  • 외래 키 : 다른 테이블의 기본 키를 참조하는 키다.

3-2. 무결성

무결성은 DB의 데이터와 실제 데이터가 일치하는 정확성과, 일관되게 유지되는 일관성을 의미한다.

  • 개체 무결성 : 모든 테이블이 NULL이 아닌 기본 키를 가져야 한다.
  • 도메인 무결성 : 테이블의 속성 값은 도메인(domain)에 속해야 한다. 도메인은 속성이 가질 수 있는 값의 집합을 의미한다.
  • 참조 무결성: 외래 키의 값은 참조하는 테이블의 기본 키 값과 동일하거나 NULL이어야 한다.

3-3. 인덱스

인덱스(index, 색인)는 데이터베이스에서 튜플의 검색 성능을 높이기 위해 속성 값과 튜플이 저장된 주소를 저장하는 것을 말한다. 키-값 형태로 속성 값-튜플 주소를 인덱스 테이블에 저장한다.

인덱스 테이블에 데이터가 정렬되어 있어 검색속도가 빠르나,

인덱스 테이블을 저장하기 위한 추가 공간이 필요하며, 추가 / 수정 / 삭제하는 경우에는 속도가 느리다.

따라서 데이터 양이 방대하며 데이터 변경이 적고 검색을 자주하는 테이블에 인덱스를 사용하는 것이 좋다.

3-4. ORM

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑하는 도구를 의미한다. 

데이터베이스를 객체 관점으로 바라볼 수 있어 SQL 문을 사용하지 않고 객체 지향적 코드를 작성할 수 있어 코드의 가독성을 높이고 개발자 편의성을 증대할 수 있다. ORM만 쓰기 어려운 경우 QueryDSL과 같은 보조 도구를 이용하기도 한다.

 

4. NoSQL 데이터베이스

NoSQL(Not Only SQL)은 비관계형 데이터베이스로, 보다 유연한 형태의 데이터베이스를 의미한다. 대용량 데이터를 조회할 때 속도 면에서 유리하며, 서버를 추가해 데이터베이스를 확장하기도 쉽다.

하지만 중복 데이터를 허용하므로 데이터를 갱신하는 경우 비용이 많이 든다는 단점도 있다.

 

5. 트랜잭션

트랜잭션(transaction)은 데이터베이스의 상태를 바꾸기 위해 수행하는 작업의 단위 또는 일련의 연산을 의미한다.

  • 원자성(Atomicity) : 트랜잭션이 데이터베이스에 완전히 반영되거나 아예 실행되지 않아야 한다.
  • 일관성(Consistency) : 트랜잭션 수행이 완료된 데이터베이스는 일관성이 있다. 규칙에 따라 유효함을 가진다.
  • 독립성(Isolation) : 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들 수 없다.
  • 영속성, 지속성(Durability) : 완료한 트랜잭션 결과가 데이터베이스에 영구적으로 반영된다.

이러한 트랜잭션의 특징이 있고, ACID라고 한다.

 

6. 트랜잭션 격리(Isolation 특징)

여러 트랜잭션이 서로 영향을 미치지 않고 실행될 수 있는 단계를 트랜잭션 격리 수준(transaction isolation level, 아이솔레이션 레벨)이라고 한다. 이는 한 트랜잭션이 다른 트랜잭션 작업의 조회 가능 여부를 결정하며, 트랜잭션 격리 수준은 다음과 같이 4단계로 나눈다. 아래로 갈수록 동시성은 약해지고 격리성이 높다. 

격리 수준에 따라 발생하는 현상

격리 수준에 따라 발생하는 현상은 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드가 있다.

  • 팬텀 리드(phantom read) : 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말한다.
  • 반복 가능하지 않은 조회(non-repeatable read) : 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 의미한다.
  • 더티 리드(dirty read) : 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생한다.

단계마다 나타나는 현상이 있다.

  • Read_Uncomitted : 트랜잭션의 COMMIT 여부와 상관 없이 다른 트랜잭션이 데이터를 조회할 수 있다. 한 번에 여러 트랜잭션을 처리할 수 있는 동시성은 높지만, 데이터의 일관성을 유지하기 어렵다. (팬텀, 반복X조회, 더티 리드)
  • Read_Commited (기본값) : 트랜잭션이 COMMIT된 데이터만 다른 트랜잭션이 조회할 수 있다.(팬텀리드, 반복 가능 하지 않은 조회)
  • Repeatable_Read : 트랜잭션이 읽은 데이터를 다른 트랜잭션이 갱신하거나 삭제할 수 없다. (팬텀 리드)
  • Serializable: 트랜잭션이 읽은 데이터를 다른 트랜잭션이 갱신, 삭제, 삽입할 수 없다.

동시성이 높아지면 여러 트랜잭션이 동시에 처리되고 데이터의 일관성에 문제가 발생할 확률이 높아진다. 하지만 고립성을 높이면 하나의 트랜잭션이 처리 중일 때 다른 트랜잭션의 접근이 제한되어 효율이 낮아진다. 그러므로 상황에 따라 데이터의 일관성을 유지하면서 트랜잭션을 효율적으로 처리할 수 있어야 한다.

 

7. 락(Lock)

락은 트랜잭션이 처리되는 순서를 보장하기 위한 방법이다. 운영체제에서 데이터 동기화를 위해 임계영역에 대한 접근을 제한하는 상호배제(mutual exclusion)기법과 유사하다. 무결성을 유지하기 위해 사용한다.

데이터의 무결성을 유지하기 위한 락이 여러 종류가 있는데, 대표적인 락은 다음과 같다.

  • 공유 락(shared lock): 데이터를 읽는 락으로 읽기 락(read lock)이라고 한다. 데이터를 읽는 연산이므로 데이터가 변경되지 않아 공유 락을 가진 여러 트랜잭션이 동시에 접근할 수 있다.
  • 베타 락(exclusive lock): 데이터를 수정하는 락으로 쓰기 락(write lock)이라고 한다. (하나의 트랜잭션이 수행중인) 데이터에 하나의 베타 락이 접근 중일 때 다른 베타 락이 접근할 수 없다.

데이터베이스도 한 트랜잭션이 자신이 처리 중인 데이터에 대해 락을 가진 상태에서 다른 트랜잭션이 처리 중인 데이터에 락을 요청해 교착상태(deadlock)에 빠질 수도 있다. 특정 데이터의 락을 가지고 있는 트랜잭션이 다른 데이터의 락을 추가로 요청하며 발생하는 것이다.

 

8. 이상(anomaly)

어노말리는 트랜잭션을 처리하는 중에 속성 간 종속이나 데이터 중복으로 발생하는 문제를 일컫는다.

  • 삽입 이상(insertion anomaly): 데이터 삽입 시 의도치 않은 다른 데이터도 삽입된다.
  • 삭제 이상(deletion anomaly): 데이터 삭제 시 의도하지 않은 데이터도 삭제된다.
  • 갱신 이상(update anomaly): 데이터 갱신 시 일부 튜플만 갱신되어 데이터 모순이 발생한다.

 

9. ERD와 정규화(normalization)

ERD(Entity Relationship Diagram)은 데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션간의 관계들을 정의한 것이다. 서비스를 구축한다면 가장 먼저 신경써야 할 부분이다.

정규화는 데이터베이스의 이상 현상을 해결하기 위해 테이블을 분해하는 것이다.

테이블을 무조건 분해하는 것이 아니라 상황에 따라 적절한 정규화를 진행해야 한다.

정규화한 결과를 정규형(normal form)이라고 하며, 테이블을 분해하는 정도에 따라 단계가 나뉜다.

 

10. 조인(join)

조인은 관계형 데이터베이스에서 분해된 테이블을 조합해 필요한 데이터를 얻기 위한 연산이다.

테이블을 합쳐 원하는 데이터를 얻는 작업이며, 내부조인, 외부조인으로 구분된다.

  • 내부 조인(INNER JOIN)은 2개 이상의 테이블에서 공통 속성을 가진 데이터를 검색하기 위한 연산이다. 교집합
  • 외부 조인(OUTER JOIN)은 테이블에서 조인 조건에 해당하는 속성 값이 없는 데이터까지 모두 조회하는 연산이다. 존재하지 않는 데이터는 NULL로 표기한다. 합집합
    • LEFT OUTER JOIN : 연산자 왼쪽 테이블의 모든 데이터를 결과 테이블에 조회한다.
    • RIGHT OUTER JOIN : 연산자 오른쪽 테이블의 모든 데이터를 결과 테이블에 조회한다.
    • FULL OUTER JOIN : 양쪽 테이블에서 조건을 만족하지 않는 데이터가 있더라도 모두 포함해 조회한다.

 

카디널리티 = 중복 

728x90