[CS지식] 4. 데이터베이스

김zunyange·2023년 6월 13일
0

CS Note

목록 보기
11/13
post-thumbnail

Chapter 4. 데이터베이스(DataBase)

4장은 데이터베이스이다.
데이터베이스는 백엔드가 알아야할 가장 기초적인 cs 지식이라고 하는데, 데이터베이스의 지식은 코드 문제를 더 잘 해결하고, 문제를 더 빨리 식별하며, 향후 웹 사이트 또는 애플리케이션의 장기 솔루션을 구현하는 데 도움이 될 수 있어 프론트엔드 개발자도 공부하면 좋을 것이다.
✨ 앱의 모든 부분에서 작업할 수 있는 유연성을 가질 수 있다.

4-1. 데이터베이스의 기본

데이터베이스(DB, DataBase)란?
일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음

데이터베이스를 제어, 관리하는 통합 시스템을 DBMS(DataBase Management System)라고 하며, 데이터베이스 안에 있는 데이터들은 특정 DBMS 마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다. 또한 데이터베이스는 실시간 접근과 동시 공유가 가능하다.

DBMS의 6가지 기본 기능

  • 데이터베이스 보안 관리
  • 여러 사용자의 데이터베이스 접근 관리
  • 데이터베이스 백업 및 복구 관리
  • 데이터 무결성 보장
  • 데이터베이스에 대한 최종 사용자 인터페이스 제공
  • 데이터베이스로부터 정보의 추출을 위한 질의어 제공

위의 그림처럼 데이터베이스 위에 DBMS 가 있고, 그 위에 응용 프로그램이 있으며, 이러한 구조를 기반으로 데이터를 주고받습니다. 예를 들어 MySQL 이라는 DBMS가 있고 그 위에 응용 프로그램에 속하는 Node.js나 php 에서 해당 데이터베이스 안에 있는 데이터를 끄집어내 해당 데이터 관련 로직을 구축할 수 있는 것이다.

💁🏻‍♀️ 하지만 데이터베이스는 원시적인 의미로는 데이터베이스의 모음을 뜻하지만, 데이터를 조직하는 유형별로, 혹은 DBMS 솔루션까지 묶어서 데이터베이스라고 부르기도 한다.

4-1-1. 엔터티(Entity)

엔터티란?
사람, 장소, 사진 개념 등 여러 개의 속성을 지닌 명사

예를 들어 회원이라는 엔터티 안에 이름, 아이디, 주소, 전화번호 등 많은 속성을 가질 것이며 이를 대표하는 명사가 엔터티이다. 더 많은 속성이 있지만 서비스의 요구 사항에 맞춰 속성이 정해지는데, 예를 들어 주소라는 속성이 서비스의 요구 사항과 무관한 속성이라면 주소라는 속성은 사라지게 된다.

4-1-2. 릴레이션(Relataion)

릴레이션이란?
데이터베이스에서 정보를 구분하여 저장하는 기본 단위

엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아 저정하여 관리하는 구조이다.

위의 그림을 보면 회원 안에 이름, 아이디, 주소, 전화번호 등의 속성 값이 있는데 이를 한꺼번에 묶어서 릴레이션 안에 저장해둔다.
이 릴레이션은 부르는 말이 조금씩 다른데, 관계형 데이터베이스에서는 테이블(Table) 이라고 하며, NoSQL 데이터베이스에서는 컬렉션(Collection) 이라고 불린다.

4-1-3. 속성과 도메인

속성(attribute) 은 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보를 말한다.
🔎 예를 들면 '차'라는 엔터티의 속성을 뽑아보자.
차 넘버, 바퀴 수, 차, 색깔, 차종 등이 있다. 이 중에서 서비스의 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 된다.

도메인(domain) 은 릴레이션에 포함된 각각의 속성 정보가 가질 수 있는 값들을 모아둔 집합이다.
🔎 예를 들면 '성별'이라는 속성이 있다면, 이 속성이 가질 수 있는 값은 {남, 여}라는 집합이 된다.

4-1-4. 테이블과 컬렉션

대표적인 관계형 데이터베이스인 MySQL과
대표적인 비관계형 데이터베이스인 MongoDB를 예로 들면, 구조는 다음과 같다.

MySQL 구조 : 레코드 - 테이블 - 데이터베이스
MongoDB 구조 : 도큐먼트 - 컬렉션 - 데이터베이스

4-1-5. 데이터베이스 종류

관계형/NoSQL 데이터베이스로 나눴다시피, 오늘날 데이터베이스는 주로 관계형 데이터베이스와 비관계형 데이터베이스로 나뉜다.

