Шаблоны для создания приложений типа социальной сети?

Мне нужно спроектировать / архитектовать / разработать сетевое приложение типа социальной сети.

Основные функции:
– пользователи создают учетные записи в системе
– пользователи соглашаются «друг» друг друга
– пользователи создают контент в системе
– пользователи определяют, какие друзья могут просматривать / редактировать контент, который они создали

Наверняка, эта основная функциональность была создана много раз раньше? Существуют ли какие-либо образцы лучшей практики для того, как реализовать такие вещи?

Меня больше всего интересует, как будет выглядеть база данных для этого.

Как бы это выглядело с точки зрения SQL (любая база данных)?
Как это выглядело бы с точки зрения NOSQL (любая база данных NOSQL)?

То, что меня больше всего интересует, заключается в том, как решается вопрос о «видимости контента» в базе данных? т.е. каким образом база данных / приложение гарантирует, что только одобренные друзья могут видеть созданный пользователем контент?

благодаря

Первое, что нужно сделать, это база данных, SQL-код будет выглядеть как нормализованная база данных sql. Что еще это могло бы выглядеть? База данных nosql будет похожа на кучу парных файлов с именем.

Три подхода к созданию социального веб-сайта после и только после того, как вы наложили нагрузку на исследования существующих популярных и непопулярных, чтобы выяснить их архитектуру и рынки, на которые они нацелены, и конкретные услуги, которые они предлагают этим рынкам.

  1. Сверните свой собственный с нуля (и / или используйте фреймворк). Как и Facebook, Beebo, Myspace и др. Это, очевидно, самый длинный путь добираться туда, но это означает, что у вас есть что продать, когда вы это делаете. И платформа, и членство, и USP являются вашими, чтобы продать Руперту Мердоку или кому бы то ни было.
  2. Используйте CMS, который поддается социальному сайту и использует базовые функции, а также плагины и ваше собственное вдохновение, чтобы попасть на ваш целевой рынок. В этой области часто используется Drupal (я тоже успешно его использовал), но можно использовать Joomla, Xaraya и многие другие, как бесплатные, так и оплачиваемые. Да, больше исследований. Меньше продавать здесь, когда Руперт дает вам колокол, поскольку базовым инструментом, вероятно, является GPL'd
  3. Используйте одну из предоставленных систем, в которой вы регистрируетесь, а затем используйте инструменты для создания своих собственных, но предоставляются все полезные свойства. Они известны как сайты с белыми метками. Начните искать здесь . Здесь вам мало что можно продать, если кто-то хочет вас забрать.

Как обрабатывается «видимость контента». Первоначально, конечно, разработчик сайта принимает решение о том, кто может видеть контент. Владельцы только, друзья, зарегистрированные пользователи, широкая публика? и т. д. Но это решение должно соответствовать целям и политике сайта. Лучший способ справиться с этим – через Ротационный доступ RBAC см. Здесь для подробностей

Когда вы говорите, что вам нужно «дизайн / архитектор / разработка», это из-за подавляющего внутреннего побуждения или из-за того, что кто-то платит вам?

В любом случае помните, что социальное веб-пространство очень многолюдно. Если вы просто создаете еще один YouTube или FaceBook, то вряд ли вы сможете генерировать критическую массу числа, необходимого для того, чтобы сделать такой сайт коммерчески успешным.

Если это для нишевого рынка, на котором уже не обслуживаются, например, «Клуб любителей фоккеров в Пекхаме и Брокли Экзотика», то вы знаете, что такое рынок и какие функции потребуются, чтобы любой из вышеперечисленных вариантов, которые вы считаете самыми легкими и самыми дешевыми, может быть но это зависит от вас, чтобы анализировать и выполнять.

Разумеется, у вас может быть идея для социального сайта, который является основным и не охвачен другим, т. Е. Вы заметили мифологический «разрыв на рынке». В этом случае идите, но готовьтесь разочароваться. Или нет.

