Когда использовать MongoDB или другие системы баз данных, ориентированные на документы? [закрытый]
мы предлагаем платформу для видео - и аудио-роликов, фотографий и векторной графики. Мы начали с MySQL в качестве бэкэнда базы данных и недавно включили MongoDB для хранения всей метаинформации файлов, потому что MongoDB лучше соответствует требованиям. Например: фотографии могут иметь Exif информация, видео может иметь аудио-треки, где мы хотим хранить метаинформацию, тоже. Видео и векторной графики не разделяют какие-либо общие мета-данные и т. д. так что я знайте, что MongoDB идеально подходит для хранения этих неструктурированных данных и поддерживает их поиск.
тем не менее, мы продолжаем развивать нашу платформу и добавлять функции. Теперь одним из следующих шагов будет предоставление форума для наших пользователей. Вопрос, который сейчас возникает: используйте базу данных MySQL, которая была бы хорошим выбором для хранения форумов и форумных сообщений и т. д. или использовать MongoDB для этого тоже?
Итак, вопрос: когда использовать MongoDB и когда использовать СУБД. Что бы вы взяли, mongoDB или MySQL, если бы у вас был выбор, и зачем бы вы его взяли?
11 ответов:
на NoSQL: Если Бы Это Было Так Просто, автор пишет о MongoDB:
MongoDB не является хранилищем ключей / значений, это совсем немного больше. Это определенно не СУБД. Я не использовал MongoDB в производстве, но я использовал его немного, создавая тестовое приложение, и это очень классный комплект. Похоже, чтобы быть очень производительным и либо имеет или будет иметь в ближайшее время, отказоустойчивости и автоматического сегментирования (он же масштабными). Я думаю, что Монго может быть самым близким вещь для замены РСУБД, которую я видел до сих пор. Он не будет работать для всех наборов данных и шаблонов доступа, но он построен для вашего типичного материала CRUD. Хранение того, что по сути является огромным хэшем, и возможность выбора на любом из этих ключей-это то, для чего большинство людей используют реляционную базу данных. если ваша БД 3NF, и вы не делаете никаких соединений (вы просто выбираете кучу таблиц и складываете все объекты вместе, а также то, что большинство людей делают в веб-приложении), MongoDB, вероятно, надерет задницу вы.
затем, в заключение:
реальная вещь, чтобы указать, что если вы сдерживаетесь от создания чего-то супер удивительного, потому что вы не можете выбрать базу данных, вы делаете это неправильно. если вы знаете mysql, просто используйте его. Оптимизируйте, когда вам действительно нужно. Используйте его как магазин k/v, используйте его как СУБД, но ради бога, создайте свое приложение-убийца! Ничто из этого не будет иметь значения для большинства приложений. Facebook по-прежнему использует MySQL, много. Википедия использует MySQL, много. FriendFeed использует MySQL, много. NoSQL-отличный инструмент, но это, конечно, не будет вашим конкурентным преимуществом, это не сделает ваше приложение горячим, и, прежде всего, ваши пользователи не будут заботиться ни о чем из этого.
на чем я собираюсь построить свое следующее приложение? Наверное, Постгрес. Буду ли я использовать NoSQL? Возможно. Я мог бы также использовать Hadoop и Hive. Я мог бы держать все в плоских файлах. Может быть, я начну взламывать маглев. Я буду использовать все, что лучше для работы.если мне нужна отчетность, я не буду использовать NoSQL. если мне нужно кэширование, я, вероятно, буду использовать Tokyo Tyrant. если мне нужна кислотность, я не буду использовать NoSQL. если мне нужна тонна счетчиков, я буду использовать Redis. если мне нужны транзакции, я буду использовать Postgres.если у меня есть тонна одного типа документов, я, вероятно, буду использовать Mongo. если мне нужно писать 1 миллиард объектов в день, я бы, вероятно, использовал Волдеморта. Если мне нужен полнотекстовый поиск, я бы возможно, использовать Solr. Если мне нужен полнотекстовый поиск летучих данных, я бы, вероятно, использовал Sphinx.
Мне нравится эта статья, я нахожу ее очень информативной, она дает хороший обзор ландшафта NoSQL и шумихи. Но, и это самая важная часть, это действительно помогает задавать себе правильные вопросы, когда речь заходит о выборе между СУБД и NoSQL. Стоит почитать ИМХО.
после двух лет использования MongoDb для социального приложения я стал свидетелем того, что на самом деле означает жить без СУБД SQL.
- вы в конечном итоге пишете задания, чтобы делать такие вещи, как объединение данных из разных таблиц/коллекций, что-то, что СУБД будет делать для вас автоматически.
- ваши возможности запроса с помощью NoSQL сильно повреждены. MongoDb может быть самым близким к SQL, но он все еще очень далеко позади. Доверьтесь мне. SQL-запросы супер интуитивно понятный, гибкий и мощный. Запросы MongoDb-нет.
- запросы MongoDb могут извлекать данные только из одной коллекции и использовать только один индекс. И MongoDb, вероятно, является одной из самых гибких баз данных NoSQL. Во многих сценариях это означает больше обходов на сервер для поиска связанных записей. А затем вы начинаете де-нормализацию данных-что означает фоновые задания.
- тот факт, что это не реляционная база данных, означает, что у вас не будет (по мнению некоторых, это плохо выполнение) ограничения внешнего ключа для обеспечения согласованности данных. Я уверяю вас, что это в конечном итоге создаст несоответствия данных в вашей базе данных. Готовиться. Скорее всего, вы начнете писать процессы или проверки для обеспечения согласованности вашей базы данных, что, вероятно, не будет работать лучше, чем позволить СУБД сделать это за вас.
- забудьте о зрелых фреймворках, таких как hibernate.
Я считаю, что 98% всех проектов, вероятно, намного лучше с a типичная СУБД SQL, чем с NoSQL.
для хранения этих неструктурированных данных
Как вы сказали, MongoDB лучше всего подходит для хранения неструктурированных данных. И это может организовать ваши данные в формат документа. Эти СУБД альтенативы называются NoSQL хранилища данных ( MongoDB, CouchDB,Волдеморт) очень полезны для приложений, которые масштабируются массово и требуют более быстрого доступа к данным из этих больших хранилищ данных.
и реализации эти базы данных проще, чем обычные СУБД. Поскольку это простые двоичные объекты с ключом или в стиле документа, непосредственно сериализуемые на диск. Эти хранилища данных не применяют свойства кислоты и ни - схемы. Это не дает никаких сделки способностей. Таким образом, это может масштабироваться по-крупному, и мы можем добиться более быстрого доступа (как для чтения, так и для записи).
но в отличие от этого, RDBM применяет ACID и схемы на данных. Если вы хотели работать со структурированными данными вы можете идти вперед с РСУБД.
Я бы выбрал MySQL для создания форумы для такого рода вещи. Потому что это не будет масштабировать большой. И это очень простое (общее) приложение, которое имеет структурированные отношения между данными.
обратите внимание, что Mongo по существу хранит JSON. Если ваше приложение имеет дело с большим количеством объектов JS (с вложенностью), и вы хотите сохранить эти объекты, то есть очень сильный аргумент для использования Mongo. Это делает ваши слои DAL и MVC ультратонкими, потому что они не распаковывают все свойства объекта JS и не пытаются принудительно вписать их в структуру (схему), в которую они естественным образом не вписываются.
У нас есть система, которая имеет несколько сложных объектов JS в своем сердце, и мы любите Монго, потому что мы можем сохранить все очень, очень легко. Наши объекты также довольно аморфны и неструктурированы, и Монго впитывает это усложнение, не моргая. У нас есть пользовательский уровень отчетности, который расшифровывает аморфные данные для потребления человеком, и это было не так сложно разработать.
Я бы сказал, использовать СУБД, если вам нужны сложные транзакции. В противном случае я бы пошел с MongoDB - более гибким для работы, и вы знаете, что он может масштабироваться, когда вам нужно. (Я пристрастен хотя я работаю над проектом в MongoDB)
кому нужны распределенные, разделенные форумы? Может быть, Facebook, но если вы не создаете Facebook-конкурента, просто используйте Mysql, Postgres или все, что вам наиболее удобно. Если вы хотите попробовать MongoDB, хорошо, но не ожидайте, что он будет делать магию для вас. Он будет иметь свои причуды и общую гадость, как и все остальное, как я уверен, что вы уже обнаружили, если вы действительно уже работали над этим.
конечно, MongoDB может быть раздут и казаться легким на поверхности, но вы будете столкнетесь с проблемами, которые более зрелые продукты уже преодолели. Не поддавайтесь соблазну так легко, а скорее подождите, пока "nosql" созреет или умрет.
лично я думаю, что "nosql" завянет и умрет от фрагментации, так как нет установленных стандартов (почти по определению). Поэтому я лично не буду делать ставку на него для каких-либо долгосрочных проектов.
единственное, что может сохранить "nosql" в моей книге, это если он может легко интегрироваться в Ruby или аналогичные языки и сделать язык "постоянный", почти без каких-либо накладных расходов в кодировании и дизайне. Это может произойти, но я подожду до тех пор, не сейчас, и это должно быть более зрелым, конечно.
кстати, почему вы создаете форум с нуля? Есть тонны форумов с открытым исходным кодом, которые можно настроить в соответствии с большинством требований, если вы действительно не создаете следующее поколение форумов (в чем я сомневаюсь).
после посещения Devoxx 2011 и посещения презентации от 10Gen, я написал небольшой блог, сравнивая MongoDB с базами данных СУБД. MongoDB является одним из популярных баз данных Nosql. Пожалуйста, смотрите ниже:
Я видел, что многие компании используют MongoDB для аналитики в реальном времени из журналов приложений. Его схема-свобода действительно подходит для журналов приложений, где схема записи имеет тенденцию меняться время от времени. Кроме того, его Закрытая Коллекция функция полезна, потому что она автоматически удаляет старые данные, чтобы сохранить данные вписываются в память.
Это одна область, для которой я действительно думаю, что MongoDB подходит, но MySQL/PostgreSQL более рекомендуется в целом. Много документация и ресурсы разработчиков в интернете, а также их функциональность и надежность.
2 основные причины, почему вы можете предпочесть Монго являются
- гибкость в проектировании схемы (хранилище документов типа JSON).
- масштабируемость-просто сложите узлы, и он может масштабироваться по горизонтали довольно хорошо.
соответствующее для применений больших данных. СУБД не подходит для больших данных.
вы знаете, все эти вещи о соединениях и "сложных транзакциях" - но это был сам Монти, который много лет назад объяснил "необходимость" для фиксации / отката, сказав, что "все это делается в логических классах (а не в базе данных) в любом случае" - так что это то же самое снова и снова. То, что нужно, - это тупой, но невероятно аккуратный и быстрый механизм хранения/извлечения данных, для 99% того, что делают веб-приложения.
Как ранее сказал , вы можете выбрать между большим количеством вариантов, взгляните на все эти выборы: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
то, что я предлагаю, чтобы найти вашу лучшую комбинацию: MySQL + Memcache действительно отлично подходит, если вам нужна кислота, и вы хотите присоединиться к некоторым таблицам MongoDB + Redis идеально подходит для хранения документов Neo4J идеально подходит для графической базы данных
Что я делаю: я начинаю с MySQl + Memcache, потому что я привык, то я начать использовать другие базы данных. Например, в одном проекте вы можете объединить MySQL и MongoDB !
Comments