TIL | DataBase - 관계형 데이터베이스

Wook·2021년 12월 15일
0

TIL | Backend

목록 보기
7/19

📲 Database

Database에는 크게 관계형 데이터베이스(RDBMS)와 "NoSQL"로 명칭되는 비관계형(Non-relational) 데이터베이스가 있습니다.

데이터베이스는 우리가 필요한 방대한 양의 자료를 정리하는 시스템입니다. 자료를 정리하는 스타일에는 다양한 방법이 있습니다. 다양한 분류 기준이 있지만, 크게 관계형 데이터베이스와 비-관계형데이터 베이스가 있습니다. 그 가운데, 관계형 데이터베이스에 대해 알아보도록 하겠습니다.

🎱 관계형 데이터베이스


관계형 데이터베이스 (RDBMS, Relational DataBase Management System)는 이름 그대로 데이터 사이의 관계에 기초를 둔 데이터베이스 시스템을 말합니다.

📍 관계형 데이터베이스에서 모든 데이터는 2차원 테이블(table)로 표현할 수 있습니다.

아래 테이블은 제가 가지고 있는 책 목록을 저장한 데이터베이스 테이블입니다. 행(row)과 열(column)으로 구성되어 있는 2차원 테이블입니다.

  • Column (열) : 컬럼은 테이블의 각 항목 (id, 책 제목, 작가, 출판사, 가격)을 의미합니다.
  • Row (행) : 로우는 각 항목들의 실제 값입니다. 2번 행을 보면, 갈매기의 꿈, 리처드 바크, 나무옆의자, 11,520 이라는 실제 값이 있습니다.

📍 row는 저마다의 고유 키(Primary Key)가 있습니다.

테이블의 가장 첫 컬럼은 언제나 id 입니다. 엑셀이나 스프레드 시트를 떠올려보면, 제일 첫 컬럼은 언제나 변하지 않는 번호(index)가 매겨져 있는 것처럼 말이죠. 이에 따라 각 로우는 언제나 고유한 번호를 갖고 있습니다. 이를 고유 키(Primary Key)라고 합니다.

따라서 My books 테이블 가운데 개미 라는 책은 id가 4인 데이터 라고 표현할 수 있습니다.
이는 개미의 primary key가 4번임을 의미합니다.

Primary Key를 통해서 특정 로우를 찾거나, 참조(reference)할 수 있습니다. 인용에 대해서는 뒤에서 더 자세히 설명드리겠습니다.

관계형 데이터베이스는 각각의 테이블들이 서로 상호관련성 을 가지고 서로 연결되어 있습니다. 각각의 테이블들이 완전히 독립적인 대상이 아니라, 테이블 A와 테이블 B가 서로 연관되어 있고, 서로 관련이 있다는 뜻입니다.


🤞 테이블 관계의 종류

테이블간의 관계에는 3가지 종류가 있습니다. One to One, One to Many, Many to Many 한국어로는 일대일, 일대다, 다대다 관계라고 부릅니다. 관계형 데이터베이스 내부에 테이블 A와 테이블 B가 있을 때, 이 두 테이블은 무조건 세가지 가운데 한가지 관계에 해당합니다.
이 세가지만 이해한다면, 관계형 데이터베이스의 관계를 모두 이해할 수 있습니다.


One To One

아래 두 개의 테이블과 같이 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계를 one to one 관계라고 합니다.

대한민국 사람은 주민등록 번호를 오로지 단 한 개만 가질 수 있습니다. 주민등록번호를 변경하는 것은 가능하지만, 그렇다고 해서 한 사람이 두 개의 주민등록번호를 가질 수는 없죠. 한 사람은 하나의 주민등록 번호를 갖습니다.

주민등록 번호의 입장에서도 마찬가지입니다. 하나의 주민등록번호는 오로지 한 사람의 것입니다. 하나의 주민등록 번호가 두 명의 사람을 갖진 않겠죠?

하나의 A 데이터는 하나의 B 데이터와 연결됩니다.
하나의 B 데이터 또한 하나의 A 데이터와 연결됩니다.

이를 다시 말하면 다음과 같이 표현할 수 있습니다.

  • 테이블 A의 로우(row) 하나는 테이블 B의 로우(row) 하나와 연결된다. 반대로 테이블 B의 로우 하나도 테이블 A의 로우 하나와 연결된다.

이렇듯 각각의 데이터들이 서로 하나씩만 연결이 된 경우에, 해당 테이블 사이의 관계를 일대일 관계 라고 부릅니다.

