У меня есть сайт с пользователями 500 тыс. (Работает на SQL Server 2008). Теперь я хочу включить потоки активности пользователей и их друзей. После тестирования нескольких вещей на SQL Server становится очевидным, что RDMS не является хорошим выбором для этой функции. он медленный (даже когда я сильно де-нормализовал свои данные). Поэтому, посмотрев на другие решения NoSQL, я понял, что могу использовать MongoDB для этого. Я буду следить за структурой данных на основе activitystrea.ms json specifications for activity stream Итак, мой вопрос: какой был бы лучший дизайн схемы для потока активности в MongoDB (с помощью этого множества пользователей вы можете в значительной степени предсказать, что он будет очень тяжелым на записи, поэтому мой выбор MongoDB - это отличная «запись» производительности. Я подумал о трех типах структур, скажите, пожалуйста, если это имеет смысл или я должен использовать другие схемы.Схема схемы базы данных MongoDB
1 - Хранить каждый деятельность со всеми друзьями/последователями по этой схеме:
{ _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), consumers:[ person3, person4, person5, person6, ... so on ] }
2 - Второй проект: Collectio п поименных activity_stream_fanout
{ _id:'activ_fanout_123', personId:person3, activities:[ { _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), } ],[ //activity feed 2 ] }
3 - Такой подход будет хранить элементы деятельности в одной коллекции, а также потребитель в другом. В деятельности, вы можете иметь документ, как:
{ _id: "123", actor: { person: "UserABC" }, verb: "follow", object: { person: "someone_else" }, updatedOn: Date(...) }
А потом, для последователей, я бы следующие «уведомления» документы:
{ activityId: "123", consumer: "someguy", updatedOn: Date(...) } { activityId: "123", consumer: "otherguy", updatedOn: Date(...) } { activityId: "123", consumer: "thirdguy", updatedOn: Date(...) }
Ваши ответы очень ценятся.
отличные предложения. В реальном времени я не имел в виду субсекунды, я просто имел в виду в реальном времени, как в достаточно быстром, чтобы вы не выиграли от «пакетной» работы с несколькими пользователями в сценарии 2 из OP. Опять же, я не знаком с термином «разветвление» (о котором, по-видимому, ссылается второй вариант OP, и вы также упоминаете), поэтому я, возможно, не полностью понял намерения 2.. .. Btw: Идти читать этот блог-пост, всегда приятно видеть архитектурные сообщения в дизайне схемы MongoDB –
отлично читал, я оставил комментарий в своем блоге с соответствующим вопросом, который вы, возможно, захотите прочитать. Спасибо –
Ребята, большое спасибо за предложения. Я отмечаю пост @mnemosyn как ответ, поскольку он имеет смысл. Я прочитаю ваш блог и посмотрю, где он меня принимает. Опять же, спасибо журналу за все ваши предложения. –