#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 /