質問: ### 前提 twitterのようなiOSアプリを作成しており、バックエンドにFirebaseを使用しています。 ユーザーが存在し、投稿機能のある、いわゆるソーシャルアプリです。 ### 実現したいこと twitterのようなユーザーの検索機能を実装をしたいと思っています。 ### 疑問点 ユーザー検索機能を実装するに際して、Firebase上にある現状のデータ構造を修正する必要があると考えています。そこで、自分は以下に示すようなデータ構造に修正しようと思っているのですが、よりよい修正方法があるかお聞きしたいです。 まず、現状のデータ構造を示します。 ![現状のデータ構造](https://teratail.storage.googleapis.com/uploads/contributed_images/9df579deb1a72446c3c8781e68811bfe.png) `posts` ツリーはその配下に固有idをもち、その中にそれぞれの投稿情報が格納されています。 `users`ツリーはその配下に固有idをもち、その中にそれぞれのユーザー情報が格納されています。(ログイン方法はtwitter,facebook, github, mailを検討しています) 次に、現在考えているデータ構造です。 ![修正されたもの](https://teratail.storage.googleapis.com/uploads/contributed_images/88295e7ba39a70edc2bcfc4cd56b9643.png) 修正点は2点です。 1: ユーザーデータの中にuserIDを格納するようにする。(ログイン時にユーザーに決めてもらう。重複がないかチェックし、固有の値とする。) 2:`userIDs`ツリーを作成し、`ユーザーのID:ユーザー情報をもつツリーのキー` という情報を格納する。 検索時には`userIDs`の中を検索し、該当するユーザーIDがあればそのユーザー情報を表示しようと思っています。(部分検索(tを入力するとtを含むユーザーID一覧が表示される)ができれば良いが、現状そのようなAPIはなさそうなので、検索結果としては、完全一致の1件のみか検索結果なし、の2 パターンを考えています。) 以上のような仕様を検討しているのですが、より良い解決策がありましたら、ぜひ教えていただきたいです。
回答: 少なくとも2つは策があります. 一つ目は前方一致検索について,二つ目はそもそもdb選定について. 前者について. 並べ替えた後にフィルタリングすることで,前方一致検索ができます. 例えば"hoge"で始まるIDであれば,"hoge"から"hogf"(eの次はf)までを取得した後に,"hogf"を除けばいいでしょう. ただし課金には注意しましょう. 後者について. 現在Firebaseでは,Realtime DatabaseよりCloud Firestoreに注力しているようですので,後先のことを考えると今のうちに移行しておいても良いかもしれません. 上記のような前方一致検索にしても,Cloud Firestoreであれば並べ替え不要ですし,最後の「"hogf"を除く」作業も不要な状態で取得できます.