Эффективный способ создания отношений с базой данных NoSQL - PullRequest
5 голосов
/ 10 февраля 2012

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

Я застрял с созданием правильной схемы для базы данных. Существует несколько способов достижения такой функциональности (определение встроенных структур данных, таких как посты и комментарии в блоге, создание документа активности для каждого действия и т. Д.), Но в настоящее время я не могу решить, какой из них является лучшим с точки зрения производительности и масштабируемости.

Например, давайте посмотрим на реализацию людей, за которыми я следую. Вот пример документа пользователя.

User = { id: Integer, 
         username: String, 
         following: Array of Users,
         followers: Array of Users,
       }

Это кажется тривиальным. Я могу управлять следующим полем для каждого пользовательского действия (подписаться / отписаться), но что если пользователь, за которым я в данный момент следую, будет удален. Эффективно ли обновлять все записи пользователя, которые следуют за удаленным пользователем.

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

 Post = { id: Integer, 
          author: User, 
          body: Text,
        }

Так ли эффективен запрос последних сообщений типа;

 db.posts.find( { author: { $in : me.followers} } )

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Мне кажется, что вы пытаетесь использовать одно хранилище данных (в данном случае документно-ориентированную базу данных NoSQL) для выполнения (как минимум) двух разных требований. Первое, что вы, похоже, пытаетесь сделать, это хранить данные в хранилище, ориентированном на документы. Я собираюсь предположить, что у вас есть законные причины для этого.

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

Мой опыт показывает, что будет трудно (если не невозможно) получить единую базу данных NoSQL для удовлетворения всех функциональных и нефункциональных потребностей приложений среднего и большого размера. Например, последнее приложение, над которым я работаю, использует MongoDB, Redis и Neo4j помимо RDBMS. Я провел много времени, экспериментируя с технологиями, и остановился на этой комбинации. Я взял на себя обязательство использовать Spring 3 вместе с проектом Spring Data, и пока мой опыт был отличным.

0 голосов
/ 10 февраля 2012

Один из подходов, который работает, называется «Схема звезды».Если вы будете искать в Интернете или википедии, вы найдете много информации.

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