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

时间:2010-08-02 17:13:36

标签: c# database filtering social-networking

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

这些都基本上非常相似 - 即它们都显示在用户的活动流上,在发布到的组页面上,在发布它们的用户的用户配置文件上以及以类似的方式过滤 - 例如“使用标记Y ”向我展示组X 的最后 7天所发生的一切。

我们想要定义一些核心帖子类型(博客,文本更新,事件出席,页面编辑等),但是能够轻松扩展,以便软件的经销商和客户可以添加他们自己的类型(例如新闻 - 文章)有自己的自定义元数据和字段(应该是可搜索/可过滤的)。将这些视为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 - e.g. 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;
}

(所有数组引用数据库中的单独表格)

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

欢呼声, 马库斯

2 个答案:

答案 0 :(得分:1)

Facebook工程师

This post应该让您了解扩展时的主要问题。大多数情况下,您需要考虑如何快速生成/提供给定用户朋友发布的所有帖子的列表。

答案 1 :(得分:1)

此外,MySpace还发现了有关同一问题的视频演示: http://ecn.channel9.msdn.com/o9/mix/10/mp4/EX04.mp4