社交网络数据库模式中的活动流/提要/新闻

Posted

技术标签:

【中文标题】社交网络数据库模式中的活动流/提要/新闻【英文标题】:Activity streams / feeds / news in social network database schema 【发布时间】:2015-02-28 16:24:22 【问题描述】:

我的目标是为简单\典型的社交网络实现数据库模式。 我已经阅读了许多主题\答案,但有几个未解决的问题。 所以我们有 User 表(userId、name 等)。我们可以进行一些操作回复、点赞、关注等)。我想为所有活动实现一些日志,并将其作为 PULL-MODEL。因此,我们在 Activity 表中为任何操作写入条目。此表的架构是 (id, ownerId, actionType, targetId, time),其中 ownerId用户的 id,谁进行了操作。 actionType 是回复、关注或其他操作。 targetId 是用户或帖子的 id,取决于 actionType。当 用户 得到他的活动时,我们只是通过朋友 ID 进行查询。所以对我来说很清楚。我的问题是:

1) 如果我关注用户并取消关注他,我该怎么办?我应该在 Activity 表中创建两个条目还是应该删除第一个 followAction 条目?最佳做法是什么?

2) 很明显,我通过朋友 ID 进行查询,所以我得到了我朋友的所有活动。但万一不是我的朋友喜欢我的照片,我必须得到“一些不是我的朋友喜欢我的照片”的事件。那么,对于这种情况,有什么好的解决方案。可能我必须更改我当前的架构吗?

相关问题:

How to implement the activity stream in a social network

Database Design - "Push" Model, or Fan-out-on-write

What's the best manner of implementing a social activity stream?

谢谢大家的好答案。

【问题讨论】:

【参考方案1】:

首先,最好将每种操作拆分到自己的表中,而不是将所有操作放在一个表中,按类型区分。这使您关于每个操作的元数据更加灵活;如您所说,目标ID取决于操作;如果不将它们拆分到其他表中,就很难对数据应该是什么进行约束。

第二 - 关于您的问题 #1,我认为您将 用户操作日志用户状态 混淆了。您可能需要两者;您可能需要两个单独的数据结构。例如,如果用户关注然后取消关注,则 status 是他们没有关注,但 操作日志 是他们关注然后取消关注。所以我认为你应该小心拥有一个单独的数据结构来捕获某些关系的当前状态,除了动作。然后问题就变得更简单了,你记录所有发生的动作,并相应地更新状态。

对于问题#2,照片应该是它自己的数据对象,“喜欢”被分成不同的表;用户喜欢帖子。然后,在所有喜欢帖子的用户中,他们可以很容易地分为两类;朋友(与海报有朋友关系的人)和非朋友。

【讨论】:

感谢您的回答。所以分离动作的想法看起来很有趣。问题 1 怎么样 - 当然我有关系表,但现在我的目标是实现新闻流。因此,如果用户 A 和 B 的朋友和 B 关注 C,则用户 A 在其流中得到消息“B 开始关注 C”,但如果 B 取消关注 C,则 A 不应获得此条目。问题 2 - 如果我的朋友喜欢帖子,在我的新闻流中我会得到条目“用户 B 喜欢帖子 blahblah”。我可以通过朋友 ID 获取我朋友的所有条目。但如果不是朋友喜欢我的帖子。如何在我的新闻流中获取此条目?我对sql查询级别感兴趣。 我不能给你 SQL,因为你必须发布你的整个模型才能做到这一点。但是您想对新闻提要进行时间限制查询。每个用户都有一个“最后的新闻源更新时间”。新闻源上的新项目是自上次更新时间以来发生的任何事情。如果 B 跟随 C,则在您的操作表中加盖时间戳。如果 A 是 C 的朋友,那么您在时间窗口内更新 A 与 C 相关的任何操作。

以上是关于社交网络数据库模式中的活动流/提要/新闻的主要内容,如果未能解决你的问题,请参考以下文章

如何在社交网络中实现活动流

用于构建“新闻提要”/“状态更新”/“活动流”的 Django 方式

使用 PHP 和 MySQL 的通知/新闻提要

计算社交网络的用户交互 - 算法

如何在 Google App Engine 上为社交新闻提要建模

设计高性能社交提要的概念