背景
由于最近的公司的項(xiàng)目有涉及到類(lèi)似的微信朋友圈的功能, 于是最近開(kāi)始研究數(shù)據(jù)庫(kù)層面的朋友圈的設(shè)計(jì)。
思考
- 訂閱與發(fā)布
- 分享與朋友圈
- 評(píng)論
- 朋友圈的時(shí)間軸
開(kāi)始
數(shù)據(jù)庫(kù)設(shè)計(jì)
用戶(hù)表 users
id
phone
email
password
關(guān)注表 subscriptions
id
user_id
subscriber_id
朋友圈 moments
id
user_id
content
images
sharing_id
分享 sharings
id
title
thumbnail
link
評(píng)論表 replies
id
user_id
moment_id
to_user
content
業(yè)務(wù)實(shí)現(xiàn)
- 朋友圈的時(shí)間軸
根據(jù)登錄用戶(hù)查詢(xún)關(guān)注列表的 subscriber_id 的集合,根據(jù)集合使用 where in 查詢(xún)朋友圈,根據(jù)發(fā)布時(shí)間排序取分頁(yè)。
給訂閱人數(shù)增加上線(xiàn),避免 where in 數(shù)據(jù)量過(guò)大,微信的朋友上線(xiàn)為1000 - 朋友圈的發(fā)布
images 以 json 形式存儲(chǔ), {[id, path]},id 可以排序,最多是 9 張圖片,圖片不涉及到單獨(dú)查詢(xún),所以可以用 json。 - 分享
朋友圈有分享也是朋友圈發(fā)布,但是要補(bǔ)充一部分?jǐn)?shù)據(jù):分享的標(biāo)題、鏈接、縮略圖。所以添加額外 sharings 表存儲(chǔ),評(píng)論就是朋友圈的 content 主題內(nèi)容,sharing_id 就是分享具體內(nèi)容。 - 評(píng)論
記錄評(píng)論者,以及需要 @ 的人和具體內(nèi)容部分。
效率考慮
- 使用 redis(或其他緩存) 做朋友圈時(shí)間軸的緩存,但要記住用戶(hù)刪除、發(fā)布朋友圈時(shí)的更新和刪除
- 可以使用 LIST 和 HASH,LIST鍵:list:{$user_id} => [moment_id, ...],HASH鍵:hash:moment:{$id} => 朋友圈數(shù)據(jù)表一行數(shù)據(jù)
- 使用 redis 做關(guān)注表緩存
- 可以使用 LIST ,LIST 鍵:list:{$user_id} => [subscriber_id, ...]
- 使用 redis 做評(píng)論表緩存
- 可以使用 LIST 和 HASH;LIST 鍵:list:{$moment_id} => [reply_id, ...],HASH鍵:hash:reply:{$id} => 評(píng)論表一行數(shù)據(jù)