Firestore purchasesはtopレベルのコレクションにするかusersの配下か
purchasesが一番上のコレクションの場合
DocumentId=orderIdにできる
サーバ通知(pubsub or iosはonRequest)でFunctionsにアクセスがあった場合は、UIDで判別はできないのでこのやり方が便利
ドキュメントにUIDを持つ必要がある
アプリで有料コンテンツにアクセスできるかどうかをwhereで判別する
db.collection("purchases").where('uid' , "==", uid);
セキュリティルールも追加する
users配下の場合
サーバ通知の場合はcollectionGroupでpurchasesを検索
db.collectionGroup("purchases").where('orderId' , "==", orderId);
セキュリティルールとcollectionGroupは別でインデックスを追加する必要がある。 そして、インデックスにはお金がかかる
有料コンテンツ判定
ログインしてればuidは取得できてるので
db.collection("users").doc(uid).collection("purchases");
結論
インデックスの分だけ後者が不利
番外編 usersドキュメントにpurchasesをmapで持つ
- purchasesが不要な場面でも取得される
- classとか型を作らずにmapでそのままアクセスするメンバー(エンジニア)が出てきそう
- フィールドに対するセキュリティルールは少し面倒だったはず
https://firebase.google.com/docs/firestore/manage-data/structure-data
上記も読み直してみたが、mapのメリットが見当たらない。。。