Activity 社交网络数据库架构中的流/提要/新闻
Activity streams / feeds / news in social network database schema
我的目标是为简单\典型的社交网络实施数据库架构。
我已经阅读了很多主题\答案,但有几个悬而未决的问题。
所以我们有 User table (userId, name and etc)。我们可以进行一些操作(回复、点赞、关注等)。我想为所有活动实现一些日志,并将其作为 PULL-MODEL。所以我们在 Activity table 中写入任何操作的条目。此 table 的架构是 (id, ownerId, actionType, targetId, time) 其中 ownerId 是 User'sid,谁发的动作。 actionType 是回复、关注或其他动作。 targetId 是用户 ID 或 post 并且取决于 actionType。当 User 获取他的活动时,我们只需按好友 ID 进行查询。所以我很清楚。我的问题是:
1) 如果我关注了用户然后取消关注他,我该怎么办?我应该在 Activity table 中创建两个条目还是应该删除第一个 followAction 条目?最佳做法是什么?
2) 很明显,我通过好友 ID 进行查询,所以我得到了我好友的所有活动。但如果不是我的朋友喜欢我的照片,我必须得到 "Some not my friends liked my photo" 的事件。那么,对于这种情况,有什么好的解决方案。可能我必须更改当前架构?
相关问题:
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?
谢谢大家的好回答。
首先,最好将每种动作拆分成自己的 table,而不是将所有动作都放在一个 table 中,按类型区分。这使您关于每个操作的元数据更加灵活;如您所说,目标 ID 取决于操作;如果不将它们拆分成其他 table,就很难对数据应该是什么写约束。
其次 - 关于您的问题 #1,我认为您混淆了 用户操作日志 与 用户状态 。您可能两者都需要;您可能需要两个单独的数据结构。例如,如果用户关注然后取消关注,status 是他们没有关注,但是 log of actions 是他们关注,然后取消关注。所以我认为你应该小心有一个单独的数据结构来捕获某些关系的当前状态,除了动作。然后问题变得更简单,您记录所有发生的操作,并相应地更新状态。
对于问题 #2,照片应该是它自己的数据对象,"likes" 拆分成不同的 table;用户喜欢 posts。那么所有喜欢一个post的用户,可以很容易的分为两类;朋友(与 post 人有朋友关系的人)和非朋友。
我的目标是为简单\典型的社交网络实施数据库架构。 我已经阅读了很多主题\答案,但有几个悬而未决的问题。 所以我们有 User table (userId, name and etc)。我们可以进行一些操作(回复、点赞、关注等)。我想为所有活动实现一些日志,并将其作为 PULL-MODEL。所以我们在 Activity table 中写入任何操作的条目。此 table 的架构是 (id, ownerId, actionType, targetId, time) 其中 ownerId 是 User'sid,谁发的动作。 actionType 是回复、关注或其他动作。 targetId 是用户 ID 或 post 并且取决于 actionType。当 User 获取他的活动时,我们只需按好友 ID 进行查询。所以我很清楚。我的问题是:
1) 如果我关注了用户然后取消关注他,我该怎么办?我应该在 Activity table 中创建两个条目还是应该删除第一个 followAction 条目?最佳做法是什么?
2) 很明显,我通过好友 ID 进行查询,所以我得到了我好友的所有活动。但如果不是我的朋友喜欢我的照片,我必须得到 "Some not my friends liked my photo" 的事件。那么,对于这种情况,有什么好的解决方案。可能我必须更改当前架构?
相关问题:
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?
谢谢大家的好回答。
首先,最好将每种动作拆分成自己的 table,而不是将所有动作都放在一个 table 中,按类型区分。这使您关于每个操作的元数据更加灵活;如您所说,目标 ID 取决于操作;如果不将它们拆分成其他 table,就很难对数据应该是什么写约束。
其次 - 关于您的问题 #1,我认为您混淆了 用户操作日志 与 用户状态 。您可能两者都需要;您可能需要两个单独的数据结构。例如,如果用户关注然后取消关注,status 是他们没有关注,但是 log of actions 是他们关注,然后取消关注。所以我认为你应该小心有一个单独的数据结构来捕获某些关系的当前状态,除了动作。然后问题变得更简单,您记录所有发生的操作,并相应地更新状态。
对于问题 #2,照片应该是它自己的数据对象,"likes" 拆分成不同的 table;用户喜欢 posts。那么所有喜欢一个post的用户,可以很容易的分为两类;朋友(与 post 人有朋友关系的人)和非朋友。