💡

Firebase で SNS のタイムラインを実装する

2024/05/07に公開

Firebase はクエリが弱いから SNS のタイムラインは出来ないよねぇ〜
ってずっと言われていたと思いますが

僕は常々、SNSっぽいアプリを作るので
よく考えていました。

その結果、さっき思い付いたので
備忘録として残しておきマウス

コレクション

先にどんなコレクションを使えば実装できるのかを記載します。
登場するのはこの4つ

コレクション
users
followers
posts
post_timelines

ドキュメントフィールド

次にそれぞれのドキュメントフィールドですね

users
userId: string(ドキュメントID)
followerIds: []

① userId: string
ユーザー1人1人に付けられる一意のIDを意味します。
尚、ドキュメントIDでもあります。

② followerIds: []
後から出る followers の一意のIDをリストとして持つことを想定します。

followers
followerId: string
userId: string
followerIds: []

① followerId: string
ドキュメントIDです。

② userId: string
user のドキュメントIDです

③ followerIds: []
フォローされたユーザーのIDをリストとして保有します

posts
postId: string
postTimelineIds: []

① postId: string
投稿の一意のIDです

② postTimelineIds: []
後から出る post_timelines の一意のIDを複数格納します

post_timelines
postTimelineId: string
postId: string
followerIds: []

① postTimelineId: string
一意のIDです

② postId: string
posts の一意のIDです

③ followerIds: string
自分をフォローしている人らのIdsです

クエリ

コレクションとドキュメントフィールドは分かった。
あとはどうやってクエリをしてタイムライン上で取得するのかですが

まず post_timelines から
自分の userId を含むドキュメントを日付順で複数取得します

dart
db
    .collection('time_lines')
    .where('followingUserIds', arrayContains: 'userId')
    .orderBy('createdAt', descending: true)
    .get();

取得したら postId を使って post 情報を取得すると完了

じゃあ、あとはどうやってフォロワーを管理するのかですが
お相手さんがフォローしてきたタイミングで followers にブッ込めば良いです

ドキュメントの枠内は1mibまで

実は Firebase のドキュメントに入れられるのは
1mibまでなのでだいたい1万リスト以上入れたらダメな気がしています。

なので100万フォロワーでも耐えられるように
followers を複数作るようにすると良いですね

仮に100万フォロワーさんが投稿すると仮定すると
100ドキュメントが作成されますが全然許容範囲内ですね!

Discussion