Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构建社交网络类型应用程序的模式?_Sql_Design Patterns_Nosql_Social Networking_Architecture - Fatal编程技术网

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

Sql 构建社交网络类型应用程序的模式?,sql,design-patterns,nosql,social-networking,architecture,Sql,Design Patterns,Nosql,Social Networking,Architecture,我需要设计/构建/开发一个基于web的社交网络类型的应用程序 基本功能: -用户在系统上创建帐户 -用户同意彼此“交朋友” -用户在系统中创建内容 -用户指定哪些朋友可以查看/编辑他们创建的内容 这个核心功能肯定已经创建过很多次了吗?对于如何实现这类事情,有什么最佳实践模式吗 我最感兴趣的是这个数据库的外观 从SQL角度(任何数据库)来看,这是什么样子的? 从NOSQL的角度来看(任何NOSQL数据库),这是什么样子的 我最感兴趣的是,如何在数据库中解决“内容可见性”问题?i、 e.数据库/应用

我需要设计/构建/开发一个基于web的社交网络类型的应用程序

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

这个核心功能肯定已经创建过很多次了吗?对于如何实现这类事情,有什么最佳实践模式吗

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

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

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


谢谢

你应该先研究一下现有的社交网络(Facebook、Myspace等)。关于它们是如何实现的,有相当多的信息可用。

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

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


这个表将变得相当大,但对于今天的数据库来说,只有一亿行已不再少见。

首先要解决的是数据库,SQL数据库看起来就像一个标准化的SQL数据库。它还能是什么样子?nosql数据库看起来像一堆名称-值对文件

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

  • 从零开始推出自己的产品(或使用框架)。像Facebook、Beebo、Myspace等,这显然是最长的途径,但这确实意味着你有东西可以卖。平台、会员资格和USP都由您出售给鲁珀特·默多克或任何人
  • 使用适合社交网站的CMS,并使用基本功能、插件和您自己的灵感,以达到您的目标市场。在这个领域经常使用Drupal(我也成功地使用了它),但Joomla、Xaraya和许多其他免费和付费的都可以使用。是的,更多的研究。当Rupert给你一个铃铛时,这里要卖的更少,因为基本工具可能是GPL'd
  • 使用提供的系统中的一个进行注册,然后使用工具构建自己的系统,但所有的好东西都提供了,这些被称为白标签站点。在这里,如果有人想接管你,你没有什么可卖的
  • 如何处理“内容可见性”。当然,网站建设者最初会决定谁可以查看内容。仅限所有者、朋友、注册用户、普通公众?但该决定必须符合现场的目标和政策。处理此问题的最佳方法是通过基于角色的访问RBAC

    当你说“需要设计/架构/开发”时,这是因为一种压倒性的内在冲动,还是因为有人付钱给你

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

    如果是针对尚未迎合的利基市场,例如“Peckham和Brockley异国情调鸟类爱好者俱乐部”,那么您知道自己的市场是什么,需要什么功能,以便可以使用您认为最简单和最便宜的任何上述选项,但这取决于您的分析和执行


    当然,你可能对一个主流的社交网站有一个想法,而另一个网站却没有涵盖,也就是说,你发现了神话般的“市场缺口”。在这种情况下,尽管去做,但要做好失望的准备。或者没有。

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

    1.应用程序基础架构

    • 所有businessobjects的基类、Business object collection、数据访问类以及作为扩展方法的自定义属性和实用程序、通用验证框架。这决定了我最终的.net应用程序的总体行为组织
    2.)应用程序。数据模型

    • 数据库的类型化数据集
    • TableAdapters扩展为包含事务和我可能需要的其他功能
    3.)应用程序。数据访问

    [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;
        }
    }
    
    /// <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)
        {
        }
    }
    
    • 数据访问类
    • 使用底层类型化数据集查询数据库操作的实际位置
    4.Application.DomainObjects

    [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;
        }
    }
    
    /// <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)
        {
        }
    }
    
    • 业务对象和业务对象集合
    • 枚举
    5.Application.BusinessLayer

    • 提供可从表示层访问的管理器类
    • HttpHandlers
    • 我自己的页面基类
    • 这里有更多的东西
    6.应用程序.WebClient应用程序.WindowsClient

    • 我的演示层
    • 从Application.BusinessLayer获取引用