Firebase で SNS のタイムラインを実装する
Firebase はクエリが弱いから SNS のタイムラインは出来ないよねぇ〜
ってずっと言われていたと思いますが
僕は常々、SNSっぽいアプリを作るので
よく考えていました。
その結果、さっき思い付いたので
備忘録として残しておきマウス
コレクション
先にどんなコレクションを使えば実装できるのかを記載します。
登場するのはこの4つ
users
followers
posts
post_timelines
ドキュメントフィールド
次にそれぞれのドキュメントフィールドですね
userId: string(ドキュメントID)
followerIds: []
① userId: string
ユーザー1人1人に付けられる一意のIDを意味します。
尚、ドキュメントIDでもあります。
② followerIds: []
後から出る followers の一意のIDをリストとして持つことを想定します。
followerId: string
userId: string
followerIds: []
① followerId: string
ドキュメントIDです。
② userId: string
user のドキュメントIDです
③ followerIds: []
フォローされたユーザーのIDをリストとして保有します
postId: string
postTimelineIds: []
① postId: string
投稿の一意のIDです
② postTimelineIds: []
後から出る post_timelines の一意のIDを複数格納します
postTimelineId: string
postId: string
followerIds: []
① postTimelineId: string
一意のIDです
② postId: string
posts の一意のIDです
③ followerIds: string
自分をフォローしている人らのIdsです
クエリ
コレクションとドキュメントフィールドは分かった。
あとはどうやってクエリをしてタイムライン上で取得するのかですが
まず post_timelines から
自分の userId を含むドキュメントを日付順で複数取得します
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