Подойдет ли MongoDB для сайта социальной сети (разработанного на Ruby on Rails)?

#sql #ruby-on-rails #mongodb #social-networking #nosql

#sql #ruby-on-rails #mongodb #социальная сеть #nosql

Вопрос:

Мой проект (на Ruby on Rails 3) заключается в разработке сайта «социальной сети» со следующими функциями:

  • Пользователи могут дружить. Это взаимная дружба; не асимметричная, как Twitter.
  • Пользователи могут публиковать ссылки, чтобы делиться ими. Друзья пользователя могут видеть, чем поделился этот пользователь.
  • Друзья могут комментировать эти общие ссылки.

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

Я думаю, что смогу справиться с таким уровнем сложности с помощью SQL и RoR.

Мой вопрос таков: было бы хорошей идеей использовать MongoDB (или CouchDB) для такого сайта?

Честно говоря, я думаю, что ответ отрицательный. MongoDB, похоже, не очень хорошо подходит для отношений «многие ко многим». Я не могу придумать хороший способ MongoDB реализовать дружеские отношения. И я читал, что Diaspora начинала с MongoDB, но затем переключилась обратно на классический SQL.

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

Кроме того, я слышал о graph DB, которые, вероятно, великолепны, но они действительно кажутся мне слишком молодыми, и я не знаю, как они будут сочетаться с RoR (не говоря уже о heroku).

Итак, я что-то упускаю?

Комментарии:

1. Это может помочь вам выбрать: blog. nahurst.com/visual-guide-to-nosql-systems

2. @JimmyCuadra: Должен сказать, я не совсем понял схему. Наверное, я недостаточно разбирался в базах данных, чтобы действительно понять, что поставлено на карту с трех сторон этого треугольника. Но все равно спасибо!

Ответ №1:

Мой совет был бы использовать то, с чем вы лучше всего знакомы, чтобы вы могли быстро приступить к работе. Из вашего вопроса следует, что это будет SQL, а не MongoDB.

Комментарии:

1. Однако, с другой стороны, думая подобным образом, вы никогда не научитесь чему-то новому!

2. Верно, но это зависит от вашей цели. Ваша цель — научиться чему-то новому или завершить проект? Похоже, ваша цель — последнее, именно поэтому я рекомендовал использовать то, что вы знаете. С другой стороны, если ваша цель — изучить новую технологию, то непременно поиграйте с MongoDB.

Ответ №2:

Мне нравится MongoDB, и я часто им пользуюсь, но я придерживаюсь мнения, что если вы имеете дело с реляционными данными, вы должны использовать правильный инструмент для этого. Для этого у нас есть реляционные базы данных. Mongo и Couch — это хранилища документов.

У Mongo есть серьезный недостаток, если вы собираетесь поддерживать много ссылок между документами. Записи гарантированно будут атомарными только для одного документа. Таким образом, у вас могут быть несогласованные обновления для отношений, если вы не будете осторожны со своей схемой.

Преимущество MongoDB в том, что он очень хорош в масштабировании. Вы можете сегментировать и создавать наборы реплик. В настоящее время Foursquare использует MongoDB, и он довольно хорошо работает для них. MongoDB также уменьшает отображение и имеет достойную геопространственную интеграцию. Команда, которая разрабатывает MongoDB, превосходна, и я живу в Нью-Йорке, где они базируются, и познакомился с ними. Вероятно, у вас не возникнет проблем с масштабированием, хотя я бы подумал, что для начала.

Что касается переключения диаспоры… Я бы не хотел следить за тем, что они делают 🙂

Однако ваш комментарий о graph dbs интересен. Я бы, вероятно, также не стал использовать graph DB в качестве основной базы данных, но, имея дело с отношениями, вы можете делать с ними удивительные вещи. На самом деле обычно демонстрация, которую вам предоставят ребята из компаний graph DB, заключается в извлечении знаний о взаимоотношениях из социальной сети. Однако ничто не мешает вам использовать их в будущем для сетевого анализа.

