我很想听听你对实现社交活动流的最佳方式(Facebook就是最著名的例子)的看法。涉及的问题/挑战有:
不同类型的活动(张贴,评论..)
不同类型的对象(帖子,评论,照片..)
1-n个不同角色的用户(“用户x回复了用户y对用户Z帖子的评论”)
同一活动项的不同视图(“您评论了..”vs。“你的朋友x评论”vs。"用户x评论说.."3个“评论”活动的表示)
. .还有更多,特别是如果你把它提高到一个高度复杂的水平,比如,把几个活动项目合并成一个(“用户x, y和z评论了那张照片”)。
任何关于模式、论文等关于最灵活、有效和强大的方法来实现这样一个系统、数据模型等的想法或建议都将受到欢迎。
尽管大多数问题与平台无关,但我最终有可能在Ruby on Rails上实现这样一个系统
我创建了这样一个系统,我采取了这样的方法:
数据库表中包含以下列:id、userId、类型、数据、时间。
userId是生成活动的用户
type是活动的类型(即写博客,添加照片,评论用户照片)
Data是一个带有活动元数据的序列化对象,您可以在其中放入任何您想要的内容
这限制了用户、时间和活动类型的搜索/查找,但在facebook类型的活动提要中,这并不是真正的限制。如果表上有正确的索引,查找就会很快。
在这种设计中,您必须决定每种类型的事件需要什么样的元数据。例如,新照片的feed活动可以是这样的:
{id:1, userId:1, type:PHOTO, time:2008-10-15 12:00:00, data:{photoId:2089, photoName:A trip to the beach}}
可以看到,虽然照片的名称肯定存储在包含照片的其他表中,我可以从那里检索名称,但我将在元数据字段中复制名称,因为如果想加快速度,您不希望对其他数据库表进行任何连接。为了显示50个不同用户的200个不同事件,你需要速度。
然后我有一些类,这些类扩展了一个基本的FeedActivity类,用于呈现不同类型的活动条目。事件分组也将在呈现代码中构建,以避免数据库的复杂性。
我创建了这样一个系统,我采取了这样的方法:
数据库表中包含以下列:id、userId、类型、数据、时间。
userId是生成活动的用户
type是活动的类型(即写博客,添加照片,评论用户照片)
Data是一个带有活动元数据的序列化对象,您可以在其中放入任何您想要的内容
这限制了用户、时间和活动类型的搜索/查找,但在facebook类型的活动提要中,这并不是真正的限制。如果表上有正确的索引,查找就会很快。
在这种设计中,您必须决定每种类型的事件需要什么样的元数据。例如,新照片的feed活动可以是这样的:
{id:1, userId:1, type:PHOTO, time:2008-10-15 12:00:00, data:{photoId:2089, photoName:A trip to the beach}}
可以看到,虽然照片的名称肯定存储在包含照片的其他表中,我可以从那里检索名称,但我将在元数据字段中复制名称,因为如果想加快速度,您不希望对其他数据库表进行任何连接。为了显示50个不同用户的200个不同事件,你需要速度。
然后我有一些类,这些类扩展了一个基本的FeedActivity类,用于呈现不同类型的活动条目。事件分组也将在呈现代码中构建,以避免数据库的复杂性。
我在几个月前解决了这个问题,但我认为我的实现太基础了。
我创建了以下模型:
HISTORY_TYPE
ID - The id of the history type
NAME - The name (type of the history)
DESCRIPTION - A description
HISTORY_MESSAGES
ID
HISTORY_TYPE - A message of history belongs to a history type
MESSAGE - The message to print, I put variables to be replaced by the actual values
HISTORY_ACTIVITY
ID
MESSAGE_ID - The message ID to use
VALUES - The data to use
例子
MESSAGE_ID_1 => "User %{user} created a new entry"
ACTIVITY_ID_1 => MESSAGE_ID = 1, VALUES = {user: "Rodrigo"}
// one entry per actual event
events {
id, timestamp, type, data
}
// one entry per event, per feed containing that event
events_feeds {
event_id, feed_id
}
创建事件时,决定它出现在哪个提要中,并将这些提要添加到events_feeds中。
要获取提要,请从events_feeds中选择,加入事件,按时间戳排序。
然后可以对该查询的结果进行过滤和聚合。
使用此模型,您可以在创建后更改事件属性,而不需要额外的工作。