서녕이네 개발단지

면접을 위한 CS 전공지식 노트 [CHAPTER 4] (1) 본문

도서

면접을 위한 CS 전공지식 노트 [CHAPTER 4] (1)

zero2-pooh 2023. 6. 24. 19:19

[CHAPTER 4]. 데이터베이스

 

[SECTION 4.1] - 데이터베이스의 기본

 

- 데이터베이스는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음이다. 

- 해당 데이터베이스를 제어, 관리하는 통합 시스템을 DBMS(DataBase Management System)라고 하며, 데이터베이스 안에 있는 데이터들을 특정 DBMS마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다. 

❗️또한, 데이터베이스는 실시간 접근과 동시 공유가 가능하다. 

☝🏻위의 그림처럼 데이터베이스 위에 DBMS가 있고 그 위에 응용 프로그램이 있으며, 이러한 구조를 기반으로 데이터를 주고받는다. 


4.1.1 엔터티

엔터티(entity)란?

- 사람, 장소, 물건, 사건, 개념 등 여러 개의 속성을 지닌 명사를 의미한다. 

- 물론 이보다 많은 속성이 있지만 서비스의 요구 사항에 맞춰 속성이 정해진다. 

 

 

약한 엔터티와 강한 엔터티

- 엔터티는 약한 엔터티와 강한 엔터티로 나뉜다. 

예를 들어~

A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 중속적이라면 A는 약한 엔터티이고 B는 강한 엔터티가 된다. 


4.1.2 릴레이션

릴레이션(relation)이란?

- 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이다. 

- 엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리한다. 

릴레이션

☝🏻 위 그림처럼 회원이라는 엔터티가 데이터베이스에서 관리될 때 릴레이션으로 변화된 것을 볼 수 있다. 

- 릴레이션은 관계형 데이터베이스에서는 '테이블'이라고 하며, NoSQL 데이터베이스에서는 '컬렉션'이라고 한다. 

 

 

테이블과 컬렉션

- 데이터베이스의 종류는 크게 관계형 데이터베이스NoSQL 데이터베이스로 나눌 수 있다. 

- 이 중 대표적인 관계형 데이터베이스인 MySQL과 대표적인 NoSQL 데이터베이스인 MongoDB를 예로 들면?

👉🏻MySQL의 구조는 레코드-테이블-데이터베이스로 이루어져 있고 MongoDB 데이터베이스의 구조는 도큐먼트-컬렉션-데이터베이스로 이루어져 있다. 

레코드-테이블-데이터베이스의 구조

☝🏻위 그림처럼 레코드가 쌓여서 테이블이 되고 테이블이 쌓여서 데이터베이스가 되는 것이다. 


4.1.3 속성

속성(attribute)이란?

- 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보이다. 

ex)

1. '차'라는 엔터티의 속성을 뽑아보자.

2. 차 넘버, 바퀴 수, 차 색깔, 차종 등이 있다. 

3. 👉🏻 이 중에서 서비스의 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 된다. 


4.1.4 도메인

도메인(domain)이란?

- 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말한다.

예를 들어~

성별이라는 속성이 있다면 이 속성이 가질 수 있는 값은(남, 여)라는 집합이 된다.

속성과 도메인


4.1.5 필드와 레코드

- 앞에서 설명한 것들을 기반으로 데이터베이스에서 필드와 레코드로 구성된 테이블을 만들 수 있다. 

필드와 레코드

- 회원이란 엔터티는 member라는 테이블로 속성인 이름, 아이디 등을 가직 있으며 name, ID, address 등의 필드를 가진다.

- 그리고 이 테이블에 쌓이는 행(row) 단위의 데이터를 레코드라고 한다. 또한, 레코드를 튜플이라고도 한다. 

 

 

 

필드 타입

- 필드는 타입을 갖는다. 

예를 들어 ~

- 이름은 문자열이고 전화번호는 숫자다.

- 이러한 타입들은 DBMS마다 다르며 이 책에서는 MySQL을 기준으로 설명하겠다. 

- 여러 가지 타입이 있고 대표적인 타입인 숫자, 날짜, 문자 타입에 대해 알아보겠다. 


 

숫자 타입

- 숫자 타입으로는 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 등이 있다. 

 

 

날짜 타입

- 날짜 타입으로는 DATE, DATETIME, TIMESTAMP등이 있다.

 

  • DATE : 날짜 부분은 있지만 시간 부분은 없는 값에 사용된다. 지원되는 범위는 1000-01-01~9999-12-31이다. 3바이트의 용량을 가진다.  
  • DATETIME : 날짜 및 시간 부분을 모두 포함하는 값에 사용된다. 지원되는 범위는 1000-01-01 00:00:00에서 9999-12-31 23:59:59이다. 8바이트의 용량을 가진다. 
  • TIMESTAMP : 날짜 및 시간 부분을 모두 포함하는 값에 사용된다. 1970-01-01 00:00:01에서 2038-01-19 03:14:07까지 지원한다.  4바이트의 용량을 가진다. 

 

 

