我一直在研究如何在SE和其他地方构建通知系统,发现自己对解决方案很感兴趣,该解决方案是此处接受的答案:https : //stackoverflow.com/questions/9735578/building-a-notification-system 使用这个结构:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
通知是关于某人(演员)更改(动词=添加,请求..)并报告给用户(主题)的某事(对象=事件,友谊..)。这是规范化的数据结构(尽管我使用过MongoDB)。您需要通知某些用户有关更改。因此,这是每位用户的通知。这意味着,如果有100位用户参与,您将生成100条通知。
起初我以为我了解这种方法,但是当我准备开始实施它时,我意识到我显然不太了解它。关于答案的最后几条评论是来自其他用户的问题,这些用户也难以理解解决方案。
我不确定这是否是我最终会遵循的模型,但是鉴于它所拥有的支持者数量,我相信这对我有所帮助,我当然希望了解更多。我希望这对于其他在掌握该解决方案方面遇到困难的人也将是有用的(顺便说一句,我没有足够的互联网积分就该问题的答案发表评论,其他任何人都可以做!)
问题
如果我理解正确,则notificationObjectID是指向notification_object表的外键,而notificationID是指向通知表的外键。似乎object应该是外键,引用通知所涉及的数据库条目的ID(例如特定事件或发布),但是我们是否不需要另一个字段来指示ID属于哪个表?
作者写道
notification_object.object标识更改类型,例如字符串“ friendship”。我所讨论的对更改对象及其额外数据的实际引用位于notification_change.notificationObjectID中。
这对我来说似乎没有意义。对象是一个字符串(枚举?),notificationObjectID是一个外键,指向通知所针对的对象?那么中间表和右边表是如何连接的呢?
似乎中间表指定了通知涉及的对象(或对象类型),例如事件或帖子。然后,在notification_change中可以有许多条目指向相同的对象类型,这使我们可以捆绑通知(例如“在X的墙上张贴了25位用户”)-因此,中间表和右表之间是1:n关系。
但是为什么左表和中间表之间存在1:n关系?我们是否要给“ 25位张贴在Sam墙上的用户”和“玛丽更新了她的“星期五野餐”事件”使用相同的通知ID?如果同一用户的所有通知都具有相同的通知ID,为什么我们甚至需要剩下?
表演问题-说约翰对玛丽的野餐活动发表评论。在创建notification_change条目之前,我们似乎需要进行查找以查看Mary's Picnic 的notification_object是否已经存在。这会对性能产生负面影响,还是非问题?继续前一段的问题,我们怎么会知道哪个通知条目指向notification_object什么?