Ваша конструкция должна быть надежной. Это то, что у меня есть в моем проекте.

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 используются во всем приложении, и они перемещаются по всем слоям всякий раз, когда neeeded [кроме Application.DataModel и Application.Infrastructure]

Все мои запросы определяются только Application.DataModel.

Application.DataAccess возвращает или принимает бизнес-объекты как часть любой операции доступа к данным. Бизнес-объекты создаются с помощью атрибутов отражения. Каждый бизнес-объект помечен сопоставлением атрибутов в целевой таблице в базе данных, а свойства в бизнес-объекте помечены сопоставлением атрибутов целевому coloumn в соответствующей таблице базы данных.

Моя структура проверки позволяет мне проверять каждое поле с помощью назначенного параметра ValidationAttribute.

Мой framrwork сильно использует атрибуты для автоматизации большинства утомительных задач, таких как сопоставление и валидация. Я также могу добавить новую функцию в качестве нового аспекта.

Пример бизнес-объекта будет выглядеть так в моем приложении.

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) { } } 

Графическая база данных, такая как http://www.neo4j.org, – это выбор. Это хорошо подходит для социальной сети (например, http://blog.neo4j.org/2009/09/social-networks-in-database-using-graph.html ) и безопасности на основе ACL (например, http: //wiki.neo4j.org/content/ACL ).

Сначала вы должны изучить существующие социальные сети (Facebook, Myspace и т. Д.). Существует множество информации о том, как они реализованы.

Ключом к успеху социальных сетей является не технология, на которой она основана, а проблемы, которые они решают для пользователей. Если пользователям это нравится, вы обречены на успех, даже если ваша технология – дерьмо.

[EDIT] Как это реализовано? Проверьте систему пользовательских ролей на основе SQL. В этом случае каждый пользователь также может быть добавлен как «разрешенный доступ» к любому объекту. В зависимости от того, сколько объектов у вас есть и насколько тонким будет элемент управления, это может означать, что у вас есть таблица с тремя столбцами: OBJECT, USER, ACCESS_TYPE где ACCESS_TYPE может быть одним из OWNER , READ (friend), WRITE (близкий друг ).

Эта таблица станет довольно большой, но несколько 100 миллионов строк не являются чем-то необычным для сегодняшних баз данных.

Как указал Аарон, вы должны сначала спросить себя, какую проблему вы хотите решить.

Какое содержимое вы хотите поделиться? Если это действительно видно только друзьям? Это намного проще и масштабируемо, если вы делаете контент общедоступным, потому что содержимое отображается не зависит от того, кто смотрит страницу, и вы можете легко ее кэшировать. Публично доступный пользовательский контент привлекает новых пользователей.

Если вы хотите ограничить доступ и предоставить пользователю возможность присоединить группы друзей к ресурсу, я бы пошел с простым групповым контролем доступа. Пусть каждый ресурс имеет группу пользователей, которые могут редактировать ресурс и группу пользователей, которые могут его видеть.

Таким образом, каждый ресурс имеет два атрибута одного значения, и каждый пользователь имеет право на конечное число групп. Вы можете присоединить атрибуты view-group и edit-group к документу, хранящемуся в базе данных NOSQL, поисковой системе, такой как Lucene / Sphinx или строке в базе данных SQL. При запросе содержимого, доступного для пользователя, передайте все группы, к которым принадлежит пользователь (в SQL вы должны использовать предложение IN , в Sphinx setFilter('view-group', array(2,3,4)) . База данных будет возвращаться только содержимое, доступное для пользователя. Поскольку вы прикрепляете к документу только 2 целочисленных значения (группа просмотра и группа редактирования), их можно сохранить в памяти, что делает поиск быстрым и масштабируемым.

В конце концов, похоже, что Elgg или Dolphin могут удовлетворить наши требования. Они, похоже, являются фреймворками PHP для продвижения вашей собственной социальной сети. Я посмотрел на платформу Facebook, но нигде не ясно объяснил, что это такое – это, по-видимому, код Facebook, но, возможно, это только код API-интерфейса или что-то еще.