본문 바로가기

Technology/인프라

[데이터베이스] NoSQL과 RDBMS중 적합한 DB 선택하기(feat.인스타그램DB)

 

 

 

 

서비스의 특성에 따라 NoSQL과 RDBMS을 선택하는 것이 매우 중요하다. DEV.TO에 비슷한 고민의 질문이 있었으며 간단히 정리하자면 아래와 같다.

 
질문:

"영화 시상식에서 노미네이트 된 영화를 기반으로 영화 추천 서비스를 만들고 있으며 API를 통해 TMDB ID, 제목, 년도, 포스터와 같은 기본적인 영화 정보를 검색해야 하기 때문에 해당 정보를 저장할 영화 DB가 필요합니다. 또한 카테고리, 노미네이트, 수상작들과 같은 정보가 담긴 시상 DB가 필요할 것 같습니다. 지금까지는 간단하게 SQLite를 사용하고 있었으나 본 영화 목록, 보고 싶은 목록들의 기능을 넣어서 버전 2.0 개발할 예정인데 과연 NoSQL이 적합할지 궁금합니다!"

 

어떻게 보면 매우 간단한 질문이지만 실제 서비스 경험이 있지 않다면 무엇을 골라서 어떻게 쓸지 결정하는 것은 생각보다 쉽지가 않다. 왠지 NoSQL을 쓰면 테키(techy) 할 것 같아서 NoSQL를 쓰고 싶은 사람도 있을 것이다.

 

간단히 답변에 나온 것과 그 내용에 대해서 간단히 설명하려고 한다. 우선 Dian Fay가 단 베스트 답변은 아래와 같다.

 
베스트 답변:

만약 서비스 구성하는데 비관계형 데이터베이스를 써야 하는 이유를 정확하게 알지 못하면 관계형 데이터베이스를 사용하는 것을 일단 추천합니다. 그리고 기존에 하나인 데이터베이스에서 영화 데이터와 시상 데이터를 찢어서 사용한다고 하면 분명히 두 테이블관 관계가 있는 것으로 보입니다. 만약에 관계형 데이터 형태인데 무리하게 NoSQL를 사용하려고 하면 분명히 나중에 후회를 할 것입니다. 만약에 특정 데이터, 예를 들어 보고 싶은 목록 리스트를 문서 형태로 만든다면(사실 이것도 영화와 사용자 정보 간에 관계가 있기 때문에 굳이 사용할 필요가...) PostgreSQL의 JSON형태로 저장하는 기능 활용하면 관계형과 비 관계형을 함께 효율적으로 사용할 수 있을 것 같네요.

 

답변에서도 명시 되어 있지만 데이터에 관계가 있는 경우에는 MySQL, MariaDB, SQLite와 같은 RDBMS(관계형 데이터베이스)를 사용하는 것이 보다 바람직하다. 관계형 데이터베이스는 사전 정의된 관계가 있는 데이터 항목 모음의 구성이고 이들 항목은 열과 행으로 이루어진 테이블 집합으로 구성이 된다. 

 

반면에 NoSQL은 비정형 데이터로 관계를 알기 어려운 구조와 상관없이 데이터를 저장하고 유연한 데이터 모델을 제공하며 JSON 스타일의 문서 지향적 스토리지 시스템에 대한 지원을 한다. 대표적인 NoSQL로는 MongoDB가 있다.

 

 

특히 댓글에서도 설명한 PostgreSQL은 관계형 데이터베이스를 기본으로 하면서 PostgreSQL 9.2 이상 부터는 네이티브 JSON 형태로 적재도 할 수 있도록 지원 하고 있다.

 

예를 들면, users 테이블은 사용자를 식별하는 userid를 기본 키로 가지고 watchlist 컬럼을 JSON형태로 활용 할 수 있다.

CREATE TABLE users (
   USERID serial NOT NULL PRIMARY KEY,
   watchlist json NOT NULL
)

 

 

 

 

 

 

 

그리고 JSON형태로 데이터를 저장하기 위해 아래처럼 INSERT 구문을 만들 할 수 있다.

INSERT INTO users (watchlist)
VALUES
   (
      '{ "name": "parasite", "items": {"producer": "Bong", "score": 5, "country": "south korea"}}'
   );

 

 

 

 

 

 

 

또한, 검색 쿼리를 작성 해보자면 아래와 같다.

SELECT
   watchlist
FROM
   users;

 

 

 

 

 

 

 

그리고 WHERE절을 넣어서 검색을 하고자 하면 아래와 같다.

SELECT
   watchlist ->> 'name' AS name
FROM
   users
WHERE
   watchlist -> 'items' ->> 'country' = 'south korea'

 

 

 

 

 

 

SELECT
   watchlist ->> 'name' AS name
FROM
   users
WHERE
   CAST (
      watchlist -> 'items' ->> 'score' AS INTEGER
   ) >= 5

 

이렇게 PostgreSQL은 NoSQL과 관계형 데이터베이스 특성을 함께 사용할 수가 있다 보니 수많은 회사에서 사용하고 있으며 대표적으로는 인스타그램이 PostgreSQL와 Cassandra를 쓰고 있는 것으로 유명하다.

 

 

 

 

 특히 댓글에 대한 부분을 PostgreSQL로 처리 하는 것으로 알려져 있다. 댓글 자체가 정형화 할 수 없는 데이터라고 볼수 있기때문에 사진ID를 식별자로 하고 comment 자체를 JSON 형태로 저장 하는 것으로 보여진다.

결론

본문에서 PostgreSQL에 대한 이야기를 신나게(?) 하였지만, 데이터베이스를 결정하는데 주요한 키는 첫째로 본인의 서비스의 데이터 구조 혹은 관계에 대해서 명확하게 파악하는 것이다. 둘째로 서비스 주요 기능에 대해서 다시 한번 정리를 해보고 그 기능을 구조상으로 최대한 지원하는 데이터베이스를 선택하는 것이 바람직 하다. 물론 서비스를 구축하고 끝나는것이 아니라 지속적으로 운영도 해야 하고 데이터베이스는 서비스에 가장 크루셜한 부분이므로 운영 관점에서도 기술적인 허들이 없을지 사전에 체크리스트를 만들어서 파악할 필요가 있다.