[WebDevCurriculum] RDB기초와 ORM

Hyo Kyun Lee·2021년 11월 16일
0

WebDevCurriculum

목록 보기
24/44

개요

데이터베이스에 대해 이해하고, 이를 활용하기 위한 방법에 대해 이해한다.

Checklist

  • RDBMS 테이블의 정규화는 무엇인가요?

table 간의 관계/관계비율 등을 정의하는 등 DB구축을 위한 기본적인 data/table 정제과정을 의미한다.

쉽게 말하면 무분별하게 table로 이루어진 data를 정리하고, 중복되는 속성(fields) 등을 제거하여 DB를 체계화하는 작업이라 할 수 있다.

데이터모델링을 진행할 때 가장 중요한 요소에는 데이터 중복 제거/단순화(simplify)/일관성을 확보 등이 있고, 정규화는 이러한 요소들을 보장하기 위해 진행하는 정제 작업이다.

1차 정규화

→ 서로 중복되지 않는, 독립적인 속성으로만 구성된 table을 구성한다.
→ 위의 예시는 product 정보(info)와 판매 정량적 데이터(sales), 두 table로 분할하는 과정을 진행한다.

→ table의 주키(primary key) 구성으로 table 유형을 정의한다(table의 식별자가 primary key).
→ 외래키(foreign key) 구성으로 연결관계를 정의합니다.

각 유형별로 정의한 table 생성

→ 필요 시 추가적인 정규화를 진행한다.

  • RDB / Non-RDB

DB란 database, 무수히 많은 data들이 저장되어 있는 저장소이다.

이 data를 저장하는 방식에 따라 관계형 데이터베이스(RDB, Relational Data Base)와 비관계형 데이터베이스(Non-RDB, Non-Relatonal Data Base)로 나눌 수 있다.

참고로 RDB의 대표적인 DBMS는 MySQL(이외 PostgreSQL 등, 한국에서는 MySQL이 많이 활용됨), Non-RDB의 대표적인 DBMS NoSQL(이외 MongoDB, Redis 등)이다.

보통 Non-RDB를 지칭할 때 NoSQL으로 대표하여, NoSQL류 DB라고 일컫기도 한다.

그리고 이러한 데이터베이스를 사용자가 쉽게 조작하고 관리할 수 있도록, 관련 인터페이스(=관리시스템)을 제공한 체계를 통틀어 DBMS(Data Base Management System)이라 일컫는다.

위 그림에서 볼 수 있듯이, 관계형DB와 비관계형DB를 나누는 가장 큰 요인은 데이터를 관리하기 위해 일관적인 모델(=table)을 사용하는 지이다.

DBMS/RDBMS 비교

비관계형 데이터베이스는 data를 file화하여, 전통적인 관계형 데이터베이스의 데이터 관리방식을 따르지 않는다.

이러한 데이터 관리부터, 데이터 탐색 및 저장방식 등에서 서로 많은 차이를 보인다.

  • RDBMS에서 테이블 인덱싱과 해싱은 무엇인가요?

데이터에 빠르고 효율적으로 접근하기 위해 관리시스템은 인덱스나 hash 기법을 사용한다.

인덱스

인덱스의 경우 RDBMS에서 데이터를 빠르고 효율적으로 탐색하기 위해 필수적으로 사용하는 요소이다.

인덱스는 아래 두가지 형태로 활용한다.
→ 직접적인 field 항목은 아니지만, 참조용으로 구성
→ 데이터베이스를 구성하는 데이터와 함께, 테이블의 field의 한 영역으로 구성

Hash

우리가 알고있는 알고리즘의 'hash table'와 유사한 개념으로, 해싱 기법은 데이터가 빠르게 접근할 수 있도록 key 값을 사용한다.

데이터를 빠르게 탐색하기 위해 참조하는 도구라는 점에서 본질적으로 인덱스와 다르지는 않다.

다만 인덱스를 구성할 때 해싱기법을 이용하므로 다소 상이한 부분이 존재하며, 그 중 가장 큰 다른 부분은 key값을 해당 data/column의 물리적 위치를 가르키는 포인터로 변환하는 점이다(랜더마이징 알고리즘).

  • ORM을 사용하는 것은 사용하지 않는 것에 비해 어떤 장단점을 가지고 있나요?

