我一直在研究一个复杂的
PHP系统,它结合了社交网络的概念,但是对于一群封闭的人来说.我有几个模块,照片和视频库,每个模块和子模块上的完整评论系统,私人消息,带GUI的个人电子邮件等等.
我的问题是,无论我怎么努力,我似乎都无法以有效的方式设计通知和新闻源部分的后端,就像facebook所拥有的那样.这些模块几乎都是事件驱动的,因此将它们连接到通知系统应该不是问题.希望一些团队头脑风暴会结束我的问题.
我只会在这篇文章中解决我对通知部分的担忧(如果我也包括新闻提要,这将成为一个非常漫长而混乱的帖子).
这是我的第一个MySQL表草案.
notificationID Primary key notificationModule Module type foreign key - photo, video, comment, message notificationConstructor Foreign key of the element (which is of type "notificationModule") that triggered the creation of this notification notificationUser The user that this notification is aimed towards notificationTime Time at which the notification was created notificationFlag Notification has been read flag
可能的问题/冲突
>用户评论两张不同用户已评论的照片的事件将触发三次通知?一个用于照片上传者,另一个用于评论者? (影响notificationUser)
> notificationTime是创建时间.在上述问题之后,如果我们不创建新通知,这个字段应该被notificationUpdateTime替换或者可能存在吗?
我的目标是减少代码复杂性和提高数据库效率.试图将数据库层与代码层分开困惑我在网站的这一部分:(
我对所有的关注和想法持开放态度.
最佳答案 有两种方法可以处理新闻源:
>写出来
>读出来
您正在使用写入方式的扇出.在这种情况下,您为每个相关用户生成一个新的个人活动.
这种方法可能会很快爆炸,特别是如果您允许用户拥有无限数量的关注者.每当发生频繁的活动时,您将不得不为数据库中的每1000个粉丝保存一个新条目.
当您添加群组和不同类型的受众时,事情会变得更加复杂.如果您现在只想将活动广播给A组中的人而不是B组(例如,您创建状态并且想要限制查看者),该怎么办?当您想要向A组和B组广播时会发生什么,但A和B中的用户都不希望两次接收相同的活动?如果要在创建活动后更改活动的可见性,该怎么办?
对于写入方法的粉丝来说这是不可能的,或者至少非常困难.这就是为什么我更喜欢后者 – 读取方法的粉丝.
考虑一下:
用户具有与其id相关联的一组新闻馈送频道.这些渠道的格式为{{object_name}}:{{object_id}}.您可以为新闻源和通知设置单独的设置,以便您可以取消对一个对象的通知,而无需从新闻源中删除它.
当用户注册以从对象接收更新时,他们将与该对象相关联的频道添加到其频道列表中.您可以使用简单的Redis设置.例如,如果我加入事件#1,我将event:1添加到我的频道列表中.
当某个属性在事件#1上发生更改时,只会创建一个新活动.此活动有一个名为“observer”的字段,该字段是可见的频道的名称.在这种情况下,观察者是’事件:1`.
当用户提取其活动源时,他们首先获取其订阅频道的列表.然后,他们检索观察者在其频道列表中的所有活动源项.
也
我只是不确定如何将其变成通知系统.如上所述,在读取方法中使用扇出,我有一组通知通道.当对象上的属性发生更改时,我会向数据库写入一个新通知,以便所有已订阅的用户都会选择该通知.唯一的问题是:我如何在逐个用户的基础上阅读通知?我仍然没有想到这一部分.