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のメリットが見当たらない。。。