Подтвердить что ты не робот

Я что-то пропустил в базе данных документов?

Я смотрел на рост движения NoSql и сопровождающий рост популярности баз данных документов, таких как mongodb, ravendb и другие. Хотя об этом очень много, я чувствую, что не понимаю что-то важное.

Скажем, что вы реализуете приложение хранилища и хотите хранить в продуктах базы данных, все из которых имеют одну уникальную категорию. В реляционных базах данных это будет достигнуто за счет наличия двух таблиц, продукта и таблицы категорий, а таблица продуктов будет иметь поле (называемое, возможно, "category_id" ), которое будет ссылаться на строку в таблице категорий, содержащую правильную запись категории. Это имеет ряд преимуществ, в том числе неповторяемость данных.

Это также означает, что, если вы ошибочно указали название категории, вы можете обновить таблицу категорий, а затем зафиксировать ее, поскольку это единственное место, которое имеет значение.

Однако в документах баз данных это не так. Вы полностью денормализуете, что означает в документе "товары", вы действительно имели бы значение, содержащее фактическую строку категории, что приводило бы к большому количеству повторений данных, а ошибки намного сложнее исправить. Размышляя об этом больше, разве это не означает, что выполнение запросов типа "дать мне все продукты с этой категорией" может привести к результату, который не имеет целостности.

Конечно, путь вокруг этого заключается в том, чтобы повторно реализовать целую "category_id" вещь в базе данных документа, но когда я доберусь до этого момента, я понимаю, что я должен просто оставаться с реляционными базами данных вместо повторной реализации их.

Это заставляет меня поверить, что мне не хватает ключевого момента в отношении баз данных документов, который приводит меня к этому неправильному пути. Поэтому я хотел поместить его в стек-переполнение, чего мне не хватает?

4b9b3361

Ответ 1

Вы полностью денормализуете, что означает в документе "товары", у вас действительно будет значение, содержащее фактическую строку категории, что приведет к большому количеству повторений данных [...]

Правда, денормализация означает хранение дополнительных данных. Это также означает меньшую сборку (таблицы в SQL), что приводит к меньшему соотношению между частями данных. Каждый отдельный документ может содержать информацию, которая в противном случае приходила бы из нескольких таблиц SQL.

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

[...] и ошибки намного сложнее исправить.

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

Одно из преимуществ базы данных документов заключается в том, что она без схемы. Вы полностью можете свободно определять содержимое документа; вы не привязаны к предопределенному набору таблиц и столбцов, поскольку вы используете базу данных SQL.

Пример реального мира

Если вы создаете CMS поверх базы данных SQL, у вас будет либо отдельная таблица для каждого типа контента CMS, либо отдельная таблица с общими столбцами, в которых вы сохраняете все типы контента. С отдельными таблицами у вас будет множество таблиц. Просто подумайте обо всех таблицах соединений, которые вам понадобятся для таких вещей, как теги и комментарии для каждого типа контента. С одной общей таблицей ваше приложение отвечает за правильное управление всеми данными. Кроме того, необработанные данные в вашей базе данных трудно обновить и совершенно бессмысленны вне вашего приложения CMS.

С помощью базы данных документов вы можете хранить каждый тип контента CMS в одной коллекции, сохраняя при этом строго определенную структуру внутри каждого документа. Вы также можете хранить все теги и комментарии в документе, делая извлечение данных очень эффективным. Эта эффективность и гибкость достигаются по цене: ваше приложение более отвечает за управление целостностью данных. С другой стороны, цена масштабирования с помощью базы данных документов намного меньше по сравнению с базой данных SQL.

Совет

Как вы можете видеть, решения SQL и NoSQL имеют преимущества и недостатки. Как уже указывал David , каждый тип имеет свои применения. Я рекомендую проанализировать ваши требования и создать две модели данных: одну для SQL-решения и одну для базы данных документов. Затем выберите решение, которое лучше всего подходит, учитывая масштабируемость.

Ответ 2

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

Были созданы базы данных документов для решения проблемы, которая (смотря на нее наоборот), реляционные базы данных - это не лучший способ решить каждую проблему. Оба проекта имеют свое применение, и по своей сути они лучше других.

Взгляните на примеры использования на веб-сайте MongoDB: http://www.mongodb.org/display/DOCS/Use+Cases

Ответ 3

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

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

Это означает, что еще сложнее проверить правильность хранения данных в базе данных в приложении.

Например, у вас есть две коллекции, каждая из которых содержит около 10000 записей. Теперь вы хотите узнать, какие идентификаторы присутствуют в "таблице" A, которые отсутствуют в "таблице" B.

Тривиально с SQL, намного сложнее с MongoDB.

Но мне нравится MongoDB!!

Ответ 4

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

Пример:

{   '@rid': 10: 3,    "@class": "Клиент",   '@ver': 3,   'name': 'Jay',    "фамилия": "Шахтер",    "изобрел": ['Amiga'] }

В этом примере поля "имя" и "фамилия" являются мандатами (путем их определения в схеме), но поле "изобретено" создано только для этого документа. Все ваше приложение должно не знать об этом, но вы можете выполнять запросы против него:

ВЫБЕРИТЕ ОТ клиента, где изобретен IS NOT NULL

Он вернет только документы с полем "изобретен".