質問: 現在DBはFirestoreを使って、iosでTinderライクなマッチングアプリを作ろうとしています。 マッチングアプリなので、一度表示した相手は、一定期間もしくは全他ユーザーを表示しきるまでは、再び表示されないようにしたいのですが、そのための効果的なDB設計がわかりません。 現状のDBとしては、 Usersコレクションがあり、その中に各ユーザーを示すドキュメントがあるという状態です。 そして、今は単純にそのコレクションから普通にユーザーを取ってきて表示しているので、一度表示した相手も再び表示されます。 今の所考えている方法としては、以下の二つです。 1 TimeStampコレクションを作って、ユーザーが他ユーザーをスワイプする度に、 TimeStamp/ユーザーUID/OtherUsers/他ユーザーUIDのfieldに["matched":Bool], ["lastShowed": その時の時刻]を書き込んでいく。 そして、相手を表示するときには、一度Usersコレクションからドキュメントを取得し、その各UIDでTimeStamp/ユーザーUID/OtherUsers/そのUIDのドキュメントで、matched==falseかつlastShowedと現在時刻が一定期間経過してるかを、判定して、それが大丈夫なら、表示する。大丈夫でないなら表示しない。 2 各ユーザーのドキュメントに新たにOtherUsersのコレクションをつくる。 新たなユーザーが登録する度に、全ユーザーのOtherUsersコレクションに、新たなユーザーUIDのドキュメントを作り、そのフィールドに["matched":Bool], ["lastShowed": その時の時刻]を書き込んでいく。 相手を表示する時は、Users/ユーザーUID/OtherUsersコレクションから、matched==falseかつlastShowedと現在時刻が一定期間経過してるの条件でクエリをかけて表示する。 いずれにしてもあまり効率的でないと思うので、もっと良い方法をご教授いただければと思います。 また、必ずしもFirestoreでなくてもよいので、他のDBでも一度表示した相手を一定期間表示しないことができる設計を教えていただけたらと思います。 よろしくお願いします。
回答: 単純に、データーベースへのアクセス回数が少なくなるようにというのは、毎回データーベースから抽出、更新するのではなく、DBと表示の間に未表示者リストをメモリーの上に作成し、それを介する様にすれば、(例えば次の人を表示するタイミングで)未表示者が残り何人になったらデータベースへアクセスし、未表示者を更新するようなバッファリングで対応出来るのではないでしょうか。 同様に、何人の人をチェックしおわった(質問者さんの表現を使うとスワイプした)タイミングで、チェックした人のIDとタイムスタンプを配列に保存しておき、こちらも同様に特定件数の既読が溜まったらデーターベースへ書き込む様にすればデータベースへの書き込み回数も抑えられます。 この点を踏まえて、1、2、いや、それならもっと上手いこと出来そうだぞ。と考えて見られるのがよろしいかと思います。 答えになっているようななっていないような、あやふやな回答で申し訳ありませんが、考察の一助となれば幸いです