Skip to content

데이터베이스에서 김 서방 찾기

오늘 배워볼 개념

  1. 데이터베이스의 목적 및 종류
  2. 관계형 데이터베이스의 특징과 원하는 자원(Resource)을 찾는 방법
  3. 정규화와 비정규화

도입

서울에서 김 서방 찾기라는 속담이 있습니다. 주소도, 이름도 모르고 덮어놓고 김 서방을 찾는다는 이 속담은 찾기가 힘든 상황에서 무엇인가를 찾는다는 의미입니다.

데이터베이스도 이 속담과 마찬가지입니다. 데이터는 흔히 자원(Resource)이라 불리며 사용자가 요청하는 특정 자원을 마치 김 서방 찾듯 찾아줘야 합니다.

데이터베이스

목적

그렇다면 데이터베이스는 왜 존재할까요? 앞서 이야기한 소통을 통해서 알 수 있듯 어떤 특정한 자원을 관리하고 이를 찾아서 보여주는 데 있습니다.

원하는 자원을 찾아서 보여주는 것만큼이나 관리 또한 무척중요합니다. 예를 들어 도서관에서 책을 정리하는 방법을 한 번 생각해보겠습니다.

만약 아무런 규칙 없이 책이 정리되어 있으면 책을 찾는 사람 입장에서는 머리 아플 수밖에 없습니다. 해당 책을 운좋게 한 번에 찾을 수도 있지만 최악의 경우 찾을 때까지 모든 책장의 책들을 훑어봐야하기 때문입니다.

그래서 데이터베이스는 특정 책(자원)을 찾는 것만큼이나 책(자원)을 관리하는 것도 중요합니다.

참고

다시 데이터베이스로 돌아와서 생각해보겠습니다.

만약 <데미안>이라는 책, 다시 말해 자원이 데이터베이스에 저장되어 있다고 해봅시다. 도서관의 경우 동일한 <데미안> 책이 여러 권 존재할 수 있습니다.

하지만 데이터베이스에서 굳이 <데미안>이라는 책을 여러 권 저장할 필요가 있을까요? 한 권의 <데미안>만 저장하고 이를 빌려주면 됩니다. 데이터베이스는 도서관과 같이 소유의 개념이라기 보다는 조회하는 것에 가깝기 때문입니다.

그렇다면 중복(Duplicate)을 최소화하는 게 효율적인 데이터베이스 관리라고 생각해볼 수 있습니다. 관련해서는 맨 아래에서 다루겠습니다.

종류

데이터베이스의 종류는 많지만 크게 관계형 데이터베이스(RDB_Relational DataBase)키-밸류 스토어(KVS_Key-Value Store)가 존재합니다.

관계형 데이터베이스(RDB_Relational DataBase)

이름에서 알 수 있듯 데이터베이스에 저장되는 자원끼리 관계(Relation)를 갖습니다. 어떤 관계가 존재하는 지 뒤에서 더 자세히 알아볼 예정입니다.

현재 가장 많이 사용되고 있는 데이터베이스로 마치 엑셀처럼 테이블(Table)로 구성되어 각각의 테이블에 자원이 저장되고 정확하게는 해당 테이블끼리 관계가 형성되어 있습니다. 예를 들면 아래 이미지와 같습니다.

키-밸류 스토어(KVS_Key-Value Store)

이름에서 알 수 있듯 키(Key)와 그에 상응하는 값(Value)쌍(Pair)을 이루어 데이터베이스에 저장됩니다. 예를 들어 name이라는 키(Key)에 weekwith.me를 저장해두면 이 name을 통해서 weekwith.me에 접근할 수 있는 형태입니다.

주의

키-밸류 스토어는 관계형 데이터베이스의 한계를 극복하기 위해서 등장했습니다.

바로 이어서 데이터베이스를 다루기 쉽게 도와주는 언어에 관해서 이야기합니다. 이때 NoSQL(Not Only Structured Query Language)이라는 언어 종류가 있는데 키-밸류 스토어는 이 NoSQL과 연관되어 있는 데이터베이스입니다.

관련해서는 여기서 자세히 다루지 않겠습니다. 궁금하신 분들은 한 번 검색해봐도 좋습니다.

언어

