Социальные объекты - лучшие практики для структуры базы данных, фильтрации, сортировки, расширяемости - PullRequest
2 голосов
/ 02 августа 2010

Мы находимся в процессе создания универсальной корпоративной социальной сети в ASP.NET MVC.Одной из ключевых особенностей любого сайта социальной сети являются социальные объекты , которые публикуются пользователями либо явно (текстовые обновления, фотографии, блоги, видео и т. Д.), Либо неявно («пользователь посещает мероприятие», «пользователь»).обновил страницу и т. д.).

Все они, по сути, довольно похожи - то есть все они отображаются в потоках активности пользователей, на страницах групп, на которые они публикуются, в профилях пользователей, которые их опубликовали, и фильтруются похожими способами - например,«показать мне все, что произошло за последние 7 дней для группы X с тегом Y ».

Мы хотим определить несколькоосновные типы сообщений (блог, обновление текста, посещение событий, редактирование страниц и т. д.), но возможность легко расширяться, чтобы реселлеры и клиенты программного обеспечения могли добавлять свои собственные типы (например, новостные статьи) со своими собственными метаданными и полями(который должен быть доступен для поиска / фильтрации).Думайте о них как о «социальном» эквиваленте списков 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 ]

1 голос
/ 03 августа 2010

Также нашел эту видео-презентацию от MySpace о той же проблеме: http://ecn.channel9.msdn.com/o9/mix/10/mp4/EX04.mp4

1 голос
/ 02 августа 2010

Этот пост , разработанный инженером Facebook, должен дать вам представление о главных проблемах, связанных с масштабированием.В основном вам нужно подумать, как быстро вы сможете сгенерировать / обработать список всех сообщений, сделанных друзьями данного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...