프론트엔드를 위한 CS 지식 (3) - 데이터베이스

Junho Yun·2023년 3월 31일
0
post-thumbnail

데이터베이스 기초 이론

데이터베이스 란?

데이터베이스는 사용자 데이터, 제품 정보 및 거래 기록과 같은 다양한 유형의 데이터를 저장할 수 있습니다. 개발자는 MySQL, PostgreSQL, MongoDB 및 Oracle을 비롯한 다양한 데이터베이스 관리 시스템(DBMS)을 사용하여 데이터를 관리합니다.

DBMS

DBMS(데이터베이스 관리 시스템)는 사용자가 데이터베이스에서 데이터를 생성, 저장, 구성 및 관리할 수 있도록 하는 소프트웨어 시스템입니다. DBMS의 주요 기능은 사용자가 데이터 추가, 수정, 삭제 및 쿼리를 포함하여 데이터베이스의 데이터와 상호 작용할 수 있는 방법을 제공하는 것입니다.

사용 가능한 다양한 유형의 DBMS가 있으며 각각 고유한 강점과 약점이 있습니다.

널리 사용되는 DBMS의 예로는 MySQL, Oracle 및 Microsoft SQL Server와 같은 RDBMS(관계형 데이터베이스 관리 시스템)와 MongoDB 및 Cassandra와 같은 NoSQL 데이터베이스가 있습니다.

관계형 데이터베이스

관계형 데이터베이스는 데이터를 하나 이상의 테이블로 구성하는 데이터베이스 유형이며 각 테이블에는 기본 키(key) 라는 고유 식별자가 있습니다. 테이블 간의 관계는 한 테이블을 다른 테이블에 연결하는 외래 키(key)라는 공통 필드를 통해 설정됩니다.

관계형 데이터베이스를 사용하면 다음과 같은 이점이 있습니다.

  • 데이터 일관성: 데이터가 테이블로 구성되기 때문에 각 데이터 조각이 전체 데이터베이스에서 일관성이 있는지 쉽게 확인할 수 있습니다.
  • 확장성: 관계형 데이터베이스는 많은 양의 데이터를 처리할 수 있으며 성장하는 애플리케이션의 요구 사항을 충족하도록 확장할 수 있습니다.
  • 보안: 관계형 데이터베이스는 사용자 인증 및 액세스 제어를 비롯한 강력한 보안 기능을 제공합니다.
    유연성: 관계형 데이터베이스는 변화하는 데이터 요구 사항을 수용하기 위해 쉽게 수정할 수 있습니다.

SQL 알아보기

SQL이란?

SQL은 Structured Query Language의 약자이며 관계형 데이터베이스를 관리하는 데 사용되는 프로그래밍 언어입니다. SQL은 데이터베이스에서 데이터를 생성, 수정 및 검색하는 데 사용되며 관계형 데이터베이스와 상호 작용하는 데 가장 널리 사용되는 언어입니다.

  • SELECT: 데이터베이스에 있는 하나 이상의 테이블에서 데이터를 검색하는 데 사용됩니다.
  • INSERT: 데이터베이스의 테이블에 새 데이터를 추가하는 데 사용됩니다.
  • UPDATE: 데이터베이스의 테이블에 있는 기존 데이터를 수정하는 데 사용됩니다.
  • DELETE: 데이터베이스의 테이블에서 데이터를 제거하는 데 사용됩니다.

테이블의 여러 옵션

  • 열 이름 및 데이터 유형: 테이블의 각 열에는 해당 열에 저장할 수 있는 데이터 유형을 정의하는 이름과 데이터 유형이 있어야 합니다. 일반적인 데이터 유형에는 VARCHAR(가변 길이 문자열), INTEGER(정수) 및 DATE(날짜)가 포함됩니다.

  • 기본 키(Primary key): 기본 키는 테이블의 각 행을 고유하게 식별하는 열 또는 열 집합입니다. 이 키는 데이터 무결성을 적용하고 테이블의 각 행이 고유한지 확인하는 데 사용됩니다.

  • 제약 조건: 제약 조건은 열 또는 열 집합에 저장할 수 있는 값을 제한하는 규칙입니다. 일반적인 제약 조건에는 NOT NULL(값을 입력해야 함), UNIQUE(열의 각 값이 고유해야 함) 및 FOREIGN KEY(두 테이블 간의 관계를 설정함)가 포함됩니다.

  • 인덱스(Indexes): 인덱스는 특정 열 또는 열 집합에 대한 빠른 조회 메커니즘을 제공하여 데이터 검색 속도를 향상시키는 데이터 구조입니다. 테이블에 있는 하나 이상의 열에 인덱스를 만들 수 있습니다.

  • 기본값: 기본값은 테이블에 행을 삽입할 때 값을 제공하지 않으면 자동으로 컬럼에 할당되는 값입니다.

  • 테이블 옵션: 테이블 옵션은 테이블을 생성할 때 지정할 수 있는 추가 설정입니다. 일반적인 옵션에는 ENGINE(테이블 저장에 사용되는 스토리지 엔진 지정), CHARACTER SET(텍스트 데이터 저장에 사용되는 문자 집합 지정) 및 COLLATE(텍스트 데이터 정렬에 사용되는 데이터 정렬 지정)가 포함됩니다.