В заключение, когда вы начинаете здесь, вы еще не сталкиваетесь с проблемами массового масштаба и, вероятно, ограничены во времени и деньгах. Имейте в виду, что даже Facebook не использует только одну технологию, они в основном расширились до NoSQL для определенных функций (например, Facebook messaging). Ничто не мешает вам в будущем использовать, скажем, Mongo и GridFS для обработки загрузки изображений или географического расположения и т.д. Хорошо расти по мере изменения ваших потребностей. Я думаю, что ваше внутреннее ощущение того, что у вас здесь есть SQL-приложение, верно, и преимущества, полученные с помощью MongoDB, не будут реализованы какое-то время.

Комментарии:

1. Спасибо. Наверное, я стал жертвой шумихи вокруг MongoDB… И да, у меня также есть ощущение, что идея состояла бы в том, чтобы использовать для каждой функциональности ту базу данных, которая лучше всего соответствует ее назначению (это было на английском?). Но я боюсь, что это создаст беспорядок. В любом случае, для основных функциональных возможностей моего проекта я буду придерживаться одного решения DB, и это SQL. Спасибо за ваш ответ.

2. также, из любопытства, почему такое резкое замечание о Diaspora? Я не следил за их историей

3. @arthur в сентябре они выпустили какой-то код, который указывал, что они понятия не имеют, что делают. Существовали серьезные проблемы с безопасностью, о которых знал бы даже начинающий программист. Некоторые защищали его, когда выпускали альфа-версию программного обеспечения, но если вы создаете контроллер удаления и не проверяете авторизацию (т. Е. Любой вошедший в систему может удалить любую учетную запись), что-то не так. (это была одна из многих проблем) kalzumeus.com/2010/09/22 … неплохо подводит итог.

4. @MichaelPapile Я думаю, что моделирование данных и безопасность — это две довольно разные области. Один из разработчиков из Диаспоры написал вдумчивую статью о том, почему mongodb им не подошел: sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb .

5. @mehaase Я согласен со многими вещами, которые были сказаны в том сообщении в блоге, но это связано с тем, что они не могли видеть, что их данные не подходят для хранилища документов. У многих людей была эта проблема, но они использовали mongo из-за того, что он позиционировался как универсальная база данных, хотя на самом деле это не так. Я придерживаюсь утверждения, что, по моему мнению, программисты Диаспоры не знали, что они делали 2 года назад. Вероятно, с тех пор они научились. Я знаю, что это разные домены, но я бы ожидал, что разработчик должен обладать очень базовыми знаниями об обоих.

Ответ №3:

Интересной возможностью для этого является Riak. Это нечто среднее между хранилищем значений ключей и графической базой данных. Идентификатором пользователя может быть ваш ключ, а комментарии и ссылки могут храниться в вашем значении. Но Riak также имеет привязку «ключ к ключу». Это можно использовать для объединения ваших пользователей в друзья. Привязка асимметрична, поэтому вам придется иметь дело с добавлением и удалением в обоих направлениях, но это не должно быть слишком сложно.

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

Возможно, вы также захотите ознакомиться с другими графическими базами данных. Социальные графы являются прототипом базы данных graph.

Комментарии:

1. Шон Криббс создал отличный Ruby-клиент для Riak под названием Ripple. seancribbs.com

Ответ №4:

Извините, но вам нужно начать изучать графики. Используйте графические базы данных, которые выдают данные в формате JSON и записывают их в вашу базу данных Mongodb.Вы имеете дело с сетью, а это значит, что должен быть какой-то график, который позволит вам создать эго (пользователя, например) или координационную точку, или логический центр, который связан с другими узлами вокруг него.Узлами могут быть свойства конкретного пользователя, такие как имя, лайки, друзья, картинки и т.д. Если бы вы рисовали эго-график, он напоминал бы ступицу и спицы.

Для дальнейшего чтения вы можете обратиться к тому, как Facebook реализовал свой Graph API — https://developers.facebook.com/docs/graph-api/overview /

Вот попытка подключить Mongodb и графическую базу данных Neo4j — https://neo4j.com/developer/mongodb /