관계형 데이터베이스에서 데이터를 관리하는 체계는 table이지만, 이를 전달받고 활용하기 위해선 객체형태이어야 한다.

이처럼 사용자가 데이터를 활용하기위해 객체형태로 전환하는 과정을 ORM, Object Relational Mapping이라 일컫는다.

쉽게 말하면 table을 class(함수/객체)화하여, 사용자가 쉽게 접근하고 활용할 수 있도록 제공하는 기능들이다.

※ 장점 : 데이터를 받아오는 과정 자체는 Query에 대한 이해가 없어도 가능하다(다만, 전반적인 database 구성은 이해 필요).

※ 단점 : 데이터에 직접 접근하는 query에 비해 실행 및 처리속도가 느리고, query문을 대체하기엔 불리한 점이 많다.

  • 자바스크립트 생태계의 ORM에는 어떤 것들이 있나요?

대표적으로 sequelize가 있고, postgreSQL과 같은 관계형데이터베이스와 많이 연동하여 사용한다.

  • 모델간의 1:1, 1:N, N:M 관계는 각각 무엇이고 어떨 때 사용하나요?

데이터베이스 설계를 위한 데이터 모델링을 진행 하면서, 두 엔티티 타입(여러 엔티티를 가지고 있는 집합)의 관계 비율을 정확하게 정의하는 것이 중요하다.

엔티티 혹은 엔티티들이 서로 연관성이 있는지 확인하고, 이를 숫자로 표현한 것이 관계비율이다.

서로 다른 엔티티가 정확히 하나의 요소(엔티티)만 연관이 되어 있을 경우 1:1 관계로 표현한다.
→ 사람 : 주민등록번호

한 엔티티가 다른 여러 엔티티와 연관이 되어 있을 경우 1:N 관계로 표현한다(정확히 하나의 엔티티만 연관).
→ 사람 : 보유 카드, 보유 전공, 학생 : 선생님

서로 여러 엔티티가 연관되어 있을 경우 N:M 관계로 표현한다.
→ 임원 : 직원, 직원 : 관리권한

  • DB에 사용자의 암호를 평문으로 저장하지 않고도 사용자의 암호를 인증하는 것이 가능한 이유는 무엇일까요?

암호화하는 알고리즘은 보통 정해져있고, 복호화 알고리즘도 암호화에 맞추어 제공되므로 알고리즘을 알고있다면 복호화를 통해 빠른 인증이 가능하다.

  • 해시 함수에는 어떤 것이 있나요?

대표적으로 Adaptive Key Derivation Functions, PBKDF2, bcrypt, scrypt 등이 있다.

참조개념

  • 엔티티

Table = 엔티티

엔티티는 실질적으로 존재하지는 않는 개념적 형태이며, 실무적으로 데이터를 저장하기 위해 정의한 하나의 실체, 객체를 의미한다.

실제로 존재하는 형태인 Table과는 조금 다른 개념이지만, DBMS와 연계하였을때는 Table과 가장 가까운 개념으로 이해할 수 있다.

이 엔티티에는 여러 인스턴스가(=튜플) 구성되어 있으며, 이 인스턴스들은 각각 유일한 식별자를 보유한다.

예를 들어, 자동차라는 엔티티에는 트럭, 버스, 승용차 등의 인스턴스로 구성된다.
DBMS를 이루는 그룹단위인 Table은 이러한 엔티티들이 모이고 모여 이루어진다.

  • 튜플

쉽게 말하면 모든 형태의 데이터가 모여 있는 하나의 데이터 집합이라 볼 수 있다.

위 table에서 번호/이름/주소/전화번호/취미의 column으로 구성되어있는 각각의 data 들을 tuple이라 한다.

  • key

후보키 : 튜플을 유일하게 식별할 수 있는 속성들, 기본키가 될 수 있는 키
기본키 : 특정 튜플을 유일하게 구별할 수 있는 속성
대체키 : 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키들(=보조키)
※ 데이터 수정 등으로 기본키가 소멸되었을때 대체키를 기본키로 활용한다.
슈퍼키 : 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키, 유일성은 만족하지만, 최소성은 만족시키지 못한다
외래키 : 참조되는 릴레이션의 기본키와 대응되어 사용되는 키, 릴레이션 간에 참조 관계를 표현한다

  • 인덱싱

