koogawa blog

iOS、Android、foursquareに関する話題

Webナイト宮崎 で Firestore 設計の話をしてきたよ #Webナイト宮崎

f:id:koogawa:20190530131740p:plain

もう2週間ぐらい経ってしまいましたが、先日 Webナイト宮崎 というイベントで Firestore の話をしてきました!

Webナイト宮崎とは

tegehoge.connpass.com

宮崎のWeb系フリーランス集団 てげほげ が開催しているWeb系勉強会です。実は私もてげほげメンバーです!

以下、発表内容を簡単にまとめていきます。

発表内容

最初に今回話すことを整理。

Firestore におけるデータベース設計について自分が知ってる方法を話します。 この方法がベストプラクティスとは限らないので、もっと良い方法があったら教えてね!

f:id:koogawa:20190530142156p:plain

Firestore の簡単なおさらい。すでに他の発表者の方も説明されていたので、ここはサラッと流しました。

f:id:koogawa:20190530142226p:plain

今回は、とあるSNSサービスを例にDB設計について考えていきます。

f:id:koogawa:20190530142249p:plain

このSNSサービスの機能要件です。とてもシンプルです。

f:id:koogawa:20190530142305p:plain

最初にユーザー情報を格納するためのコレクションについて考えます。 今回は users というコレクションを作り、その中に「1ユーザー1ドキュメント」という感じで追加していく感じにしました。

f:id:koogawa:20190530142324p:plain

次に「ユーザーは他のユーザーをフォローすることができる」という仕様を Firestore に落とし込むときにどういう設計があるか?ということについて考えていきます。

f:id:koogawa:20190530142352p:plain

いくつか方法はあると思いますが、今回は2つの方法をピックアップしました。

1つ目は users コレクション直下に follows というサブコレクションを置く方法です。この例だと「aaaaa は bbbbb と ccccc をフォローしている」という状態になります。

f:id:koogawa:20190530142416p:plain

2つ目は root 直下に follows というフォロー情報を管理するための専用コレクションを作る方法です。この例だと「aaaaa は bbbbb をフォローしている」という状態になります。

f:id:koogawa:20190530142432p:plain

さて、ここからは機能の実装に入っていきますよ。

まずは「aaaaaさんがフォロー中のユーザーリストを表示する」機能を実装するにはどうしたら良いでしょうか。

f:id:koogawa:20190530142510p:plain

「/users 直下に置く」場合について考えましょう。 この例だと「aaaaa は bbbbb と ccccc をフォローしている」という状態になるので、ここは単純に赤枠を見れば良さそうです。

f:id:koogawa:20190530142539p:plain

次に「/root 直下に置く」場合について考えましょう。 この例だと「aaaaa は bbbbb をフォローしている」という状態なので、followee = “aaaaa” のドキュメントを抽出すれば良さそうです(赤枠内)。

f:id:koogawa:20190530142606p:plain

さて、今度は「aaaaaさんをフォローしているユーザーリスト(=つまりaaaaaさんのフォロワー)を表示する」機能を実装するにはどうしたら良いでしょうか。

f:id:koogawa:20190530142618p:plain

こちらもそれぞれのパターンについて考えていきましょう。

まずは「/users 直下に置く」場合を考えてみます。 この例だと「bbbbb は aaaaa と ccccc をフォローしている」という状態になるので、 bbbbbさんはaaaaaさんのフォロワーということになります。 よって、users コレクション内の follows サブコレクションを横断して検索しながら、サブコレクションに aaaaa を含むドキュメントを抽出すれば良さそうです。

実はこれ、最近までできませんでした。この資料を作っている最中(2019年4月)に CollectionGroup という機能がリリースされ、こういった横断的な検索も可能になりました。

f:id:koogawa:20190530142701p:plain

続いて「/root 直下に置く」場合について考えてみます。 この例だと「ccccc は aaaaa をフォローしている」という状態なので、ccccc は aaaaa のフォロワーということになります。よって、follower = “aaaaa” のドキュメントを抽出すれば良さそうです(赤枠内)。こちらは「/users 直下に置く」場合と比べるとだいぶシンプルですね。

f:id:koogawa:20190530142725p:plain

最後にまとめ。今回は「フォロー/フォロワー」のようにリレーションシップを Firestore で管理する方法として /users 直下に置く方法と /root 直下に置く例を紹介しました。

/users 直下に置く方法だとサブコレクションを横断した検索ができない、という制約がありましたが、最近できるようになりました!

どちらの方法がベターか?という点については、格納するデータの内容によっても変わってくると思いますが、個人的には直感的にわかりやすい /root 直下に置くほうが好きです。

f:id:koogawa:20190530142743p:plain

2019.6.3 追記:/root 直下に置く方法だと Collection の Write 制限で秒間に 500 人以上フォローできないことを 1amageek さんから教えていただきました!

感想

発表終了後にもたくさんの質問をいただき、割と好評だったという印象です。 Firestore は比較的新しいサービスであり、設計ノウハウなどもまだまだ不足しているなーと感じています。今後も勉強会などで積極的にアウトプットしていきたいですね!!

Webナイト宮崎、次回も参加します👍

▲てげほげmicciさんによるツイート!

発表スライド