Feed 流設計(一):如何對多型內容進行抽象?
Facebook 是社交領域的標杆產品,也是一個不存在的網站。登入 Facebook,使用者可以看到「好友分享了哪些內容」,「對哪些事情點了贊」,「分享了哪些書」等等。使用者可以不斷的往下滑動,只要使用者想看,就沒有底,沒有盡頭,這種產品互動的方式叫 「Feed 流設計」。
Feed 的意思是「餵養」,把資訊比作飼料,把使用者比作動物。如果它想吃,就可以源源不斷的刷下去,把時間耗費在裡面。微信朋友圈,微博,Facebook,Linked,花瓣都是「Feed流」設計。
Feed流中常見的內容有哪些呢?
- Ryan 分享一本書《21世界的管理挑戰》
- Ryan 上傳了一個視訊「帶兒子去吃烤鴨」
- Ryan 釋出了狀態「我今天感覺不錯」
- Ryan 分享了一張圖片「帶兒子在上海交大遛彎」
SAP 企業級應用 Jam 的首頁也是採用 Feed 流設計,它包含了一些針對企業市場更復雜的事件。
- 公司釋出了公司公告。
- 小組管理員發表了群公告。
- 同事 Tony 建立/更新/刪除/評論了文件。
- 同事 Sam 建立了一個公開活動的日曆
針對 Feed 流設計,在產品開發時該如何建模?
- 被抽象內容多型,要考慮未來的擴充套件性。
- Feed 流中出現的內容不是資源的當前狀態的展現,而是對狀態轉換(Transition of state)的展示。
在以下部分,我會探討一種基於事件的建模方案。這種方案經歷了擁有1000+萬用戶的企業產品的測試,在現實世界中是真實有效的。
Martin Fowler 在 ofollow,noindex" target="_blank">Audit Log 一文舉例,當用戶更新手機號時,他不僅關心「使用者的新手機號是什麼」(current state),還關心「使用者的手機號從A更新為B」,他對後者做了抽象,稱之為審計日誌(Audit Log)。
他的 Event Sourcing 模式也是基於事件的另一種設計正規化。
一種基於事件的設計模式
Feed 不就是對事件的描述嗎?我們可以換個角度,從事件的角度來看待 Feed 流。
Feed 中的內容 | 基於事件的視覺 |
---|---|
Ryan 上傳了一個視訊「帶兒子去吃烤鴨」 | videos 表插入了一條記錄,id 為 1000, user_id 為 1 |
Ryan 分享了一張圖片「帶兒子在上海交大遛彎」 | images 表插入了一條記錄,id 為 1331,user_id 為 1 |
Tony 刪除了文件 | wiki 表中 id 為 433 的一條記錄,屬性 is_deleted 狀態從 false 變為 true,user_id 為 3 |
Sam 建立了日曆 「週三團隊聚餐」 | calenda_events 中插入一條記錄, id 為 123,user_id 為 4 |
事件有哪些屬性
Feed 中每個事件是對某個資源的狀態變化(transition of state),包含以下屬性:
- table_name: 哪張表。(換句話說,哪種型別的資源)
- table_id: 哪條記錄。
- column: 哪個屬性
- operation: 什麼操作? e.g. update/insert/delete
- old_value: 老的狀態是什麼
- new_value: 新的狀態是什麼
正規化中的各個元件如何協作?
- 資源的當前狀態儲存在各自的表中。e.g. videos, images, links, wikis, comments.
- 當資源的狀態變化時,把這一事件也儲存下來,稱之為 FeedEvent,它構成了 Feed。 - CreateVideoFeedEvent 建立視訊 - DeleteVideoFeedEvent 刪除視訊 - CreateWikiFeedEvent 建立文件 - UpdateWikiFeedEvent 更新文件 - DeleteWikiFeedEvent 刪除文件 - CreateCompanyAnnouncementFeedEvent 建立公司公告
- 每個 FeedEvent 該如何渲染,放到 Concrete class 中去實現。
- 每個 FeedEvent 會通過
table_name
,table_id
引用到相關的資源。
以上是對 Feed 內容的抽象,在後面的系列中,我會進一步闡述 Feed 分發,隱私策略等相關話題。
長按二維碼,打賞我個微信紅包。

25 September 2018