1分で理解!Firestoreのサブコレクション


*この記事ではJavaScriptで書いていきます。

NoSQLについてはこちらの記事へ↓
https://qiita.com/Yu-kiFujiwara/items/c1c52495fd321373c544

そもそもfirestoreってどういう形で保存するん?

firestoreはNoSQLの中でもドキュメント型と言われ、JSON形式のまま保存することができます。
firestoreではコレクション、ドキュメント、フィールド、データという4つの情報、
Key-Valueペアで構成されるデータを持つフィールド、フィールドを複数持つドキュメント、ドキュメントをまとめたコレクションという形でデータが構成されており、スキーマを決める必要がないため、自由にデータを保存することができます。

//書き込み
firebase.firestore().collection("auther").set({name: "太郎", age: 20})

//読み込み
firebase.firestore().collection("auther").where("name", "===", "太郎").where("age", "===", 20)

//更新
firebase.firestore().collection("auther").doc(1).update({age: 21})

サブコレクションってなんなん?

また、firebaseにはサブコレクションという考え方もあり、
1つのコレクションにリレーションを組むような形でコレクションを持たせることができます。
DB構成は下記の通りです。

autherコレクションがpostコレクションを保有するという、
より現実に近いような形でDBを構成することができます。

//書き込み
firebase.firestore().collection("auther").doc(1).collection("post").set({text: こんにちは})

//読み取り
firebase.firestore().collection("auther").doc(1).collection("post").where("text", "===", "こんにちは")

//更新
firebase.firestore().collection("auther").doc(1).collection("post").doc(1).update({text: こんばんは})

どう設計すべきか

・リレーションを組んでおらず、joinリクエストができないので一度にデータを取得できるようにデータを持つ
・データを重複して持つことを許容する
・データを更新する場合は重複したデータに対してそれぞれ更新リクエストをかける

RDBではNGとされている、これらのデータの持たせ方、更新の仕方が推奨されています。

参照