# 본 글은 인하대학교 단풍나무숲 CS 스터디에 작성한 내용을 그대로 가져온 글입니다.
4. 데이터베이스
목차
- 데이터베이스의 기본
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로 지정되면, 참조하는 테이블의 기본 키에 없는 값은 입력할 수 없습니다.
'개발 > 기타' 카테고리의 다른 글
어떻게 하면 호출한 API의 처리 완료 시점을 알 수 있을까? (부제: socket 삽질기) (0) | 2022.10.09 |
---|---|
[CS Study] 4. 데이터베이스 (2) (0) | 2022.09.22 |
[CS Study] 3. 운영체제 (2) (0) | 2022.09.06 |
[CS Study] 3. 운영체제 (1) (0) | 2022.08.30 |
[CS Study] 2. 네트워크 (2) (0) | 2022.08.15 |
댓글