본문 바로가기
개발/기타

[CS Study] 4. 데이터베이스 (1)

by 카펀 2022. 9. 21.

# 본 글은 인하대학교 단풍나무숲 CS 스터디에 작성한 내용을 그대로 가져온 글입니다.

4. 데이터베이스

목차

  1. 데이터베이스의 기본

1. 데이터베이스의 기본

정의

데이터베이스 (database, DB)는 일정한 규칙/규약에 따라 데이터를 구조화 하여 저장하는 데이터의 모음입니다.
DB를 관리하는 시스템을 DBMS (Database Management System)이라고 하며, RDBMS, NoSQL 등이 존재합니다. 각 DBMS는 각자의 질의문 (query language; query)을 통해 DB 내에 자료를 삽입, 수정, 조회, 삭제 등을 할 수 있습니다.

DB, DBMS, Application의 관계도는 여기를 참고하세요.

엔티티 (Entity)

정의: 여러 개의 속성을 지닌 명사를 엔티티라고 부릅니다.
학교라는 엔티티가 있다면, 교실, 학생, 교사, 위치 등 다양한 명사가 학교의 속성이 됩니다.

약한 엔티티와 강한 엔티티

약한 엔티티: 혼자서는 존재하지 못하고 다른 엔티티의 존재 여부에 따라 종속적이라면, 해당 엔티티는 약한 엔티티입니다.
스스로 존재할 수 있는 엔티티는 강한 엔티티가 됩니다.
예를 들어, 게시글이라는 엔티티가 있고, 댓글이라는 엔티티가 있다면, 게시글은 홀로 존재할 수 있지만, 댓글은 게시글이 없으면 존재할 수 없습니다. 따라서 게시글은 강한 엔티티, 댓글은 약한 엔티티가 됩니다.

릴레이션 (Relation)

DB에서 정보를 구분하여 저장하는 단위를 릴레이션이라고 부릅니다. '게시글', '댓글', '사용자' 등 다양한 단위로 데이터를 저장할 수 있습니다.
RDBMS에서는 릴레이션을 테이블 (table; 표)라고도 부르고, NoSQL에서는 릴레이션을 '컬렉션'이라고 부르기도 합니다.

속성 (attribute)

릴레이션에서 관리하는 구체적이고 고유한 값을 가리킵니다.
이렇게 설명하면 와닿지 않죠? 테이블에서의 칼럼을 attribute라고 부릅니다.

id user_name email_address is_admin
kakao00001 정규호 kchung1995@gmail.com Y

위와 같은 릴레이션 (테이블)이 있다면, 고유 ID, 이름, 이메일 주소, 관리자 여부가 각각 속성(attribute)입니다.

도메인 (domain)

