我一直致力于开发一个复杂的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
可能出现的问题/冲突
我的目标是减少代码复杂性和提高数据库效率。试图将数据库层与代码层分开,使我对网站的这一部分感到困惑:(
我对所有的关注和想法持开放态度。
答案 0 :(得分:1)
休息几天后,我改变了对新闻提要和通知系统的思考方式。我采用的方法是每个事件(评论,标签等)都会分析关于两个用户的单个通知,即通知针对的参与者和用户(例如一个标记和一个被标记的用户)。另一部分的新闻提要将从通知条目中获取合理的最近条目(假设它不是私有的,例如私人消息)并构建一个提要。这似乎可能会对数据库造成压力,但我不认为在100(最大)用户的情况下会出现问题。感谢Ryan的投入:)
答案 1 :(得分:1)
有两种方法可以处理新闻源:
您正在使用写入方式的扇出。在这种情况下,您为每个相关用户生成一个新的个人活动。
这种方法可能会很快爆发,特别是如果您允许用户拥有无限数量的关注者。每当发生频繁的活动时,您将不得不为数据库中每1000多名粉丝保存一个新条目。
当您添加群组和不同类型的受众群体时,事情变得更加复杂。如果您现在只想将活动广播给A组中的人而不是B组(例如,您创建状态并且想要限制查看者),该怎么办?当您想要向A组和B组广播时会发生什么,但A和B中的用户都不希望两次接收相同的活动?如果要在创建活动后更改活动的可见性,该怎么办?
对于写入方法的粉丝来说这是不可能的,或者至少非常困难。这就是为什么我更喜欢后者 - 读取方法的粉丝。
考虑一下:
用户有一组与其ID相关联的新闻源频道。这些频道的格式为{{ object_name}}:{{ object_id }}
。您可以为新闻源和通知设置单独的设置,以便您可以取消对一个对象的通知,而无需将其从新闻源中删除。
当用户注册接收来自对象的更新时,他们会将与该对象关联的频道添加到其频道列表中。您可以使用简单的Redis设置。例如,如果我加入事件#1,我会将event:1
添加到我的频道列表中。
当某个属性在事件#1上发生更改时,只会创建一个新活动。此活动有一个名为“observer”的字段,该字段是可见的频道的名称。在这种情况下,观察者是'event:1`。
当用户提取活动Feed时,他们首先会获得订阅频道的列表。然后,他们检索观察者在其频道列表中的所有活动源项目。
同时强>
我只是不确定如何将其变成通知系统。如上所述,在读取方法中使用扇出,我有一组通知通道。当对象上的属性发生更改时,我会向数据库写入一个新通知,以便所有已订阅的用户都会选择该通知。唯一的问题是:我如何在逐个用户的基础上阅读通知?我仍然没有想出那个部分。