社交对象 – 数据库结构,过滤,排序,可扩展性的最佳实践

我们正在ASP.NET MVC中构建通用企业社交网络平台。 任何社交网站的关键特征之一是用户明确发布的社交对象 (文本更新,照片,博客,video等)或隐式(“用户正在参加活动”,“用户已更新页面”等) 。

这些都非常相似 – 即它们都显示在用户的活动流上,发布到的组页面上,发布它们的用户的用户配置文件以及以类似的方式过滤 – 例如“告诉我发生的一切在组X的最后7天标签为Y “。

我们想要定义一些核心post类型(博客,文本更新,事件出席,页面编辑等),但是能够轻松扩展,以便软件的经销商和客户可以添加他们自己的类型(例如新闻文章)他们自己的自定义元数据和字段(应该是可搜索/可过滤的)。 将这些视为Sharepoint列表的“社交”等价物!

无论如何,我的问题是:在性能,可伸缩性和易扩展性方面,实现这一目标的最佳数据结构是什么?

这就是我目前的想法(伪代码/数据库结构):

public class SocialObject { int Id; DateTime Date; string Url; string Title; string Text; Media[] Attachments; //photos, videos, links etc int OwnerId; //user who posted it int GroupId; //group it was posted to int PageId; //page it was posted to int PostTypeId; int? SourceId; //source - eg desktop client, email, web Like[] Likes; Comment[] Comments; Repost[] Reposts; Tag[] Tags; Mention[] Mentions; //user IDs mentioned in this post Metadata[] MetadataValues; } public class Metadata { int SocialObjectId; int MetadataTypeId; int? MetadataValueId; //for metadata types with list values - for filtering string Value; } 

(所有数组引用DB中的单独表)

这是一种明智的方式吗? – 即将所有社交对象存储在同一个表中(并允许通过元数据表扩展其他字段/信息)或者我吸烟的东西是不应该的? 请记住,此表可能会变得非常大 – 从100,000行到数百万行。

欢呼,马库斯

Facebook工程师的这篇文章应该让你了解扩展时的主要问题。 大多数情况下,您需要考虑如何快速生成/提供给定用户的朋友发布的所有post的列表。

还从MySpace发现了关于同一问题的video演示: http : //ecn.channel9.msdn.com/o9/mix/10/mp4/EX04.mp4