→ 성능 이점
행에 대한 직접 접근점을 제공한다.
테이블 행 유일성 및 무결성을 보장한다(table 내에서 식별자이기도 하다).

→ 단점
검색의 효율성은 높지만 인덱스 설정 시 Column의 삽입/삭제/변경의 효율성은 저하되므로, 인덱스 생성이 필요할 경우 모든 행에 대해 인덱스 공간을 마련해야 한다.
이로 인한 데이터 변경에 따른 추가적인 시간이 소요되며, 인덱싱이 다시 이루어질 경우 재편성이 요구됩니다.

→ 주의 사항
데이터가 적을 떄 사용하면 오히려 DBMS 성능을 저하시킬 수 있다.
데이터 값이 변경이 많을 경우, 인덱스 특성상 성능이 저하될 수 있다(인덱스와 별개로 Column 편성시 변동이 많은 데이터에 대한 Column을 맨 앞에 배치하는게 좋고, 변동성이 동일하다면 자주 접근하는 Column을 맨 앞에 배치하는게 좋다.)

→ Primary key와 인덱스의 관계
Primary key 설정 후 table 내 일부 Column만 참조하면서(데이터 변동가능성 ↓), Primary key가 선두 Column일때 인덱스 사용을 권장한다.

  • Hash(scrypt)

→ 성능 이점
Query를 활용하는 탐색에 비해 자유도가 높고, 관리도 효과적이다.
key를 사용하여 단 한번의 DB I/O 요구로 조회가 가능하다.

→ 단점
행이 하나이거나 적은 수인 테이블(look-up table)일 경우 접근이 원활하다.
행이 많거나 범위로 검색하는 경우 성능이 매우 떨어진다(Data 1개에 대해 접근하여 CRUD를 하는 경우에만 권장).

→ 주의 사항
데이터 충돌을 최소화하기 위해 반드시 유일한 key값을 설정해야 한다(key값의 유일성이 보장되어야 데이터 조회 및 CRUD가 원활히 진행이 가능).
소수의 Data에 대한 CRUD를 하는데 활용하며, 변동이 많은 table에서 활용해야 효과를 볼 수 있다.

0. why

  • 데이터모델링, 데이터를 다루기 위해 기본적으로 알아야할 개념들을 이해한다.

1. what

  • DB를 다루기 위해 어떤 개념들을 알아야 하는지 파악한다.
  • Data를 다루기 위해 어떤 기능을 활용하고, 어떤 개념들이 사용되는지 알아본다.

2. how

  • Data를 다루기 위해 어떤 방향으로 접근해야할지 생각해본다.
  • 상황에 맞게 어떠한 Data tool을 사용해야하는지 고민해본다.

3. 참조링크

RDB/Non-RDB
https://velog.io/@keywookim/We.TIL-40-%EA%B4%80%EA%B3%84%ED%98%95DB-vs-%EB%B9%84%EA%B4%80%EA%B3%84%ED%98%95DB
https://docs.microsoft.com/ko-kr/azure/architecture/data-guide/big-data/non-relational-data

RDB/Non-RDB 비교 table
https://www.stechies.com/differences-between-dbms-rdbms/

튜플
http://wiki.hash.kr/index.php/%ED%8A%9C%ED%94%8C

Database - key
https://hoyeonkim795.github.io/posts/%ED%82%A4-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%A2%85%EB%A5%98/

Web Dev - Quest11
https://github.com/leejiwoo2021/WebDevCurriculum/tree/master/Quest11

엔티티
https://velog.io/@gyrbs22/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%86%8D%EC%84%B1Attribute

엔티티/엔티티 간 관계비율
https://m.blog.naver.com/qbxlvnf11/221262853930

패스트캠퍼스 강의 정리 자료
https://velog.io/@gyrbs22/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC-%EA%B3%BC%EC%A0%95-%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94-%EA%B8%B0%EB%B2%95

0개의 댓글