- Firestore에는 데이터를 다큐먼트의 필드로 저장할 수도 있고, 서브콜렉션으로 나눌 수도 있다.
- 하지만 다큐먼트 안에 있는 필드에도 다양한 선택지가 있다.
- 필드에는 딕셔너리처럼 생긴 ‘맵’, 그리고 배열을 넣을 수 있다.
- 서브 컬렉션과 맵, 배열은 언제 써야 적절하고 둘의 차이는 무엇일까?
Firestore 데이터 구조 결정하기 위해 알아야할 규칙
다큐먼트는 1MB 용량 제한이 있다.
- 고화질 이미지가 아니라면 사실 충분한 용량이긴 하다.
- 소설책 ‘두 도시 이야기’의 전체 텍스트는 700KB
다큐먼트는 2만개 이하의 필드만 가질 수 있다.
- 여기서 필드의 갯수는 맵 안에 들어있는 하위 필드도 모두 포함한다.
- 제한 이유는 Firebase는 모든 필드에 대해서 인덱스를 만들기 때문이다. (이 인덱스는 정렬되어서 쿼리 시에 빠르게 원하는 다큐먼트를 찾는데 쓰인다.)
- 필드가 2만 개 이하라도, 필드가 많으면 많을수록 다큐먼트를 추가하고 업데이트하는 쿼리의 성능은 떨어진다.
- 왜냐하면 Firestore가 매번 필드가 변경될 때마다 인덱스를 각 필드에 대해서 모두 만들어야하기 때문이다.
하나의 다큐먼트에는 한번에 하나씩만 변경을 할 수 있다.
- 여러개의 클라이언트가 동시에 같은 다큐먼트의 데이터를 변경할 수 없다.
- 일부는 실패하고, 물론 클라이언트에 재시도 메커니즘이 대게 있지만 어쨌든 고려해야 한다.