SQL 대표적인 예시

SELECT 문:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

INSERT 문:

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

업데이트 문:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

DELETE 문:

DELETE FROM table_name
WHERE condition;

CREATE TABLE 문:

CREATE TABLE table_name (
  column1 datatype,
  column2 datatype,
  ...
);

ALTER TABLE 문:

ALTER TABLE table_name
ADD column_name datatype;

DROP TABLE 문:

DROP TABLE table_name;

key의 의미

테이블

관계형 데이터베이스에서 테이블은 행과 열로 구성된 관련 데이터 모음입니다. 각 열은 데이터의 특정 속성을 나타내고 각 행은 데이터의 고유한 인스턴스를 나타냅니다.

테이블 및 컬럼 컨벤션

• 테이블(table)의 이름은 단수형을 사용한다.
• 이름을 붙일 때는 snake case를 사용한다: student, retired_employee
• 테이블의 key는 {테이블 이름의 단수형}_id 형태를 쓴다: student_id (O) 혹은 단순히 id (O)

외래키

외래 키는 다른 테이블의 기본 키를 참조하는 테이블의 열 또는 열 집합입니다. 관계형 데이터베이스에서 두 테이블 간의 관계를 설정합니다. 외래 키 제약 조건은 유효하지 않은 데이터가 테이블에 입력되는 것을 방지하여 데이터베이스의 참조 무결성을 보장합니다.

외래 키는 관계형 데이터베이스의 무결성과 일관성을 유지하는 데 중요한 역할을 하여 데이터가 올바르게 입력되고 검색되도록 합니다. 이를 통해 테이블을 서로 연결하여 보다 유연하고 강력한 데이터베이스 디자인을 만들 수 있습니다.

정규화

정규화 란?

정규화는 데이터 중복을 제거하고 데이터 무결성을 향상시키기 위해 관계형 데이터베이스에서 데이터를 구성하는 프로세스입니다. 여기에는 테이블을 더 작고 관리하기 쉬운 테이블로 나누고 기본 키와 외래 키를 사용하여 테이블 간의 관계를 설정하는 작업이 포함됩니다.

여러 수준의 정규화가 있으며 각 수준에는 고유한 규칙과 지침이 있습니다. 가장 일반적인 정규화 수준은 1NF(1차 정규형), 2NF(2차 정규형) 및 3NF(3차 정규형)입니다.

제1 ~ 제3 정규화 과정

  • 1NF에서 테이블의 각 열은 원자 값(즉, 더 이상 나눌 수 없는 값)을 포함해야 합니다.
  • 2NF에서 테이블은 1NF에 있어야 하며 키가 아닌 모든 속성은 전체 기본 키에 종속되어야 합니다.
  • 3NF에서 테이블은 2NF에 있어야 하며 키가 아닌 모든 속성은 기본 키에만 의존해야 합니다.

"관계형 모델에 준수하기 위한 전제 조건으로, 테이블은 각 행을 고유하게 식별하는 기본 키(primary key)를 가져야 합니다. 두 개의 책은 동일한 제목을 가질 수 있지만, ISBN은 책을 고유하게 식별할 수 있으므로 기본 키로 사용될 수 있습니다."

  • 1정규화 만족시키기

주제가 추출된 행의 기본 키를 참조하는 주제 테이블 에 외래 키 열이 추가됩니다 . 따라서 동일한 정보가 표시되지만 단순하지 않은 도메인을 사용하지 않습니다.

정규화되지 않은 형식 의 하나의 테이블 대신 이제 1NF를 준수하는 두 개의 테이블이 있습니다.

  • 2정규화 만족시키기

후보 키의 일부가 아닌 모든 속성은 Title 에 의존 하지만 Price 만 Format 에도 의존합니다 . 2NF를 준수 하고 중복을 제거하려면 후보 키가 아닌 모든 속성이 후보 키의 일부가 아니라 전체 후보 키에 의존해야 합니다.

이 테이블을 정규화하려면 {Title} 을 (단순) 후보 키(기본 키)로 만들어 후보 키가 아닌 모든 속성이 전체 후보 키에 의존하도록 하고 Price를 별도의 테이블로 제거하여 Format 에 대한 종속성 이 보존하다:

  • 3정규화 만족시키기
    Book 테이블에는 여전히 전이적 기능적 종속성이 있습니다({저자 국적}은 {저자}에 종속되며 이는 {제목}에 종속됨) . 장르에 대해 유사한 위반이 존재합니다({장르 이름}은 {제목}에 종속된 {장르 ID}에 종속됨). 따라서 Book 테이블은 3NF에 없습니다. 3NF로 만들기 위해 다음 테이블 구조를 사용하여 {저자 국적} 및 {장르 이름}을 각각의 테이블에 배치하여 전이적 기능 종속성을 제거합니다.

