从用户跟踪到实时订阅的基本数据流

时间:2011-02-25 21:00:18

标签: database-design social-networking feeds user-tracking

有人可以从数据模型的角度解释流程是如何从用户跟踪点到实时Feed的吗?我的开发团队遇到了这个问题:

当用户执行活动时,将足迹记录到user_activity表,该表是所有用户足迹的主表。这意味着每个需要跟踪的用户的每个操作都将写在这里。

问题:
1)活动为1:M。就像我可以在一张照片中标记10个人一样。所以显然我不会在活动表中为此写10个foorprints。因此,我是否需要另一个表来存储活动详细信息?

2)由于此表记录了所有对象的所有活动,从它被送入活动供稿表以输出到活动供稿,因此供稿需要知道活动中涉及的所有对象,因此它可以说“X在Tim的照片中标记了Mark,John,Sarah。”其中Mark,John,Sarah基本上是链接到他们的个人资料的用户对象。照片是链接到照片桌的照片对象......

以上是一个例子,但有许多对象,如电影,音乐,品牌,城市等。所以,系统需要知道从日志表到活动源,哪个对象是什么,在哪里是这样的它可以将相关数据输入到Feed中。为此,我有2个colunms:object_id和object_type_id,其中object_type类似于“User,Photo,Brands等”,object_id是对象的ID。但是如何将它与实际表连接?

3)最后,这个设计是如何让它从跟踪数据转到源的最佳方式,即记录到日志表。日志表可能有详细信息表,日志表与会话表连接。每2分钟,一个玉米作业被安排将这些数据拉入一个非规范化的活动供稿表,并从这些+对象表中提取数据,以便直接读入实时供稿。

  • 2分钟的玉米工作也让我感到害怕,因为如果有很多记录,那么系统可能需要2分钟以上才能完成工作,然后会有积压。那么我可以使用的任何其他方法吗?

1 个答案:

答案 0 :(得分:1)

  1. 记录10个操作中的每个操作,但添加一个对所有操作都通用的activitybatchid,以便您可以跟踪一起发生的操作。

  2. 我还会将activitybatchid编写到队列表中进行处理,这是cron作业在将项添加到feed表时读取的内容。在处理activitybatchid后,它将被删除。

  3. 我建议在这种情况下使用递归cron作业,一次读取一行或一批行,然后进行处理,同时保持锁定,以便其他进程无法读取此表。为了提高性能,您可以柚木化一次处理的行数。此过程如果此过程终止,锁定将在一定的空闲时间后释放。

  4. activitybatchid的处理将从活动表中读取相关数据以构建必要的Feed详细信息,并且由于这样做了一次,因此应用程序无需记住。

  5. 所以基本上你最终会得到:带有原始数据的活动表,带有要转换为供稿的活动的队列表,一个包含生成的供显示或呈现的供稿的供稿表