관계형 데이터베이스

  • 고정된 행(row)과 열(column)로 구성된 테이블에 데이터를 저장한다.
  • 각 열은 하나의 속성에 대한 정보를 저장하고, 행에는 각 열의 데이터 형식에 맞는 데이터가 저장된다.
  • 관계형 데이터베이스에서는 테이블의 구조와 데이터 타입 등을 사전에 정의한다. 그리고 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있다.
  • 특정한 형식을 지키기 때문에, 데이터를 정확히 입력했다면 데이터를 사용할 때에는 매우 수월하다.

관계형 데이터베이스의 대표적인 DBMS는 다음과 같다.
MySQL, Oracle, SQLite, MariaDB, PostgresSQL
(관계형 데이터베이스 관리 시스템을 RDBMS라고 부른다.)

  • 관계형 데이터베이스와 상호작용할 때 SQL을 사용할 수 있다.
  • 이 말은 관계형 데이터베이스에서는 스키마가 뚜렷하게 보인다는 말과 같다.
  • 다시 말해, 관계형 데이터베이스에서는 테이블 간의 관계를 직관적으로 파악할 수 있다.

❗️스키마(schema)란?
데이터베이스를 구성하는 레코드의 크기, 키(key)의 정의, 레코드와 레코드의 관계, 검색 방법 등을 정의한 것을 말한다. 또한, 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명을 말한다.
즉, 데이터베이스의 청사진과 같다.

비관계형 데이터베이스

  • 비관계형 데이터베이스란 관계형 데이터베이스를 뺀 나머지 유형을 총칭하는 뜻이다. (생각하는 No가 맞다.)
  • 주의할 점은 NoSQL 데이터베이스 또는 비관계형 데이터베이스로도 관계 데이터를 저장할 수 있다. (관계형 데이터베이스와 방식은 다르지만)
  • NoSQL 은 표 형식이 아니며, 관계형 테이블과는 다른 방식으로 데이터를 저장한다.
  • SQL 앞에 붙은 ‘No’에서 알 수 있듯이, 주로 데이터가 고정되어 있지 않은 데이터베이스를 가리킨다.
  • 데이터 모델에 따라 유형이 다양하다. 주요 문서, 키 값, 와이드 컬럼, 그래프가 있다.
  • NoSQL이 SQL과 반대되는 개념처럼 사용된다고 해서, NoSQL에 스키마가 반드시 없는 것은 아니다. 이들은 유연한 스키마를 제공하며, 대량의 데이터와 높은 사용자 부하에서도 손쉽게 확장이 가능하다.
  • 관계형 데이터베이스에서는 데이터를 입력할 때 스키마에 맞게 입력해야 하는 반면, NoSQL에서는 데이터를 읽어올 때 스키마에 따라 데이터를 읽어 온다.

SQL과 NoSQL 중에서 어떤 것을 사용해야 할까?

데이터베이스를 구축하는 방법을 선택하는 것에 완벽한 솔루션은 없다. 그렇기 때문에 많은 개발자들은 유저의 요구를 충족하기 위해 관계형, 비관계형 데이터베이스를 모두 사용하여 서비스에 맞게 설계하고 있다. NoSQL 기반의 비관계형 데이터베이스가 확장성이나 속도면에서 더 뛰어나다. 그러나 고차원으로 구조화된 SQL 기반의 데이터베이스가 더 좋은 성능을 보여주는 서비스도 있다. 여러 사용 사례를 살펴보고 적절한 데이터베이스를 선택하는 것이 중요하다.

👆🏻레코드가 쌓여서 테이블이 되고, 테이블이 쌓여서 데이터 베이스가 되는 것이다.

4-1-6. 관계

데이터베이스에서 테이블은 하나만 있는 것이 아니다. 테이블에 저장된 데이터들의 관계에 따라 one-to-one(1:1), one-to-many(1:N), many-to-many(N:M) 세가지로 타입이 분류된다.

1:1 관계
1:N 관계
N:M 관계

(1) 1:1 관계

각 전화번호가 단 한 명의 유저와 연결되어 있고, 그 반대도 동일하다면, Users 테이블과 Phonebook 테이블은 1:1 관계(One-to-one relationship)이다.
그러나 1:1 관계는 자주 사용하지 않는다. 1:1로 나타낼 수 있는 관계라면 Users 테이블에 phone_id를 대신해 phone_number를 직접 저장하는 게 나을 수 있다.

(1) 1:N 관계

한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미한다.
각 직원에게는 한 명의 직속 상사 또는 관리자가 있지만 일반적으로 각 관리자는 많은 직원을 감독한다.
국가(1)와 도시(N)를 생각해도 좋다. 일반적으로 한 국가에 여러 도시가 있으며, 각각의 도시는 한 국가에 속해있다.

(1) N:M 관계 (다대다 관계)