도메인의 사전적 정의는 [여기[(https://en.wikipedia.org/wiki/Domain_of_a_function)서 확인할 수 있습니다.
수학에서 정의역을 영어로 도메인이라고 하는데요. 함수 f(x)의 정의역이란, 값 x가 가질 수 있는 범위를 나타냅니다.
유사하게, 릴레이션 내 각 속성들이 가질 수 있는 값의 집합을 도메인이라고 부릅니다.
위에서 살펴 본 릴레이션에서, is_admin은 Y 또는 N의 값만을 가질 수 있습니다. 이를 is_admin은 {'Y', 'N'}이라는 도메인을 가진다고 표현합니다.

필드와 레코드

앞서 만든 릴레이션을 다시 봅시다.
회원이라는 엔티티는 user라는 릴레이션으로, 속성인 고유 ID, 이름, 이메일 주소, 관리자 여부 등을 가지고 있습니다. 그 필드는 각각 id, user_name, email_address, is_admin 등입니다.
이 테이블에는 0명 이상의 회원에 대한 정보가 기록되게 됩니다. 이 때 각 회원에 대대한 정보, 즉 표에서 각 행 (row)을 레코드 또는 튜플이라고 부릅니다.

따라서 각 레코드는 여러 개의 필드에 해당하는 값으로 구성되어 있고, 레코드의 집합이 하나의 릴레이션을 구성합니다.

필드 타입

각 필드는 타입을 갖습니다. 이 필드는 각 값이 어떤 값인지 나타내며, DBMS마다 조금씩 다릅니다.
MySQL 기준으로, 대표적으로 아래의 필드 타입을 가집니다.

  • 날짜 타입
    • DATE: 날짜 부분은 있지만 시간 부분은 없는 값
    • DATETIME: 날짜 및 시간 부분을 모두 가지며, 범위는 1000-01-01 ~ 9999-12-31으로 매우 넓다.
    • TIMESTAMP: DATETIME과 같지만, 범위가 1970-01-01 ~ 2038-01-19까지로 상대적으로 좁다.
  • 문자 타입
    • CHAR: 고정된 길이의 문자열. 검색에 유리하다.
    • VARCHAR: 가변 길이의 문자열. 유동적인 길이의 경우 유리하다.
    • TEXT: 큰 문자열 저장에 사용한다 (게시판의 본문 등).
    • BLOB: 이미지, 동영상 등을 저장할 때 쓴다.
      • 보통은 파일 서버 (AWS S3 등)에 따로 올리고, DB에는 해당 파일의 주소를 VARCHAR 형식으로 넣는다.
    • ENUM: 문자열을 열거한 타입. 하나의 값만을 고를 수 있고, 잘못된 값을 삽입하면 빈 문자열이 삽입된다. 열거한 문자열이 0, 1, 등의 값으로 매핑되어 메모리 상의 이점을 취할 수 있다.
    • SET: 문자열을 열거한 타입. 여러 개의 데이터를 선택할 수 있고, 비트 단위의 연산을 할 수 있다.

관계

하나의 DB 내에는 다양한 테이블이 존재한다. RDBMS는 이러한 테이블들의 관계를 중심으로 데이터를 관리합니다.
아래와 같은 구성을 봅시다.
table - posts

postId title author create_dt last_edit_dt
00001 ㄹㅇㅋㅋ planPt 2022-03-02 01:14:01 2022-03-02 01:14:01
00002 하스우 트라이 간다 inhaJiwonChoi 2022-04-01 03:14:07 2022-09-04 15:57:01

table - comments
|commentId|postId|content|author|create_dt|
|---|---|---|---|---|
|00001|00001|링컨|planPt|2022-03-02 01:14:01|
|00002|00002|머함 ㅋㅋ|kchung1995|2022-04-02 13:34:49|
|00003|00002|아직도 못깸?|kchung1995|2022-05-27 22:41:35|
|00004|00002|오늘은 깨겠지|kchung1995|2022-07-31 21:32:54|
|00005|00002|이야 ㅋㅋ 몇달째지|kchung1995|2022-09-03 00:12:29|

두 개의 테이블 posts, comments가 있습니다.
posts는 각 게시글을 저장하고, comments는 각 글에 달리는 댓글을 저장합니다.
글 하나에는 댓글이 0개 이상 존재할 수 있습니다. 따라서 posts와 comments는 1:N 관계입니다.

반면 아래와 같은 테이블이 있다면,

table - users

id user_name email_address is_admin
planPt 김플랜 plan.pt@samsung.com Y
inhaJiwonChoi 최자사 jiwon.choi@us.mil.gov Y
kchung1995 정규호 kchung1995@gmail.com Y

각 게시글은 단 한 명의 작성자만 가지고, 각 회원의 정보는 테이블 users에 저장되어 있습니다.
이런 경우에는 posts와 users는 1:1 관계입니다.

테이블 사이의 관계는

  • 1:1 관계
  • 1:N 관계
  • N:M 관계
    가 존재합니다.

키 (key)

릴레이션 내에서, 레코드를 유일하게 특정할 수 있는, 하나 이상의 필드로 이루어진 집합을 key (키)라고 부릅니다.
키에는 다양한 종류가 있으며, 릴레이션 내에는 0개 이상의 키가 존재할 수 있습니다.

키의 종류

  • Candiate Key (후보 키)
    • 레코드 (튜플)를 유일하게 식별할 수 있는 키를 후보 키라고 부릅니다.
    • 다음 2가지 조건을 만족해야 합니다:
      • 유일성: 해당 Key로 하나의 레코드를 특정할 수 있음
      • 최소성: 해당 key의 본인을 제외한 부분집합 중 후보 키가 없음
  • Primary Key (기본 키)
    • 후보키 중 릴레이션 내에서 선택된 메인 Key
    • 선택은 DBA가 하며, 적절한 key를 선택하는 것이 중요
    • Null값 및 중복된 값을 가질 수 없다.
  • Alternate Key (대체 키)
    • 후보 키 중 기본 키를 제외한 나머지 키들의 집합을 대체 키라고 부릅니다.
  • Super Key (슈퍼 키)
    • 앞서 언급한 후보 키의 두 가지 속성 중, 유일성은 만족하지만 최소성은 만족하지 못 하는 키
  • Foreign Key (외래 키)
    • 다른 릴레이션의 레코드를 특정하기 위한 값을 외래 키라고 합니다.
    • 외래 키는 중복이 가능합니다.
      • posts 테이블에서 가지는 creator_id는 같은 값이 0개 이상일 수 있습니다. 2개 이상인 경우에는 한 사람이 글을 두 개 이상 쓴 경우겠죠.
      • users 테이블에서는 id가 PK입니다. posts 테이블의 creator_id는 users 테이블의 레코드를 특정하기 위한 foreign key가 됩니다.
      • foreign key로 지정되면, 참조하는 테이블의 기본 키에 없는 값은 입력할 수 없습니다.

댓글