마치 파이썬(Python), 자바(Java), 자바스크립트(JavaScript)처럼 데이터베이스를 쉽게 제어할 수 있게 도와주는 언어가 존재합니다. 바로 SQL(Structured Query Langauge)NoSQL(Not Only Structured Query Language)입니다.

쉽게 우리가 일기를 쓸 때 줄있는 공책, 줄없는 공책 등을 고민하는 건 데이터베이스의 종류를 고민하는 행위이고 또 해당 공책에 연필을 사용할지, 볼펜을 사용할지 고민하는 건 데이터베이스 관리를 위해 설계된 언어를 고민하는 것입니다.

SQL(Structured Query Language)

SQL(Structured Query Language)은 관계형 데이터베이스를 조작합니다. 대표적인 예시로는 MySQL, PostgreSQL 등이 있습니다.

NoSQL(Not Only Structured Query Language)

NoSQL(Not Only Structured Query Language)은 키-밸류 스토어를 조작합니다. 대표적인 예시로는 MongoDB, DynamoDB 등이 있습니다.

정리해보면 다음과 같습니다.

마치 서울에서 김 서방 찾기처럼 데이터베이스 또한 어떤 특정 데이터, 다시 말해 자원(Resource)을 찾는 행위입니다.

자원을 찾기 위해서는 해당 자원을 저장하는 행위도 필요합니다. 이를 확장해서 생각해보면 자원을 저장하고 관리하는 것도 중요합니다.

결국 자원을 저장, 관리, 조회하기 위해 예를 들어 관계형 데이터베이스와 같은 데이터베이스 종류를 선택하고 MySQL과 같은 종류에 알맞은 언어를 선택해야 합니다.

관계형 데이터베이스

관계의 종류

앞서 관계형 데이터베이스에 관해 설명할 때 테이블(Table)끼리 관계(Relation)를 갖는다고 말했습니다. 그 관계는 크게 세 종류가 있습니다. 각 관계에 관해서 간단하게만 설명해보겠습니다.

주의

관계를 갖을 때 중요한 개념이 바로 키(Key)입니다. 키는 키-밸류 스토어(KVS_Key-Value Store) 때 한 번 들어본 단어입니다.

아래 관계를 이미지로 볼 때 No라는 열(Column)이 계속 등장하는데 해당 예를 들어 사용자라는 테이블에 1이라는 No를 가진 김 서방이 있을 경우 다른 테이블에서 이 1김 서방 대신하여 사용할 수 있게 됩니다.

우리가 회원가입을 할 때 단순히 이름 또는 닉네임만 기입하지는 않습니다. 전화번호, 이메일 등 여러 정보를 함께 기입하게 되는데 이 모든 게 고유한 번호와 함께 열에 알맞게, 새로운 행(Row)으로 추가됩니다.

결국 관계를 통해서 다른 데이터를 가져올 때 모든 데이터를 한 번에 가져다가 사용하는 건 비효율적이기 때문에 이 고유한 번호, 여기서는 No를 사용하게 됩니다.

이 번호의 종류에는 크게 PK(Primary Key)FK(Foreign Key)가 있는데 PK고유성을 나타내기 위해 존재하고 FK관계를 나타내기 위해 존재한다고 생각하면 편합니다.

더 자세한 설명에 대해서는 나열된 키워드를 검색하여 알아보시길 추천합니다.

일대일(One-to-One)

하나의 테이블이 다른 테이블 한 개와 연결되어 있는 관계입니다. 예를 들어 한 명의 사용자가 하나의 휴대폰만 등록하는 경우입니다.

일대다(One-to-Many)

하나의 테이블이 다른 여러 테이블과 연결되어 있는 관계입니다. 예를 들어 한 명의 사용자가 여러 게시글을 작성할 수 있는 경우입니다.

다대다(Many-to-Many)

다수의 테이블이 다른 다수의 테이블과 연결되어 있는 경우입니다. 예를 들어 한 명의 저자가 여러 책을 쓸 수 있는데, 해당 책에도 여러 저자가 존재하는 경우입니다.

조금 어려우니 풀어서 한 번 설명해볼까요? 아래 이미지를 한 번 살펴보겠습니다. <제12회 젊은작가상 수상작품집(2021)>이라는 책입니다.

