質問: 現在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でも一度表示した相手を一定期間表示しないことができる設計を教えていただけたらと思います。 よろしくお願いします。
回答: 「表示したか」がフィルタ設定する度にリセットされていいのであれば(あるいはそもそもフィルタの機能がないなら), ユーザがフィルタ設定した時に,その人用に表示させていく順番を保存してしまうのはありです. そうすると,あとはどこまで表示したかだけ保存すれば良く,判定の必要もありません. 上記がダメであれば,1の改変で,表示する時に複数相手を取得する. そして一度に複数同士で判定して効率化,などでしょうか. ちなみに`matched`は要らないと思います(`lastShowed`の有無で代用可).