문자 타입

- 문자 타입으로는 CHAR, VARCHAR, TEXT, BLOB, ENUM, SET이 있다. 

 

CHAR와 VARCHAR

- 이 두 개는 모두 그 안에 수를 입력해서 몇 자까지 입력할지 정한다. 

- 예를들어 CHAR(30)이라면 최대 30글자까지 입력할 수 있다. 

 

  • CHAR : 고정 길이 문자열이며 길이는 0에서 255 사이의 값을 가진다. 레코드를 저장할 때 무조건 선언한 길이 값으로 '고정'해서 저장된다. 
  • VARCHAR : 가변 길이 문자열이다. 길이는 0에서 65.535 사이의 값으로 지정할 수 있으며, 입력된 데이터에 따라 용량을 가변 시켜 저장한다. 
💡 그렇게 때문에 CHAR의 경우 유동적이지 않은 길이를 가진 데이터의 경우에 효율적이며, 유동적인 길이를 가진 데이터는  VARCHAR로 저장하는 것이 좋다. 

 

TEXT와 BLOB

- 두 개의 타입 모두 큰 데이터를 저장할 때 쓰는 타입이다. 

 

  • TEXT : 큰 문자열 저장에 쓰며 주로 게시판의 본문을 저장할 때 쓴다. 
  • BLOB : 이미지, 동영상 등 큰 데이터 저장에 쓴다. 그러나 보통은 아마존의 이미지 호스팅 서비스인 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장한다.

아마존의 S3

 

ENUM과 SET

- ENUM과 SET 모두 문자열을 열거한 타입이다. 

 

  • ENUM : ENUM('x-small' , 'small' , 'medium' , 'large' , 'x-large') 형태로 쓰이며, 이 중에서 하나만 선택하는 단일 선택만 가능하고 ENUM 리스트에 없는 잘못된 값을 삽입하면 빈 문자열이 대신 삽입된다.  
  • SET : ENUM과 비슷하지만 여러 개의 데이터를 선택할 수 있고 비트 단위의 연산을 할 수 있으며 최대 64개의 요소를 집어넣을 수 있다는 점이 다르다. 

4.1.6 관계

- 데이터베이스에 테이블은 하나만 있는 것이 아니다. 

- 여러 개의 테이블이 있고 이러한 테이블은 서로의 관계가 정의되어 있다. 이러한 관계를 관계화살표로 나타낸다. 

관계화살표

1:1 관계

- 1:1 관계는 테이블을 두 개의 테이블로 나눠 테이블의 구조를 더 이해하기 쉽게 만들어 준다. 

1:1 관계

 

1:N 관계

- 한 개체가 다른 많은 개체를 포함하는 관계를 말한다. 

1:N 관계

 

N:M 관계

- 학생과 강의의 관계를 정의하면 어떻게 될까? 

- 학생도 강의를 많이 들을 수 있고 강의도 여러 명의 학생을 포함할 수 있다. 이 경우 N:M이 된다. 

N:M 관계


4.1.7 키

- 테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치로 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있다. 

키 간의 관계

- 키들은 앞의 그림과 같은 관계를 가진다. 

- 슈퍼키는 유일성이 있고 그 안에 포함된 후보키는 최소성까지 갖춘 키이다. 

- 후보키 중에서 기본키르 선택되지 못한 키는 대체키가 된다.

- 유일성은 중복되는 값은 없으며, 최소성은 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것을 말한다. 

 

 

기본키(Primary Key)

기본키란?

- 줄여 PK 또는 프라이머리키라고 많이 부르며, 유일성과 최소성을 만족하는 키이다. 

기본키가 안 되는 키

❗️이는 테이블의 데이터 중 고유하게 존재하는 속성이며 기본키에 해당하는 데이터는 앞의 그림의 ID처럼 중복되어서는 안 된다.
PDT-0002가 중복되기 때문에 ID라는 필드는 기본키가 되지 말아야 한다. 

기본키가 되는 키

☝🏻위의 그림에서 ID는 기본키로 설정할 수 있다. 물론! {ID,name}이라는 복합키를 기본키로 설정할 수 있지만 그렇게 되면 최소성을 만족하지 않다. 

 

👉🏻기본키는 자연키 또는 인조키 중에 골라 설정한다. 


자연키

- 중복된 값들을 제외하며 중복되지 않는 것을 '자연스레' 뽑다가 나오는 키를 자연키라고 한다.

- 자연키는 언젠가는 변하는 속성을 가진다. 

 

 

인조키

- 인위적으로 생성한 키를 인조키라고 한다. 

- 자연키와는 대조적으로 변하지 않는다. 

- 따라서 보통 기본키는 인조키로 설정한다. 

 


외래키(Foreign Key)

외래키란?

- FK라고도 하며, 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는 데 사용한다. 

외래키

👉🏻 외래키는 중복되어도 괜찮다. 

 

 

후보키(candidate key)

- 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키이다. 

 

 

대체키(alternate key)

- 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 말한다. 

 

 

슈퍼키(super key)

- 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키이다.