构建社交网络类型应用程序的模式?

时间:2009-12-28 08:53:41

标签: sql design-patterns nosql social-networking architecture

我需要设计/架构/开发基于Web的社交网络类型应用程序。

基本功能:
  - 用户在系统上创建帐户
  - 用户同意彼此“交朋友”   - 用户在系统内创建内容
  - 用户指定哪些朋友可以查看/编辑他们创建的内容

这个核心功能肯定已经多次创建过?有没有关于如何实现这类事情的最佳实践模式?

我最感兴趣的是数据库的外观。

从SQL角度(任何数据库)看起来会是什么样子? 从NOSQL角度(任何NOSQL数据库)看起来会是什么样?

我最感兴趣的是,在数据库中如何解决“内容可见性”的问题?即数据库/应用程序如何确保只有经过批准的朋友才能看到用户创建的内容?

由于

7 个答案:

答案 0 :(得分:2)

首先要解决的问题是数据库,一个SQL看起来就像一个规范化的sql数据库。它还能看起来像什么? nosql数据库看起来像一堆名称值对文件。

建立社交网站的三种方法,在您对现有的流行和不流行的网站进行大量研究以确定其架构和目标市场之后,以及它们提供的特定服务之后这些市场。

  1. 从头开始自己动手(和/或使用框架)。像Facebook,Beebo,Myspace等。这显然是到达那里的最长路线,但它确实意味着当你这样做时你有卖东西。平台和会员以及USP都可以向鲁珀特·默多克或任何人出售。
  2. 使用适合社交网站的CMS并使用基本功能,加上插件以及您自己的灵感来触及您的目标市场。在这个区域经常使用Drupal(我也成功地使用过它)但是可以使用Joomla,Xaraya和许多其他免费和付费的。是的更多的研究。当鲁珀特给你一个铃铛作为基本工具可能是GPL的
  3. 时,卖得少
  4. 使用您提供的系统之一进行注册,然后使用这些工具构建您自己的系统,但提供了所有商品,这些被称为白标网站。 Start looking here。如果有人想带你过来,你几乎没有卖东西。
  5. 如何处理“内容可见性”。当然,网站构建者最初会决定谁可以看到内容。仅限业主,朋友,注册用户,普通大众?但是,这个决定必须符合网站的目标和政策。处理此问题的最佳方法是通过基于角色的访问RBAC see here for details

    当你说“需要设计/建筑/开发”时,这是因为内心的压力还是因为有人付钱给你?

    无论哪种方式都记得社交网络空间非常拥挤。如果您只是构建另一个YouTube或FaceBook,那么您不太可能产生使这样的网站在商业上取得成功所需的临界数量。

    如果是针对尚未满足的利基市场,例如“The Peckham and Brockley Exotic Bird Fanciers Club”然后你知道你的市场是什么以及需要什么功能,所以你认为最容易和最便宜的任何上述选项都可以使用,但这取决于你分析和执行。 / p>

    你当然可以想到一个主流的社交网站,而不是另一个社交网站,即你已经发现神话中的“市场缺口”。在这种情况下去吧,但准备失望。或者不是。

答案 1 :(得分:2)

您的设计应该是可维护的。这就是我在项目中所拥有的。

1。) Application.Infrastructure

  • 所有业务对象,业务对象集合,数据访问类和我的自定义属性和实用程序的基类,作为扩展方法,通用验证框架。这决定了我最终的.net应用程序的整体行为组织。

2。) Application.DataModel

  • 数据库的类型化数据集。
  • TableAdapters扩展到包含我可能需要的交易和其他功能。

3。) Application.DataAccess

  • 数据访问类。
  • 使用基础类型化数据集查询数据库操作的实际位置。

4。) Application.DomainObjects

  • 业务对象和业务对象集合。
  • 枚举。

5.。 Application.BusinessLayer

  • 提供可从Presentation层访问的经理类。
  • HttpHandlers的。
  • 我自己的页面基类。
  • 更多的事情在这里..

6。) Application.WebClient Application.WindowsClient

  • 我的演示文稿图层
  • 从Application.BusinessLayer和Application.BusinessObjects。
  • 获取引用

Application.BusinessObjects在整个应用程序中使用,并且每当需要时它们都会遍历所有层[Application.DataModel和Application.Infrastructure]

我的所有查询都只定义了Application.DataModel。

Application.DataAccess返回或接受Business对象作为任何数据访问操作的一部分。业务对象是在反射属性的帮助下创建的。每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记。

我的验证框架允许我在指定的ValidationAttribute的帮助下验证每个字段。

我的framrwork大量使用Attributes来自动化大多数繁琐的任务,如映射和验证。我还可以将新功能作为框架中的新方面。

示例业务对象在我的应用程序中看起来像这样。

<强> User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

<强> BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}

答案 2 :(得分:2)

http://www.neo4j.org这样的图表数据库是一个值得关注的选择。它非常适合社交网络(例如http://blog.neo4j.org/2009/09/social-networks-in-database-using-graph.html)和基于ACL的安全性(例如http://wiki.neo4j.org/content/ACL)。

答案 3 :(得分:0)

你应该首先研究现有的社交网络(Facebook,Myspace等)。有大量关于如何实施的信息。

答案 4 :(得分:0)

社交网络成功的关键不在于它所基于的技术,而在于它们为用户解决的问题。如果用户喜欢它,即使你的技术很糟糕,你也注定要成功。

[编辑]如何实施?检查任何基于SQL的用户角色系统。在这种情况下,每个用户也是一个角色,可以添加为“允许访问”任何对象。根据您拥有的对象数量以及控件的细粒度,这可能意味着您有一个包含三列的表:OBJECT, USER, ACCESS_TYPE其中ACCESS_TYPE可以是OWNER之一,{ {1}}(朋友),READ(好朋友)。

这个表格会变得非常大,但是今天的数据库已经有几亿行不再罕见。

答案 5 :(得分:0)

正如Aaroon指出的那样,你首先应该问问自己要解决什么问题。

您希望人们分享哪些内容?它应该只对朋友有效吗?如果您将内容公开显示,则更容易和可扩展,因为显示的内容不依赖于谁在观看页面,您可以轻松地缓存它。公开可用的用户生成内容吸引新用户。

如果您想限制访问权限并为用户提供将朋友组附加到资源的机会,我将使用简单的基于组的访问控制。让每个资源都有一组可以编辑资源的用户和一组可以看到它的用户。

这样每个资源都有两个单值属性,每个用户都属于有限数量的组。您可以将视图组和编辑组属性附加到存储在NOSQL数据库,Lucene / Sphinx等搜索引擎或SQL数据库中的行中的文档。在查询可供用户使用的内容时,在Sphinx IN中传递用户所属的所有组(在SQL中使用setFilter('view-group', array(2,3,4))子句。数据库将只返回用户可用的内容。因为您只将2个整数值(视图组和编辑组)附加到文档中,您可以将它们存储在内存中,从而使搜索快速且可扩展。

答案 6 :(得分:0)

最后看起来Elgg或Dolphin可能符合我们的要求。这些似乎是用于滚动您自己的社交网络的PHP框架。我查看了Facebook平台,但没有明确说明它是什么 - 它似乎是Facebook代码,但也许它只是一个插件API或其他东西的代码。