[ Session ] Database

Hailee·2020년 11월 23일
0

 > wecode 

목록 보기
3/11
post-thumbnail

데이터모델링 정리 글(2019)
👆🏻 2019년 아무것도 모르던 코린이 시절에 정리한 글

1. 관계형 데이터베이스의 정의
2. null값 입력으로 인한 "L자형 테이블"
3. 키의 개념과 정류
4. 무결성(integrity)
5. 이상(anomaly) 현상과 데이터의 중복
6. 정규화
7. 1 정규화
8. 2 정규화
9. 3 정규화
10. 카디널리티
** 다대다(M:N) 테이블의 문제점 & 해결방법
11. 데이터모델링의 규칙

과거 국비생 시절에 데이터베이스를 처음 접했을 땐
이해했다고 생각했지만, 정규화에 대해서는 개념이 잘 잡혀있지 않은 상태였다
그래서 참 많이 싸웠지.. 정규화 알고 다시와서 이야기하자고 그랬었던 우리..
다들 기억 하시나요..? (혼자 아련)

그 땐 1:1, 1:N, M:N 이 개념이 참 설명하려면 힘들었던, 그런 개념이었는데
그래도 한번 다 겪어봐서인지 지금은 세션 듣는 동안 이해가 좀 더 수월하게 갔다.

그래도 다시한번 정리 꼬!
(소중한 세션시간)


1. 데이터베이스란?

What is Database? (Oracle)

  • A database generally refers to a structured collection of structured information or data stored electronically in a computer system.
  • The database is usually controlled by a database management system (DBMS). Data and DBMS are referred to as 'database systems' along with related applications, and are also collectively referred to as 'databases' for short.
  • 데이터베이스 : 컴퓨터 시스템에 저장된 정보 / 데이터의 집합
  • 보통 DBMS(데이터베이스 시스템)으로 제어
  • Application에서는 데이터가 메모리 상에서 존재
    메모리에 존재하는 데이터는 보존이 되지 않아 어플리케이션 종료 후에는 다시 읽어들일 수 없음
    👉🏻 데이터를 오랜 기간 저장 & 보존 하기 위해서 데이터베이스 사용
  • 관계형 데이터베이스 (RDBMS) 👉🏻 Relational
  • 비관계형 데이터베이스 (NoSQL) 👉🏻 Non-Relational

2. RDBMS란? 왜 관계형 테이블을 쓰는가?

관계형 데이터베이스

  • 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템
  • Relational Database Management System
    : MySQL, Postgres, Oracle DB
  • 관계형 데이터
    : 서로 상호 관련성을 가진 형태로 표현한 데이터
  • column(각 항목), row(실제 값)로 구성
    : 각 row는 저만의 Primary Key를 가지고 있으며
    해당 row를 찾거나 인용(reference)함
  1. One To One

    각 테이블의 row가 정확히 1:1 매칭이 되는 관계
    (회원 T / 회원정보 T)

  2. One To Many

    한 테이블의 row가 다른 테이블의 여러 row와 연결이 되는 관계
    (고객 T / 구매 내역 T)

  3. Many To Many

    한 테이블의 여러 row - 다른 테이블의 여러 row와 연결이 되는 관계
    (작가 T / 여러 책 T / 작가와 책 T)


4. 테이블의 관계

어떻게 Table 끼리 연결하는가?

  • Foreign Key(외래키)로 연결
  • 부모 table에 존재하는 값만 자식 table에 생성될 수 있다.

왜 Table을 연결하는가?

  • 하나의 테이블에 모든 정보를 넣으면
    : 동일 정보들이 불필요하게 중복되어 저장
    : 더 많은 디스크 사용, 잘못된 데이터 저장 가능성 🤯🤯
  • 여러 테이블에 나누어서 저장할 경우
    : 중복된 데이터 X -> 효율적 디스크 사용
    : 같은 데이터이지만 부분적으로 내용 다른 데이터 생성 가능성 적어짐
    (Normalization : 정규화)

5. 트랜잭션이란? ACID는?

Transaction

  • ACID를 제공함으로 따라서 트랜잭션 기능 제공
    : 일련의 작업들을 한번에 하나의 Unit으로 실행
    : 하나의 작업처럼 취급되어 모두 성공 / 모두 실패 처리 (Commit & Rollback)

ACID

Atomicity(원자성)

  • 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
  • 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것

    예를 들어, 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안됨

Consistency(일관성)

  • 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것

    무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단됨

Isolation(고립성)

  • 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것
  • 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음

    은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없음
    공식적으로 고립성은 '트랜잭션 실행내역은 연속적이어야 함'을 의미
    성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건

Durability(지속성)

  • 지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미
  • 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미
  • 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있음

    트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있습니다.


6. 관계형 데이터베이스 & 비관계형 데이터베이스

SQL (RDBMS)

  • 장점:
    • 관계형 데이터베이스는 데이터를 더 효율적으로 그리고 체계적으로 저장할 수 있고 관리 할 수 있다.
    • 미리 저장하는 데이터들의 구조(테이블 스키마)를 정의 함으로 데이터의 완전성이 보장할 수 있다.
    • 트랜잭션(transaction)
  • 단점:
    • 테이블을 미리 정의해야 하므로 테이블 구조 변화 등에 덜 유연한다.
    • 확장성이 쉽지 않다.
      • 역시 테이블 구조가 미리 정의 되어 있다보니 단순히 서버를 늘리는것 만으로 확장하기가 쉽지 않고 서버의 성능 자체도 높여야 한다.
      • 서버를 늘려서 분산 저장 하는것도 쉽지 않다.
      • Scale up (서버의 성능을 높이는것)으로 확장성이 됨.
  • 정형화된 데이터들 그리고 데이터의 완전성이 중요한 데이터들을 저장하는데 유리하다.
    • 예) 전자상거래 정보. 은행 계좌 정보, 거래 정보 등등.

NoSQL

  • 장점:
    • 테이터 구조를 미리 정의하지 않아도 되므로 저장하는 데이터의 구조 변화에 유연하다.
    • 확장하기가 비교적 쉽다. 그냥 서버 수를 늘리면 됨(scale out)
    • 확장하기가 쉽고 테이터의 구조도 유연하다 보니 방대한 양의 데이터를 저장하는데 유리하다.
  • 단점:
    • 데이터의 완전성이 덜 보장된다.
    • 트랜잭션이 안되거나 비교적 불안정하다.
  • 주로 비정형화 데이터 그리고 완전성이 상대적으로 덜 유리한 데이터를 저장하는데 유리하다.
    • 예) 로그 데이타

7. ERD 구성도로 모델링하기

스타벅스 Korea 공홈 - 음료 메뉴에 한정된 데이터베이스 ERD 그려보기

category 👈🏻 drink (1:N)
drink 👈🏻 image (1:N)
drink 👈🏻👉🏻 allergy (M:M)
👇🏻👇🏻👇🏻
allergy_drink (중간 Table)

👇🏻 우리 조가 짠 ERD, 음료에 대한 정보를 음료테이블에 모두 넣고
음료와 알러지테이블은 서로 다대다 관계일것 같아서
중간테이블을 생성했다.

👇🏻 첨삭해주신 ERD!

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글