본문 바로가기
Ionic & Angular & Firebase

[Firebase] Firestore DB 설계시 참고할 내용, 팁

by 오늘의개발부 2020. 1. 15.
반응형

 

Firestore는 기본적으로 NoSql구조이다.

Collection <- Document  <- Data

(Table <- PrimaryKey <- data)

Firebase 공식문서를 읽으며 관련 내용을 정리해본다.

 

Cloud Firestore 데이터 모델 (https://firebase.google.com/docs/firestore/data-model?hl=ko)

- Cloud Firestore는 스키마를 사용하지 않으므로 같은 컬렉션에 포함된 여러 문서가 서로 다른 필드를 포함할 수 있고, 이러한 필드에 서로 다른 유형의 데이터를 저장할 수도 있지만, 문서를 보다 쉽게 쿼리할 수 있도록 여러 문서에서 동일한 필드와 데이터 유형을 사용하는 것이 좋다.

- Cloud Firestore의 문서는 가벼워야 하므로 문서에 데이터가 많아지면 안된다. 

하위콜렉션을 사용하면 간단하게 Rooms(Collection) - RoomA(Document) - Messages(Collection) - Message(Data) 구성할 수 있다.

- 하위 컬렉션이 있는 문서를 삭제해도 하위 컬렉션은 삭제되지 않는다. 상위 문서를 삭제할 때 하위 컬렉션의 문서도 삭제하려면 이 문서를 참고할 것

컬렉션 및 하위 컬렉션 삭제(https://firebase.google.com/docs/firestore/solutions/delete-collections?hl=ko)

 

 

데이터 구조 선택(https://firebase.google.com/docs/firestore/manage-data/structure-data?hl=ko)

- 하위콜렉션을 사용하면 간단하게 Rooms(Collection) - RoomA(Document) - Messages(Collection) - Message(Data) 구성할 수 있다.

크게 3가지 데이터 구조를 선택할 수 있다.

1. 문서의 중첩데이터 : Array나 맵 등을 문서에 저장한다. 쉽다. 문서가 무거워진다. 활용예시) 최근 입장한 3개의 카톡방

2. 하위컬렉션 : 목록이 커져도 상위 문서의 크기는 그대로임. 또한 하위 컬렉션에 모든 쿼리 기능을 사용할 수 있다. 하위 컬렉션 삭제가 간단하지 않다.

3. 루트수준컬렉션 : 최대한의 유연성과 확장성을 발휘하며 쿼리 기능을 사용할 수 있다. 본질적인 계층구조를 갖는 데이터를 가져오기가 점점 복잡해진다.

 

 

배열, 목록, 집합 다루기(https://firebase.google.com/docs/firestore/solutions/arrays?hl=ko)

- Firestore는 배열을 저장할 수 있지만 배열의 멤버를 쿼리하거나 단일 배열 요소를 업데이트하는 기능은 지원하지 않는다

- 검색(Search)을 위해서는 Map으로 저장해야한다.

- 정렬(Order)을 위해서는 정렬하고자하는 기준을 Index에 추가해야한다.

 db.collection('posts')
    .where('categories.cats', '>', 0)
    .orderBy('categories.cats');test.solution-arrays.js)

 

 

 

추가팁)

- 데이터 생성시 set 혹은 runTransactions 을 사용할 수 있음. set은 일반적인 데이터 입력 방식이다. 다중 클라이언트로부터 들어오는 정보에 대해 중복입력이 발생할 수 있다. runTransactions는 트랜젝션 입력이라고 볼 수 있다. runTransactions 가 더 안전한 방법 아닐까?

- DocumentId를 지정하지 않으면 Id를 자동으로 DocumentName으로 사용한다. PrimaryKey역할을 하므로 설계에 따라 조정할 수 있다.

 

 

 

반응형