Каковы преимущества использования бессхемовой базы данных, такой как MongoDB, по сравнению с реляционной базой данных?
Я привык использовать реляционные базы данных, такие как MySQL или PostgreSQL, и в сочетании с инфраструктурами MVC, такими как Symfony, RoR или Django, и я думаю, что это прекрасно работает.
Но в последнее время я много слышал о MongoDB, которая является нереляционной базой данных, или, чтобы процитировать официальное определение,
масштабируемая, высокопроизводительная, с открытым исходным кодом, без схемы, ориентированная на документы база данных.
Я действительно заинтересован в том, чтобы быть на грани, и хочу знать обо всех возможностях, которые у меня будут для следующего проекта, и выбирать лучшие технологии там.
В каких случаях использование MongoDB (или аналогичных баз данных) лучше, чем использование "классических" реляционных баз данных? И каковы преимущества MongoDB по сравнению с MySQL в целом? Или, по крайней мере, почему это так отличается?
Если у вас есть ссылки на документацию и / или примеры, это также очень поможет.
9 ответов
Вот некоторые из преимуществ MongoDB для создания веб-приложений:
- Модель данных на основе документов. Базовая единица хранения аналогична JSON, словарям Python, хэшам Ruby и т. Д. Это богатая структура данных, способная хранить массивы и другие документы. Это означает, что вы часто можете представлять в одной сущности конструкцию, которая потребовала бы нескольких таблиц для правильного представления в реляционном БД. Это особенно полезно, если ваши данные неизменны.
- Глубокая возможность запроса. MongoDB поддерживает динамические запросы к документам, используя основанный на документе язык запросов, почти такой же мощный, как SQL.
- Нет миграций схемы. Поскольку MongoDB не содержит схемы, ваш код определяет вашу схему.
- Четкий путь к горизонтальной масштабируемости.
Вам нужно будет прочитать больше об этом и поиграть с ним, чтобы получить лучшее представление. Вот онлайн демо:
Есть множество преимуществ.
Например, ваша схема базы данных будет более масштабируемой, вам не придется беспокоиться о миграциях, код будет более приятным для написания... Например, вот один из кодов моей модели:
class Setting
include MongoMapper::Document
key :news_search, String, :required => true
key :is_availaible_for_iphone, :required => true, :default => false
belongs_to :movie
end
Добавление ключа - это просто добавление строки кода!
Есть и другие преимущества, которые появятся в долгосрочной перспективе, такие как лучшая масштабируемость и скорость.
... Но имейте в виду, что нереляционная база данных не лучше, чем реляционная. Если ваша база данных имеет много связей и нормализации, возможно, не имеет смысла использовать что-то вроде MongoDB. Это все о поиске подходящего инструмента для работы.
Чтобы прочитать больше, я бы порекомендовал взглянуть на " Почему я считаю Mongo для баз данных тем же, чем Rails для Frameworks" или на этом посте на веб-сайте mongodb. Чтобы быть в восторге и если вы говорите по-французски, взгляните на эту статью, объясняющую, как настроить MongoDB с нуля.
Редактировать: Я почти забыл рассказать вам об этом Railscast ryanb. Это очень интересно и хочется сразу начать!
Преимущество отсутствия схемы заключается в том, что вы можете сбросить любой загруженный вами груз, и никто никогда не будет иметь оснований жаловаться на него или говорить, что это неправильно.
Это также означает, что все, что вы добавляете в него, остается полностью лишенным смысла после того, как вы это сделали.
Некоторые отметили бы это как серьезный недостаток, другие - нет.
Тот факт, что реляционная база данных имеет устоявшуюся схему, является следствием того факта, что она имеет устоявшийся набор расширенных предикатов, которые позволяют нам придавать значение тому, что записано в базе данных, и которые также необходимая предпосылка для нас.
Без устоявшейся схемы, без предикатов экстенсиональности и без предикатов экстенсиональности у пользователя не было бы никакого смысла делать какие-либо выводы из того, что было в нее заложено.
MongoDB был представлен на еженедельнике FLOSS на этой неделе - http://twit.tv/floss105 База данных, использующая аналогичную концепцию, - CouchDB, которая была представлена на другом еженедельнике FLOSS: http://twit.tv/floss36
Я думаю, что стоит слушать тех, в дополнение к ссылкам, предоставленным @marcgg
Мой опыт работы с Postgres и Mongo после работы с обеими базами данных в моих проектах.
Postgres (СУБД)
Postgres рекомендуется, если ваши будущие приложения имеют сложную схему, которая требует большого количества соединений, или если у всех данных есть отношения, или если у нас тяжелая запись. Postgres - это открытый исходный код, более быстрый, совместимый с ACID, который использует меньше памяти на диске, а также обладает хорошей производительностью для хранилища JSON и включает полную сериализуемость транзакций с 3 уровнями изоляции транзакций.
Самое большое преимущество пребывания в Postgres - это то, что у нас есть лучшее из обоих миров. Мы можем хранить данные в JSONB с ограничениями, согласованностью и скоростью. С другой стороны, мы можем использовать все функции SQL для других типов данных. Базовый механизм очень стабилен и хорошо справляется с хорошим диапазоном объемов данных. Он также работает на выбранном вами оборудовании и операционной системе. Postgres предоставляет возможности NoSQL наряду с полной поддержкой транзакций, хранит документы JSON с ограничениями на данные полей.
Общие ограничения для Postgres
Масштабирование Postgres по горизонтали значительно сложнее, но выполнимо.
Операции быстрого чтения не могут быть полностью выполнены с помощью Postgres.
НЕТ баз данных SQL
Монго БД (Wired Tiger)
MongoDB может превзойти Postgres в измерении "горизонтальной шкалы". Хранение JSON - это то, для чего оптимизирован Mongo. Mongo хранит свои данные в двоичном формате, называемом BSONb, который (приблизительно) является просто двоичным представлением надмножества JSON. MongoDB хранит объекты в точности так, как они были спроектированы. Согласно MongoDB, для приложений с интенсивной записью Монго говорит, что новый механизм (Wired Tiger) дает пользователям увеличение производительности записи до 10 раз (я должен попробовать это) с 80-процентным сокращением использования хранилища, помогая снизить затраты на хранение. добиться большего использования аппаратного обеспечения.
Общие ограничения MongoDb
Использование механизма хранения без схемы приводит к проблеме неявных схем. Эти схемы не определяются нашим механизмом хранения, а определяются исходя из поведения и ожиданий приложения.
Автономные технологии NoSQL не соответствуют стандартам ACID, поскольку они жертвуют защитой критических данных в пользу высокой пропускной способности для неструктурированных приложений. Несложно применить ACID к базам данных NoSQL, но это сделает базу данных медленной и до некоторой степени негибкой. "Большинство ограничений NoSQL были оптимизированы в новых версиях и выпусках, которые в значительной степени преодолели свои предыдущие ограничения".
Это все о компромиссах. MongoDB быстрый, но не ACID, у него нет транзакций. Это лучше, чем MySQL в некоторых случаях использования и хуже в других.
Сильфонные линии, написанные на MongoDB: полное руководство.
Есть несколько веских причин:
- Хранение разных видов документов в одной коллекции может стать кошмаром для разработчиков и администраторов. Разработчики должны убедиться, что каждый запрос возвращает только документы определенного вида или что код приложения, выполняющий запрос, может обрабатывать документы различной формы. Если мы запрашиваем сообщения в блоге, то отсеивать документы, содержащие данные об авторах, непросто.
- Получить список коллекций гораздо быстрее, чем извлечь список типов в коллекции. Например, если бы у нас был ключ типа в коллекции, в котором было указано, является ли каждый документ документом "skim", "whole" или "chunky monkey", было бы намного медленнее найти эти три значения в одной коллекции, чем иметь три отдельные коллекции и запросить их имена
- Группирование документов одного и того же вида вместе в одной коллекции обеспечивает локальность данных. Получение нескольких постов в блоге из коллекции, содержащей только посты, вероятно, потребует меньше операций поиска на диске, чем получение тех же постов из коллекции, содержащей посты и данные об авторах.
- Мы начинаем навязывать некоторую структуру нашим документам при создании индексов. (Это особенно верно в случае уникальных индексов.) Эти индексы определяются для каждой коллекции. Помещая в одну коллекцию только документы одного типа, мы можем более эффективно индексировать наши коллекции.
После вопроса о базах данных с текстовым хранилищем) я взглянул на MongoDB и подобные системы.
Если я правильно понял, они должны быть проще в использовании и настройке, и гораздо быстрее. Возможно также более безопасный, поскольку отсутствие SQL предотвращает внедрение SQL...
По-видимому, MongoDB используется в основном для веб-приложений.
По сути, они утверждают, что сами базы данных не подходят для сложных запросов, интеллектуального анализа данных и т. Д. Но они позволяют быстро извлекать много плоских данных.
- MongoDB поддерживает поиск по полям, поиск по регулярным выражениям. Включает определенные пользователем функции Java-скрипта.
- MongoDB можно использовать в качестве файловой системы, используя преимущества балансировки нагрузки и функции репликации данных на нескольких компьютерах для хранения файлов.