트랜잭션 (transaction)

트랜잭션 이란?

데이터베이스의 트랜잭션은 단일 작업 단위로 수행되는 하나 이상의 작업 시퀀스입니다. 이러한 작업에는 데이터베이스의 하나 이상의 테이블에서 데이터 삽입, 업데이트 또는 삭제가 포함될 수 있습니다.

  • 원자성은 트랜잭션이 단일 작업 단위로 취급되고 트랜잭션의 모든 작업이 완료되거나 완료되지 않음을 의미합니다.
  • 일관성은 데이터베이스가 트랜잭션 전체에서 유효한 상태로 유지되도록 합니다.
  • 격리는 여러 트랜잭션이 서로 간섭하지 않고 동시에 수행될 수 있도록 합니다.
  • 내구성은 트랜잭션이 커밋되면 해당 변경 사항이 영구적이며 후속 시스템 장애가 지속되도록 합니다.

Commit과 Rollback

데이터베이스 트랜잭션에서 커밋은 데이터베이스에 대한 모든 변경 사항을 영구적으로 만드는 작업이며, 롤백은 마지막 커밋 또는 저장 지점 이후의 모든 변경 사항을 취소합니다.

트랜잭션이 시작되면 데이터베이스에 대한 모든 변경 사항이 즉시 저장되거나 커밋되지 않습니다. 대신 트랜잭션 로그라는 임시 영역에 보관됩니다. 이를 통해 오류가 발생하거나 사용자가 트랜잭션을 취소하기로 결정한 경우 트랜잭션을 롤백할 수 있습니다.

트랜잭션이 성공적으로 완료되고 모든 변경 사항이 유효한 경우 커밋이 실행되고 변경 사항이 데이터베이스에 영구적으로 저장됩니다. 즉, 동일한 데이터에 액세스하는 다른 사용자가 트랜잭션에서 변경한 내용을 볼 수 있습니다.

반면 트랜잭션 중 오류가 발생하거나 사용자가 취소를 결정하면 롤백이 실행됩니다. 이렇게 하면 트랜잭션의 모든 변경 사항이 실행 취소되고 데이터베이스가 트랜잭션이 시작되기 전 상태로 돌아갑니다. 트랜잭션의 변경 사항은 삭제되고 데이터베이스는 변경되지 않은 상태로 유지됩니다.

트랜잭션의 상태 종류

트랜잭션의 상태는 활성, 부분 커밋, 실패, 중단 또는 커밋과 같은 여러 가능한 상태 중 하나가 될 수 있는 현재 상태를 나타냅니다.

  • Active: 트랜잭션이 진행 중이며 아직 커밋되거나 롤백되지 않았습니다. 이 상태에서 트랜잭션은 데이터베이스의 데이터를 읽고 수정할 수 있습니다.
  • Partially Committed: 모든 데이터 수정이 이루어졌지만 트랜잭션이 아직 완전히 커밋되지 않았습니다. 이 상태에서는 현재 트랜잭션이 커밋되거나 롤백될 때까지 다른 트랜잭션이 동일한 데이터를 수정하지 못하도록 데이터베이스를 잠글 수 있습니다.
  • Failed: 오류가 발생하여 트랜잭션이 조기에 종료되었습니다. 트랜잭션이 실패하면 변경 사항을 취소하기 위해 롤백해야 합니다.
  • Aborted: 트랜잭션이 사용자 또는 시스템에 의해 명시적으로 롤백되었습니다. 이는 사용자가 거래를 취소하거나 거래 중 오류가 감지된 경우에 발생할 수 있습니다.
  • Committed: 트랜잭션이 성공적으로 완료되었으며 모든 변경 사항이 데이터베이스에 영구적으로 적용되었습니다. 트랜잭션이 커밋되면 해당 변경 사항은 동일한 데이터에 액세스하는 다른 트랜잭션에서 볼 수 있습니다.

서로 다른 트랜잭션 상태를 이해하는 것은 트랜잭션을 적절하게 관리하고 데이터베이스 데이터의 일관성과 신뢰성을 보장하는 데 중요합니다. 트랜잭션 진행 상황 모니터링, 오류 진단 및 장애 복구에 도움이 될 수 있습니다.

profile
의미 없는 코드는 없다.

1개의 댓글

comment-user-thumbnail
2023년 3월 31일

공부할 게 많아서 너무 행복하네요! 😃

답글 달기