最近在做一个站点的消息通知模块。
目前的设计是这样的,有2张表:
user
——————————————
id
notification_check - DateTime
notification
——————————————
id
user_id
created - DateTime
* 每有消息产生就往 notification 表塞
* 某用户获取属于他的通知的话,就在 notification 表中查找满足 notification.user_id ==
user.id 且 notification.created >= user.notification_check 的所有条目
* 完了就更新 user 的 notification_check 为 datetime.datetime.now()
这样的话,基本的消息通知系统就可以运作起来。关键在于如何设计 notification 表的其他字段?
如果消息的种类相对单一,比如V2EX的消息貌似只有2种:(1)A在话题B里回复了你(2)A在话题B中提到了你。
这样的话我就可以这样设计 notification 表:
notification
——————————————
id
user_id
created - DateTime
type - 消息类别,比如“回复”、“提及”(这里用中文只是做示例)
trigger_id - 触发此消息的用户 id
topic_id - 与此消息相关的 topic id
content - 消息主体,对于 V2EX 来说就是回复内容
这样的话,在用户进入“提醒系统”时,就可以从 notification 表中取出全部未读的消息,然后根据 notification 表的字段生成消息的 HTML。
但是,如果消息的种类不仅限于论坛类的,而且涉及到其他类别:比如A关注了B / A赞了B(社交网络类消息),A成功付款 / A购买的商品已发货(商城类消息)。
问题是:如果这些差别非常大的 notification 同时存在,如何设计 notification 表的结构?
下面想了几种方法:
(1)大杂烩:
在一个 notification 表中增加所有需要的字段,之后在为用户构建消息 HTML 的时候不同 type 的消息使用不同 field 就行。
(2)分离:
针对不同类的 notification 设计各自的 notification 表,比如 forum_notification、shop_notification 等等。然后在取某 user 的消息时轮询所有的表,提取出所有的消息,然后根据不同的 type 构建结构不同的消息 HTML。
(3)标准化:
notification 的字段固定如下:
notification
——————————————
id
user_id
created - DateTime
header - 消息头 HTML
content - 消息主体 HTML
image - 消息左侧的图片 HTML
这样的话就可以满足所有消息的需求,因为所有的 notification 的最终 HTML 表现形式都可归结为:image(左侧)+ header(上侧)+ body(下侧)。但是这样的话就要求在插入 notification 表的时候要把 HTML 构造好再插入。
(4)使用 nosql:
既然不同 type 的消息需要的字段不一样,那么正好使用 schema-less 的 nosql 来构造 notification 表(比如 MongoDB)。
不知道意思表达清楚没有...
第一次遇到这种问题,思路比较混乱。求各位指点一二啦!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/94552
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.