보시면 알겠지만 전하영, 김멜라, 김지연 등 여러 작가의 글이 하나의 책에 실려있는 걸 알 수 있습니다. 그렇다면 책 입장에서는 여러 명의 작가를 갖고 있습니다. 그렇다면 반대로 작가의 경우 어떨까요?

김멜라 작가의 경우 아래 이미지와 같이 <이효석문학상 수상작품집 2021>에도 글이 실린 걸 확인할 수 있습니다.

결국 책 한 권은 여러 명의 저자를 가질 수 있고, 반대로 한 명의 저자도 여러 책을 쓸 수 있게 됩니다.

정보

테이블 간의 관계를 설명하기 위해 그린 다이어그램을 ERD(Entity Relationship Model)라 합니다.

특징

앞서 데이터베이스의 관계에 대해 알아본 것처럼 결국 관계형 데이터베이스에서는 테이블 간의 관계 구조가 중요하기 때문에 처음 설계가 무척 중요합니다. 이때 설계를 위해 따르는 일종의 규칙 같은 게 존재합니다.

많은 규칙과 모범 사례(Best Practice)가 존재하지만 이번에는 데이터베이스에 저장된 자원의 중복에 관한 부분만 한 번 살펴보고자 합니다.

정규화(Nomarlization)

데이터베이스에 저장된 자원의 중복을 최소화하는 걸 정규화(Nomarlization)라 합니다. 예시로 앞서 한 번 살펴봤던 테이블을 한 번 더 보겠습니다.

해당 테이블을 볼 경우 이나 지역에서 중복되는 자원이 보입니다. 이를 최소화하면 아래와 같은 관계로 다시 만들어볼 수 있습니다.

이처럼 테이블 내의 자원의 중복을 최소화하여 구조를 설계하는 걸 정규화라고 합니다.

비정규화(Denomarlization)

그런데 해당 테이블의 경우 사실 지역 뿐만 아니라 이름도 중복됩니다. 예를 들어 배우 강동원씨와 이름이 동일한 트로트 가수 장동원씨가 존재하며, 또 장동원씨와 이 같은 배우 장동건씨도 존재합니다.

그렇다면 앞서 다대다(Many-to-Many) 관계처럼, 한 명의 저자가 여러 책을 쓸 수 있고 하나의 책에 여러 명의 저자가 있을 수 있는 것처럼 이름의 관계도 다대다 관계로 만들어야 할까요?

데이터베이스는 최종적으로 자원을 사용자가 조회하는 데 있습니다. 따라서 너무 많은 관계를 가질 경우 찾는데 오히려 시간이 더 걸릴 수 있습니다. 예를 들어서 단순히 트로트 가수 장동원씨의 정보를 찾고싶을 때 장동원 이름을 검색하여 정보를 얻어오면 되는데 동원이 나뉘어있어 오히려 시간이 더 걸리게 되는 것입니다.

이처럼 적절하게 중복을 오히려 용인하여 활용하는 경우를 비정규화(Denomarlization)라 합니다. 핵심은 앞서 모범 사례(Best Practice)가 존재하는 것처럼 정답보다는 상황에 맞추어 효율적인 설계를 할 줄 알아야 한다는 것입니다.

결론

오늘 배운 개념을 정리하면 아래와 같습니다.

  • 데이터베이스
    • 데이터베이스의 목적
    • 데이터베이스의 종류 (RDB, KVS)
    • 데이터베이스 관리를 위한 언어 (SQL, NoSQL)
  • 관계형 데이터베이스
    • 관계의 종류 (1:1, 1:N, M:N)
    • 특징 (정규화와 비정규화)

결국 어떤 자원을 저장하여 관리할 때 결국 해당 자원을 효율적으로 사용하기 위해 개발자들은 어떤 종류의 데이터베이스에 해당 자원을 저장할 지, 그리고 저장할 때 과연 어떠한 방식으로 저장해야 효율적으로 사용할 지 고민하게 됩니다.

더 자세히는 관계형 데이터베이스, 키-밸류 스토어와 같은 종류에 대한 고민과 해당 종류에 따른 MySQL, MongoDB와 같은 언어, 그리고 만약 관계형 데이터베이스를 선택했다면 다대다 관계와 같은 관계 설계 방법과 정규화 또는 비정규화 같은 자원의 중복 최소화를 고민하게 됩니다.