Identification numbers 테이블을 보면 ididentification number 외에도 user_id 라는 컬럼이 있습니다. 이 숫자는 무엇이고, 왜 있을까요? 눈치채신 분들도 많겠 user_id 컬럼은 해당 주민등록번호가 누구의 것인지 알려주기 위하여, 해당 주민등록번호의 주인인 사람의 id를 기록해둔 컬럼입니다.

Identification numbers 테이블의 1 번 데이터는 user_id3 입니다. 이는, 1번 주민등록번호가 3번 사람, 즉 송코딩님의 데이터라는 것을 알려주는 정보가 됩니다. 즉, identification numbers 라는 테이블은 원래 아래와 같은 형태였을 것입니다.

그러나 우리에게는 users 라는 테이블이 이미 있고, 이름 데이터들을 이미 저장해뒀는데, 같은 이름들을 중복 해서 여러번 저장하면 불필요한 메모리를 사용하게 됩니다. 따라서 user 란에 이름을 직접 저장하기 보다는 user_id 를 저장해주는 것이죠.

이를 참조한다 라고 표현합니다. 아래와 같은 문장을 읽는다면, 이러한 참조 관계를 생각하시면 됩니다.

Identification numbers 테이블의 user 컬럼은 users 테이블의 id(pk)를 참조한다.

다른 테이블의 pk를 참조한 컬럼에 입려되어 있는 숫자들에도 이름이 있습니다. 이를 Foreign Key , 혹은 한국어로 외래키 라고 부릅니다. 따라서 identification numbers 테이블의 user_id 는 모두 FK 라고 부를 수 있습니다.

1:1 로 참조한 이러한 상황을 도식화 해보면 아래 그림 처럼 나타낼 수 있습니다.

이와 같은 경우에서 테이블 Users와 테이블 Indentification은 서로 일대일 관계이다. 라고 표현합니다.


One To Many

테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계를 one to many 관계라고 합니다.

아래 표를 보면 주인과, 반려 동물에게 같은 컬러로 표시를 해두었습니다. 김코드님은 두 마리의 반려동물을 기르고 있네요, 따라서 pets 테이블의 냥돌이와 스위티 데이터에서 user_id 컬럼을 확인해보면, 1 로, users 테이블의 김코드님의 Primary Key를 값으로 가지고 있습니다. 비슷한 방으로 pets 테이블을 확인해보면 마요, 네즈, 웅웅이의 주인은 uesrs 3번 송코딩님이며, 동산이의 주인은 users 2번 유개발님, 마지막으로 동글이의 주인은 users 4번 이디비님이라는 것을 알 수 있습니다.


이렇게, 한 테이블의 로우 하나가 다른 테이블의 여러 로우와 연결되는 경우를 One To Many 관계 혹은 일대다 관계라고 부릅니다. 하나의 로우에 해당하는 테이블이 One이고, 여러 로우에 해당하는 테이블이 Many입니다. 여기서는 users 테이블이 one, pets 테이블이 many가 되겠네요

One To Many 관계는 1:N 이라고도 표현하고, 아래와 같이 도식화 할 수 있습니다.
(pets 테이블의 user 컬럼은 users 테이블의 id(pk)를 참조한다.)


Many To Many

테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결이 되는 관계를 many to many 라고 합니다.


이렇게 두 테이블이 서로 각자 다른 테이블의 여러 데이터와 연결 될 때에는 두 테이블에 속한 데이터의 조합을 입력하기 위한 중간 테이블 이 하나 생성됩니다. Many To Many 관계는 N:N 이라고 표현하기도 하며, 도식화하면 아래와 같습니다.

이와 같은 경우에서 테이블 authors와 테이블 books는 서로 다대다 관계이다. 라고 표현합니다.


정리

  • 데이터베이스 가운데 관계형 데이터베이스는 모든 데이터를 2차원 테이블에 저장합니다.
  • 테이블에 저장된 데이터들의 관계에 따라 one-to-one, one-to-many, many-to-many가지로 타입이 분류됩니다.
  • one-to-one : A 테이블의 한 데이터는 B 테이블의 데이터 하나와만 연결됩니다.
  • one-to-many : A 테이블의 데이터가 B 테이블의 여러 데이터와 연결될 수 있습니다.
  • many-to-many : A 테이블과 B 테이블 모두 서로 여러 데이터와 연결될 수 있습니다.
profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.

0개의 댓글