[데이터베이스] 데이터베이스의 기본

2024. 11. 2. 16:55·🗂️ Database

데이터베이스(Database, DB)는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음을 의미합니다. 이러한 데이터베이스를 제어 및 관리하는 통합 시스템을 DBMS(Database Management System)라고 하며, 데이터베이스 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리언어(Query Language)를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있습니다. 또한, 데이터베이스는 실시간 접근과 동시 공유가 가능합니다.

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

엔터티(Entity)

엔터티(Entity)는 사람, 장소, 물건, 사건, 개념 등 여러 개의 속성을 지닌 명사를 의미합니다. 예를 들어, 회원이라는 엔터티가 있으면 회원이 가지고 있는 속성으로 이름, 아이디, 주소, 전화번호를 가지고 있습니다.

해당 속성보다 많은 속성이 있겠지만 서비스의 요구 사항에 맞게 속성이 정해집니다. 서비스의 요구사항에서 만약 전화번호가 없다면 전화번호 속성을 삭제해도 됩니다.

약한 엔터티와 강한 엔터티

엔터티는 약한 엔터티와 강한 엔터티로 나뉘어 집니다. 만약 엔터티 A와 엔터티 B가 있다고 가장하였을 때 엔터티 A가 혼자서는 존재하지 못하고 엔터티 B의 존재 여부에 따라 종속적이면 약한 엔터티라고 합니다. 그리고 엔터티 B는 강한 엔터티가 됩니다.

릴레이션(Relation)

릴레이션(Relation)은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다. 엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리합니다.

그림처럼 회원이라는 엔터티가 데이터베이스에서 관리될 때는 릴레이션으로 변화됩니다. 릴레이션은 관계형 데이터베이스에서 테이블이라고 하며, NoSQL 데이터베이스에서는 컬렉션이라고 합니다.

테이블과 컬렉션

데이터베이스의 종류는 대표적으로 관계형 데이터베이스와 NoSQL 데이터베이스로 나뉠 수 있습니다. 이 중 관계형 데이터베이스는 MySQL, NoSQL 데이터베이스로 MongoDB가 대표적입니다. MySQL의 구조는 레코드-테이블-데이터베이스로 이루어져 있으며 MongoDB 데이터베이스의 구조는 도큐먼트-컬렉션-데이터베이스로 이루어져 있습니다.

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

속성(Attribute)

속성(Attribute)는 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보입니다. 예를 들어, '차'라는 엔티티의 속성을 뽑아낸다고 가정하였을 때 차 번호, 바퀴 수, 차 색깔, 차종 등이 존재하고 이 중에서 서비스의 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 됩니다.

도메인(Domain)

도메인(Domain)은 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 의미합니다. 예를 들어 성별이라는 속성이 있다면 이 속성이 가질 수 있는 값은 {남, 여}라는 집합이 됩니다.

 

 

그림처럼 회원이라는 릴레이션에 이름, 아이디, 주소, 전화번호, 성별이라는 속성이 있고, 성별은 {남, 여}라는 도메인을 가질 수 있는 것을 알 수 있습니다.

필드와 레코드

회원이라는 엔터티는 member라는 테이블로 석송인 이름, 아이디 등을 가지고 있으며 name, ID, address 등의 필드를 가집니다. 그리고 이 테이블에 쌓이는 행(Row) 단위의 데이터를 `레코드`라고 합니다. 또한, 레코드를 `튜플` 이라고도 합니다.

MySQL 기준 속성에 타입을 지정하려고 할 때 숫자는 INT, 문자열은 VARCHAR, 날짜는 DATETIME을 사용합니다.

CREATE TABLE BOOK (
    ID INT NOT NULL AUTO_INCREMENT,
    TITLE VARCHAR(255),
    AUTHOR_ID INT,
    PUBLISHING_YEAR VARCHAR(255),
    GENRE VARCHAR(255),
    CREATE_AT DATETIME,
    UPDATED_AT DATETIME,
    PRIMARY KEY (ID)
);

필드 타입

데이터 타입 설명 범위 저장 크기 (바이트)
TINYINT 작은 정수 -128 ~ 127 (SIGNED)
0 ~ 255 (UNSIGNED)
1
SMALLINT 작은 정수 -32,768 ~ 32,767 (SIGNED)
0 ~ 65,535 (UNSIGNED)
2
MEDIUMINT 중간 크기의 정수 -8,388,608 ~ 8,388,607 (SIGNED)
0 ~ 16,777,215 (UNSIGNED)
3
INT 일반 정수 -2,147,483,648 ~ 2,147,483,647 (SIGNED)
0 ~ 4,294,967,295 (UNSIGNED)
4
BIGINT 큰 정수 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (SIGNED)
0 ~ 18,446,744,073,709,551,615 (UNSIGNED)
8
FLOAT 소수점이 있는 작은 숫자 -3.402823466E+38 ~ 3.402823466E+38 4
DOUBLE 소수점이 있는 큰 숫자 -1.7976931348623157E+308 ~ 1.7976931348623157E+308 8
DECIMAL(M, D) 고정 소수점 숫자 (정밀한 계산을 위해 사용) 사용자 지정 범위
(M = 전체 자릿수)
M+2

 

날짜 타입

