Firestore 컬렉션을 설계하는 기준과 방법

심재철
Nov 5, 2020
Firebase의 Nosql Database인 Firestore

파이어베이스에서는 Collection와 Document가 있다.

Collection이 Document를 가질수 있고 Document가 Collection을 가질 수 있다.

Collection — Document — Collection — Document …

중첩구조 100depth까지는 이런식으로 Collection과 Document가 반복될 수 있다.

파이어베이스로 작업을 하던 중, 고민거리가 생겼다.

Post(게시글)아래에 Comment(댓글)을 집어넣어야 하는데..

  1. Post Document의 comments 배열 필드로 댓글들을 넣을지
  2. Post Document의 Comments하위 컬렉션(Second Level)을 만들어서 그곳에 댓글들을 Document로 넣을지
  3. Posts Collection(탑레벨)과 Comments Collection(탑레벨)을 만들어서 거기에 모든 댓글을 관리할지

세가지 방식 중 어떤걸 선택해야 할지 판단 기준이 서지 않아 조사를 해봤다.

1번 방식(필드에 저장)을 사용하게 되면

데이터 중복이 발생하지만 nosql의 장점을 최대한 활용 할 수 있다. nosql은 조인이라는 개념이 없으며 변화가 적고 큰 하나의 데이터를 빠르게 불러올 수 있는 장점이 있다.

반면 rdbms는 각 도메인들이 서로 복잡하게 얽혀있고 업데이트가 자주 일어나면서 데이터 중복을 없애고 싶을때 효율적이다.

이렇게 nosql과 rdbms의 서로 극명한 장단점이 있는데

1번 방식은 nosql의데이터 중복과 빠른 read를 보장하는 장점을 최대한 활용한 방식이다.

2번 방식(하위 컬렉션)을 사용하게 되면

하나의 Post에 딸린 댓글들을 더 적은양의 쿼리로 검색할 수 있게 된다. 왜냐면 해당 포스트의 댓글만이 궁금하기 때문에 전체 댓글들을 조회할 필요가 없기 때문이다.

3번 방식(루트 컬렉션)을 사용하게 되면

모든 댓글들을 조회해야 하는 상황에서는 굉장히 좋은 설계이다. 서비스의 모든 댓글들이 Comments 루트 컬렉션에 모이기 때문에 그렇다. 만약 2번 방식으로 설계했었다면 서비스에 어떤 Post들이 있는지 조회한다음 각 Post들의 하위 Comments컬렉션을 전부 조회해야 모든 댓글들을 가져올 수 있을것이다.

그래서 말하고 싶은 나의 결론은,

만약 서비스에서 모든 댓글들을 조회할 것 이라면 3번 방식을 사용하는것이 좋다.

반대로 서비스에서 모든 댓글을 조회할일이 없으며 각 포스트에 해당하는 댓글들만 조회하는 경우에는 2번 방식을 사용하는것이 좋다.

데이터 중복이 발생하더라도 빠른 read속도를 보장하고 싶으면 1번 방식을 사용하는것이 좋다.

--

--