본문 바로가기

Backend/DB

[DB] 데이터베이스 개요, 관계형 DB, DB관계(1:1,1:N,N:M)

728x90
DB 공부를 시작했다.
DB의 전체적 구조와 관계에 관한 기록이다.

DB

데이터 베이스는 방대한 데이터를 효과적으로 관리할 수 있도록 만들어졌다.

데이터베이스는 미들웨어에 의해 관리되는데 DB를 관리하는 미들웨어를 데이터베이스 관리 시스템(DBMS)이라고 한다.

 

데이터베이스는 관계형 데이터베이스(RDB)와 비관계형 데이터베이스(noSQL)로 나뉜다.

종류 정의 사용 특징 DBMS
관계형
데이터베이스
데이터간 관계 정의 데이터 구조가 명확하여 변경될 여지가 없을 때

업데이트가 잦을 때
모든 데이터가 2차원 테이블 형태로 표현된다. MySQL,Oracle 등
비관계형
데이터베이스
데이터간 관계를
정의하지 않는다.
정확한 데이터 구조를
알 수 없을 때

업데이트가 적을 때
막대한 데이터를 저장할 때

RDBMS보다 덜 제한적인 일관성 모델을 이용한다.

스키마가 없어서 자유롭다.
MongoDB 등

앞으로 많이 사용할 관계형 DB에 대해 더 자세히 보자.

관계형 데이터베이스

구조

관계형 데이터베이스는 크게 3개의 범주를 정의해 볼 수 있다.

1. 테이블 : 각 리소스에 대한 정보를 가진 표이다. (엔티티가 하나의 테이블)

 

2. 스키마(DB) : 테이블들이 모여 하나의 스키마를 이룬다.

관계형 데이터베이스에서는 이 스키마 내부 테이블 간의 관계를 설정하는 것이 중요하다.

 

3. 데이터베이스 서버 : 하나 이상의 스키마(DB)를 가진 데이터베이스 서버이다.

 

관계형 데이터베이스는 테이블로 데이터를 저장하고, 각 데이터의 관계를 직관적으로 볼 수 있다.

RDBMS를 통해 액셀과 유사하게 정렬 검색과 같은 데이터 핸들링 작업을 쉽게 할 수 있다.

SQL

SQL(Structured Query Language)은 직역하면,

구조화된 DB에 데이터 핸들링에 관한 요청을 보낼 수 있는 언어이다.

 

관계형 데이터베이스에 속하는 제품들이 공통적으로 데이터 핸들링을 할 때 사용하는 언어로

표준화까지 되어있어 백엔드를 공부하기 위해서는 반드시 공부해야 한다.

 

SQL을 이용한 대표적인 관계형 데이터베이스 관리 시스템(RDBMS)이 바로 MySQL이다.

 

관계 형성

이름부터 '관계형' 데이터베이스이기 때문에 데이터 간의 관계를 지정하는 것이 가장 중요하다.

데이터 간에 가지는 관계에는 1:1, 1:N, N:M 관계가 있다.

1:1 관계

1:1로 매칭되는 관계를 말한다.

결혼과 같이 남자와 여자 모두 서로와만 매칭될 수 있다.

 

하나의 데이터에 대해 데이터가 종속되는 경우가 많아

많이 사용되지는 않는다.

 

1:N 관계

위와 같이 1:N으로 매칭되는 관계를 말한다.

 

쉬운 예로 유저와 게시물의 관계를 생각해보자.

한 유저는 많은 게시물을 생성할 수 있지만, 한 게시물은 다수의 유저를 가질 수 없다.

 

가장 많이 사용되는 관계이다.

 

N:M 관계

N:M으로 매칭되는 관계를 말한다.

 

쇼핑몰에서 유저와 상품을 생각해 보자.

한 유저는 많은 상품을 살 수 있고, 한 상품 또한 많은 유저에게 구매될 수 있다.

 

이때는 '주문'이라는 두 테이블을 관계 지을 수 있는 테이블을 생성한다.

이렇게 두 테이블의 관계를 설명하는 테이블을 JOIN 테이블이라고 한다.

 

JOIN 테이블에서 두 테이블의 관계를 설명하기 위해서는

각 테이블의 개체 id를 알아야 한다.

어떤 유저가 어떤 상품을 주문했는지 알아야 하기 때문이다.

 

이제 테이블의 key에 대해 알아보자.

Key

키는 데이터베이스에서 조건을 만족하는 튜플을 찾거나 순서대로 정렬할 때 

다른 튜플들과 구분할 수 있는 속성이다. 

 

키에는 두 가지 속성이 있다.

  1. 유일성 : 하나의 키 값으로 튜플을 유일하게 식별할 수 있다.
  2. 최소성 : 키를 구성하는 속성들 중 꼭 필요한 최소한의 속성들로만 키를 구성하는 성질

키의 종류를 보기 전에 예시 테이블을 만들어보자.

학번 주민번호 이름 성별
60190001 000101-3111111 김xx
60190002 000202-322222 최xx
60190003 000303-433333 박xx
60190004 000404-444444 이xx

후보키

튜플을 유일하게 식별하기 위해 사용되는 하나 이상의 속성(칼럼)들

모든 튜플에 대해 유일성과 최소성을 만족해야 한다.

위의 예시에서는 학번, 주민번호가 후보키가 될 수 있다.

 

기본키

후보키 중 선정된 주키

기본키는 중복된 값을 가질 수 없고, null값도 도리 수 없다.

후보키와 마찬가지로 유일성과 최소성을 만족한다.

다른 테이블의 외래키로 사용된다.

 

대체키

후보키가 둘 이상이었을 때 기본키를 제외한 나머지 후보키들

보조키라고도 불리며, 기본키를 제외한 후보키 집합을 말한다.

만약 기본키가 학번이 되었다면 주민번호가 대체키가 된다.

 

슈퍼키

한 테이블 내에 있는 속성들의 집합으로 구성된 키

모든 튜플에 대해 유일성은 만족하지만, 최소성은 만족하지 않는다.

위의 예시에서는 학번, 학번+주민번호, 학번+주민번호+이름 등으로 슈퍼키가 구성될 수 있다.

 

외래키

다른 테이블의 기본키를 참조하는 속성

N:M 관계를 설명할 때 '주문'이라는 테이블로 '상품'과 '고객'의 관계를 나타냈다.

주문이라는 테이블에서 상품과 고객의 정보를 관계 짓는 속성을 가져야 하는데

이 속성이 바로 외래키이다.(상품 id, 고객 id)

 

참조 관계를 표현하는 중요한 키이다.

테이블(Table)은 관계형 데이터베이스에서는 릴레이션이라고 불린다.
테이블의 행은 각 데이터 개체로 튜플 또는 레코드라고 불린다.
테이블의 열은 속성이라는 이름으로 불린다.

마치며

테이블 간의 관계 지정이나 키 설정에 관해서는 많은 연습이 필요할 것 같다.

또 NestJS 테이블 형성과 만든 스키마를 구현하는 것도 연습해야 한다.

지금까지 했던 프로젝트들의 스키마를 우선 짜보면서 훈련해야겠다.

 

잘못된 정보에 대한 피드백은 환영입니다.

감사합니다.

 

 

 

 

 

728x90