날짜 타입으로는 `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 또는 VARCHAR 모두 그 안에 수를 입력해서 몇 자까지 입력할지 정합니다. CHAR(30), VARCHAR(30)은 최대 30글자까지 입력할 수 있습니다.

 

CHAR는 고정 길이 문자열이며 길이는 0에서 255 사이의 값을 가집니다. 레코드를 저장할 때 무조건 선언한 길이의 값으로 '고정'해서 저장됩니다.

 

VARCHAR는 가변 길이 문자열이며 길이는 0에서 65,535 사이의 값으로 지정할 수 있으며, 입력된 데이터에 따라 용량을 가변시켜 저장합니다. 10글자의 이메일을 저장할 경우 VARCHAR(1000)을 선언했음에도 10글자에 해당하는 바이트 + 길이 기록용 1바이트를 저장합니다.

 

CHAR의 경우 유동적이지 않은 길이를 가진 데이터의 경우에 효율적이며 VARCHAR의 경우에는 유동적인 길이를 가진 데이터에 효율적입니다.

 

TEXT와 BLOB

TEXT와 BLOB은 모두 큰 데이터를 저장할 때 쓰는 타입입니다.

 

TEXT는 큰 문자열 저장에 쓰며 주로 게시판의 본문을 저장할 때 사용됩니다.

BLOB은 이미지, 동영상 등 큰 데이터 저장에 사용됩니다. 그러나 보통은 아마존의 이미지 호스팅 서비스인 S3를 사용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCAHR로 저장합니다.

 

관계(Relation)

데이터베이스에 테이블은 하나만 있는 것이 아니며 여러 개의 테이블이 있고 이러한 테이블은 서로의 관계가 정의되어 있습니다. 테이블들의 관계를 관계 화살표로 나타냅니다.

 

 

1:1 관계

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

 

 

1:N 관계

한 유저당 여러 개의 상품을 장바구니에 넣을 수 있으므로 이러한 관계를 1:N 관계라고 합니다. 하나도 넣지 않는 0개의 경우도 있으니 0도 포함되는 화살표를 통해 표현합니다. 한 개체가 다른 많은 개체를 포함하는 관계를 의미합니다.

 

 

N:M 관계

학생도 강의를 많이 들을 수 있고 강의도 여려 명의 학생을 포함할 수 있는 관계를 N:M 관계라고 합니다. N:M 관계는 테이블 두개를 직접적으로 연결해서 구축하지 않고 그림처럼  1:N 관계와 1:M 관계를 갖는 테이블 두개로 나눠서 설정합니다.

 

키(Key)

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

 

 

슈퍼키는 유일성만을 가지며 최소성까지 갖춘 키를 후보키라고 합니다. 후보키 중에서 기본키로 선택되지 못한 키는 대체키가 됩니다. 앞서 말한 유일성은 중복되는 값은 없는 것을, 최소성은 필드를 조합하지 않고 최소한의 필드만을 써서 키를 형성할 수 있는 것을 의미합니다.

 

기본키

기본키(Primary Key)는 줄여 PK라고 불리며 유일성과 최소성을 만족하는 키를 의미합니다.

테이블의 테이터 중 고유하게 존재하는 속성을 의미하며 기본키에 해당하는 데이터는 앞의 그림의 ID처럼 중복되서는 안됩니다. 

 

 

{ID, NAME}이라는 복합키를 기본키로 설정할 수 있지만 최소성을 만족하지 않게 됩니다. 그러므로 기본키는 자연키 또는 인조키 중에서 골라 설정합니다.

 

자연키

중복된 값들을 제외하며 중복되지 않는 것을 '자연스럽게' 뽑다가 나오는 키를 자연키라고 합니다. 자연키는 언제가는 변하는 속성을 가집니다.

 

인조키

인위적으로 생성하는 키를 의미합니다. 자연키와는 대조적으로 변하지 않기에 대표적으로 기본키는 인조키로 설정합니다.

 

외래키

외래키(Foreign key)는 FK라고 하며, 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는 데 사용됩니다.

 

 

외래키는 중복되어도 괜찮으며 앞의 그림을 보면 client라는 테이블의 기본키인 ID가 product라는 테이블의 user_id라는 외래키를 설정될 수 있음을 보여줍니다. 또한, user_id는 a_2라는 값이 중복되는 것을 볼 수 있습니다.

 

후보키

후보키(Candidate Key)는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키를 의미합니다.

 

대체키

대체키(Alternate Key)는 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 의미합니다.

 

슈퍼키

슈퍼키(Super Key)는 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키를 의미합니다.

'🗂️ Database' 카테고리의 다른 글

[데이터베이스] 조인의 종류와 원리  (2) 2024.11.09
[데이터베이스] 데이터베이스의 종류와 인덱스  (1) 2024.11.07
[데이터베이스] 트랜잭션과 무결성  (1) 2024.11.03
[데이터베이스] ERD와 정규화 과정  (0) 2024.11.02
'🗂️ Database' 카테고리의 다른 글
  • [데이터베이스] 조인의 종류와 원리
  • [데이터베이스] 데이터베이스의 종류와 인덱스
  • [데이터베이스] 트랜잭션과 무결성
  • [데이터베이스] ERD와 정규화 과정
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    복잡도
    JPA
    @annotation
    OS
    운영체제
    springbatch
    조인
    db
    java
    CS
    데이터베이스
    SpringMVC
    DI
    spring
    SpringSecurity
    자료구조
    스케줄링
    네트워크기기
    네트워크
    QueryDSL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[데이터베이스] 데이터베이스의 기본
상단으로

티스토리툴바