Плюсы / минусы баз данных на основе документов и реляционных баз данных - PullRequest
69 голосов
/ 03 декабря 2008

Я пытался выяснить, смогу ли я выполнить некоторые требования с базой данных на основе документов, в данном случае CouchDB. Два общих требования:

  • CRUD сущностей с некоторыми полями, для которых имеется уникальный индекс
  • Веб-приложение для электронной коммерции, такое как eBay (, подробное описание здесь ).

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

Можете ли вы объяснить мне, если Я прошу груши из вяза , когда я пытаюсь использовать документно-ориентированную базу данных для этих требований?

Ответы [ 6 ]

34 голосов
/ 03 декабря 2008

Вам нужно подумать о том, как вы подходите к приложению ориентированным на документы способом. Если вы просто попытаетесь повторить, как вы бы смоделировали проблему в СУБД, вы потерпите неудачу. Есть также различные компромиссы, которые вы, возможно, захотите сделать. ([ed: не уверен, как это связано с аргументом, но:] Помните, что дизайн CouchDB предполагает, что у вас будет активный кластер из множества узлов, которые могут выйти из строя в любой момент. Как ваше приложение будет обрабатывать один из узлов базы данных, исчезающий из под ним?)

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

Еще один аспект, о котором вы должны подумать, это возможная последовательность, когда вы в конечном итоге попадете в согласованное состояние, но вы можете быть непоследовательным в течение некоторого периода времени. Это анафема на земле СУРБД, но она чрезвычайно распространена в реальном мире. Пример канонической транзакции - перевод денег с банковских счетов. Как это на самом деле происходит в реальном мире - через отдельные атомные транзакции или через разные банки, выдающие друг другу кредитные и дебетовые уведомления? Что происходит, когда вы пишете чек?

Итак, давайте посмотрим на ваши примеры:

  • CRUD сущностей с некоторыми полями с уникальным индексом.

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

Итак, нам нужно взглянуть на проблему реального мира и посмотреть, сможем ли мы ее смоделировать. Вам действительно нужно, чтобы они были уникальными? Может ли ваше приложение обрабатывать несколько документов с одинаковым значением? Вам нужно назначить уникальный идентификатор? Вы можете сделать это детерминистически? Распространенный сценарий, когда это требуется, - это когда вам нужен уникальный последовательный идентификатор. Это сложно решить в реплицированной среде. На самом деле, если уникальный идентификатор должен быть строго последовательным по отношению к созданному времени, невозможно , если , то вам нужен идентификатор сразу. Вам нужно ослабить хотя бы одно из этих ограничений.

  • веб-приложение для электронной коммерции, например ebay

Я не уверен, что добавить сюда, так как последний комментарий, который вы сделали к этому сообщению, должен был сказать: «Очень полезно! Спасибо». Было ли что-то упущено в подходе, изложенном там, что все еще вызывает у вас проблемы? Я думал, что ответ MrKurt был довольно полным, и я добавил небольшое улучшение, которое уменьшило бы разногласия.

14 голосов
/ 03 декабря 2008

Нужно ли нормализовать данные?

  • Да: использовать реляционные.
  • Нет: использовать документ.
7 голосов
/ 14 июня 2010

Я в одной лодке, сейчас мне нравится couchdb, и я думаю, что весь функциональный стиль великолепен. Но когда именно мы начинаем использовать их в лучшем случае для приложений. Я имею в виду, да, мы все можем начать разрабатывать приложения очень быстро, без лишних раздумий, когда все эти неприятные помехи о том, что нормальная форма оставлена ​​на обочине и не используют схемы. Но, чтобы придумать фразу «мы стоим на плечах гигантов». Есть веская причина использовать СУБД, нормализовать и использовать схемы. Моя старая голова оракула шатается, думая о данных без формы.

Мой главный вау-фактор на couchdb - это репликация и система управления версиями, работающая в тандеме.

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

Пока что я думаю о документах xml, файлах конфигурации, файлах ресурсов, передаваемых в строки base64.

Но я бы использовал couchdb для структурных данных. Я не знаю, любая помощь высоко ценится по этому вопросу.

Может быть полезно для хранения данных RDF или даже текста в свободной форме.

4 голосов
/ 27 января 2010

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

  • ProductID
  • Описание
  • UnitPrice
  • LotSize
  • Технические характеристики

И это поле «Спецификации» будет фактически содержать ссылку на документ с техническими характеристиками продукта. Таким образом, вы получите лучшее из обоих миров.

3 голосов
/ 03 декабря 2008

БД на основе документов лучше всего подходят для хранения документов. Lotus Notes является распространенной реализацией, и в качестве примера можно привести электронную почту Notes. Для того, что вы описываете, eCommerce, CRUD и т. Д., Реальные БД лучше разработаны для хранения и извлечения индексированных элементов данных / элементов (в отличие от документов).

0 голосов
/ 06 декабря 2011

Re CRUD: вся парадигма REST отображается непосредственно в CRUD (или наоборот). Так что, если вы знаете, что можете моделировать свои требования с помощью ресурсов (идентифицируемых через URI) и базового набора операций (а именно CRUD), вы можете быть очень близки к системе на основе REST, которую предоставляют довольно многие системы, ориентированные на документы. коробки.

...