N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계가 존재할 때 나타나는 모습. 즉, 서로가 서로를 1:N 관계로 보고 있다.
무슨 말이냐 하면, 여러 개의 여행 상품이 있고, 여러 명의 고객이 있다. 고객 한 명은 여러 개의 여행 상품을 구매할 수 있고, 여행 상품 하나는 여러 명의 고객이 구매할 수 있다. 하지만, 이렇게 Customer 테이블과 Package table이 따로 존재한다면, N:M(다대다) 관계를 어떻게 표현할 수 있을까?

customer_package 테이블은 customer_id와 package_id를 묶어주는 역할이다.
이렇게 조인 테이블(customer_package 테이블)을 생성하더라도, 조인 테이블을 위한 기본키(여기서는 ID)는 반드시 있어야 한다. 만약 외래키를 리스트 형식으로 관리하는 필드가 있다면 즉, 조인 테이블 사용하지 않는다면 어떤 문제가 발생할 수 있을까?

🚨 필드에 저장되는 데이터의 크기를 설정해야하는데 엄청 커지게 되고 데이터가 저장되지 못할 수 도 있다.
🚨 데이터를 조회하는데 많은 비용이 발생하게 된다.
🚨 데이터를 수정할 때 두 곳에 수정이 잘 되었는지 확인이 불편하다. (실수를 유발한다.)

🏁 요약

데이터베이스는 데이터를 많이 모아놓은 베이스!
컴퓨터 시스템에 저장된 정보나 데이터를 모두 모아 놓은 집합을 의미한다고 생각하자.

  • 데이터베이스 가운데 관계형 데이터베이스는 모든 데이터를 2차원 테이블에 저장한다.
  • 테이블에 저장된 데이터들의 관계에 따라 one-to-one, one-to-many, many-to-many 세가지로 타입이 분류된다.
  • 데이터베이스를 사용하는 이유는 데이터를 휘발성으로 사라지게 하지 않고, 오래 기간 저장하며, 동시에 체계적으로 보관하기 위해서이다.

예상질문

💡 데이터베이스를 사용하는 이유

  1. 데이터베이스가 존재하기 이전에는 파일 시스템을 이용하여 데이터를 관리하였다. (현재도 부분적으로 사용되고 있다.) 데이터를 각각의 파일 단위로 저장하며 이러한 일들을 처리하기 위한 독립적인 애플리케이션과 상호 연동이 되어야 한다.

  2. 데이터를 오랜기간 저장 및 보존하기 위해서 데이터 베이스를 사용한다.
    작은 어플리케이션에서도 물론 데이터를 잠깐동안 임시로 저장할 수는 있다. 그러나 우리가 저장하지 않은 데이터는 컴퓨터를 껐다 켜면 사라진다. 메모리에 존재하는 데이터는 오래 보존이 되지 않기 때문에 어플리케이션이 종료되면 메모리에 있던 데이터들은 다시는 읽어들일 수 없다. 따라서, 필요한 자료를 계속 보존하기 위해 데이터베이스를 사용한다.

  3. 데이터를 체계적으로 보존하고 관리하기 위해 사용한다.
    데이터는 많이 오래 저장한다고만해서 좋지 않다. 필요할 때 언제든 내가 원하는 자료를 쉽게 읽어낼 수 있어야만 의미 있는 정보라고 할 수 있다.
    데이터베이스에는 데이터가 아무렇게나 어질러 저장되지 않고 체계적으로 정리되어 입력되어서 다시 찾고자 할 때 어렵지 않게 정보를 얻을 수 있다. 즉, 데이터를 체계적으로 정리하여 보관하기 위해 데이터베이스를 사용한다.

💡 데이터베이스의 특징에 대해 설명해주세요.

(1) 실시간 접근성(Real-Time Accessibility) : 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 한다.
*실시간 처리 : 생성된 데이터를 즉시 컴퓨터에 보내어 그 처리 결과를 보고 다음 의사 결정에 바로 반영할 수 있게 하는 처리 방식 (=온라인 처리)

(2) 지속적인 변화(Continuous Evloution) : 데이터베이스의 상태는 동적입니다. 즉 새로운 데이터의 삽입(Insert), 삭제(Delete), 갱신(Update)으로 항상 최신의 데이터를 유지해야 합니다.

(3) 동시 공용(Concurrent Sharing) : 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다.

(4) 내용에 의한 참조(Content Reference) : 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터 내용으로 찾습니다.


📍 출처
주홍철, [면접을 위한 CS 전공지식 노트]
https://dev-coco.tistory.com/158
[데이터베이스] SQL(구조화 쿼리 언어) vs NoSQL(비구조화 쿼리 언어)

📍 참고하면 좋을 사이트
[노마드코더] SQL vs NoSQL 5분컷 설명!
정규화

profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글