Пример задачи, которую база данных NoSQL не может обработать (если есть) - PullRequest
12 голосов
/ 26 марта 2011

Я хотел бы проверить мир NoSQL. Это просто любопытство, а не абсолютная потребность (пока). Я прочитал несколько вещей о различиях между базами данных SQL и NoSQL. Я убежден в потенциальных преимуществах, но немного беспокоюсь о случаях, когда NoSQL не применим. Если я понимаю, базы данных NoSQL по существу пропускают свойства ACID.

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

Прекрасным примером будет то, где не может быть никакого обходного пути без модификации ядра базы данных. Примеры, где база данных NoSQL просто плохо работает, в конечном итоге станут другим вопросом, но здесь я хотел бы увидеть, когда теоретически мы просто не можем использовать такую ​​технологию.

Может быть, поиск такого примера зависит от базы данных. Если это так, давайте возьмем MongoDB для представления мира NoSQL.

Edit: чтобы прояснить этот вопрос, я не хочу спорить о том, какая база данных лучше для определенных случаев. Я хочу знать, может ли эта технология быть абсолютным тупиком в некоторых случаях, потому что, как бы мы ни старались, какие-то функции, которые база данных SQL обеспечивает , не могут быть реализованы поверх хранилищ nosql. Поскольку существует много доступных хранилищ nosql, я могу согласиться выбрать существующее хранилище nosql в качестве поддержки, но меня больше всего интересует минимальное подмножество функций, которые должен обеспечить хранилище, чтобы иметь возможность реализовывать функции более высокого уровня (например, могут ли транзакции реализовываться магазин, который не предоставляет X ...).

Ответы [ 6 ]

16 голосов
/ 26 марта 2011

Этот вопрос немного напоминает вопрос о том, какую программу нельзя написать на императивном / функциональном языке.Любой Turing-полный язык и выразить каждую программу, которая может быть решена с помощью Turing Maching.Вопрос в том, действительно ли вы, как программист, действительно хотите написать систему учета для компании из списка Fortune 500 с помощью непереносимых машинных инструкций.

В конце концов, NoSQL может делать все, что могут механизмы на основе SQL, разница в том, что выкак программист может нести ответственность за логику в чем-то вроде Redis, который MySQL предоставляет вам бесплатно.В базах данных SQL очень консервативный взгляд на целостность данных.Движение NoSQL ослабляет эти стандарты для повышения масштабируемости и упрощения задач, общих для веб-приложений.

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

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

Redis и другие хранилища значений ключей требуют, чтобы программист написал большую часть индекса и присоединился к логике, котораявстроен в базы данных SQL.В обмен приложение может использовать знания предметной области о своих данных, чтобы сделать индексы и объединения более эффективными, чем общее решение, которое потребует SQL.Redis также требует, чтобы все данные помещались в ОЗУ, но взамен дает производительность наравне с Memcache.

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

10 голосов
/ 26 марта 2011

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

Естьхранилища документов (MongoDB, CouchDB), которые отлично подходят для управления контентом и аналогичных ситуациях, когда у вас есть плоский набор переменных атрибутов, которые вы хотите построить вокруг темы.Возьмите сайт-настройку.Использование хранилища документов для управления пользовательскими атрибутами, которые определяют способ, которым пользователь хочет видеть свою страницу, хорошо подходит для платформы.Несмотря на свою рекламную шумиху, эти магазины не всегда хорошо масштабируются в терабайты.Это можно сделать, но это не идеально.MongoDB имеет много функций, обнаруженных в реляционных базах данных, таких как динамические индексы (до 40 на коллекцию / таблицу).CouchDB создан, чтобы быть абсолютно восстанавливаемым в случае сбоя.

Существуют хранилища ключей / значений (Cassandra, HBase ...), которые отлично подходят для высокораспределенных хранилищ.Кассандра для низких задержек, HBase для высоких задержек.Хитрость заключается в том, что вы должны определить потребности вашего запроса, прежде чем начинать вводить данные. Они не эффективны для динамических запросов к любому атрибуту.Например, если вы создаете службу регистрации событий клиента, вы хотите установить свой ключ на уникальный атрибут клиента.Оттуда вы можете вставить различные структуры журналов в свой магазин и получить все журналы по ключу клиента по запросу.Однако было бы гораздо дороже попытаться просмотреть журналы в поисках событий журнала, в которых тип был «сбой», если только вы не решили сделать этот ключ второстепенным.Еще одна вещь: в последний раз, когда я смотрел на Cassandra, вы не могли запустить regexp внутри запроса M / R.Это означает, что, если вы хотите искать шаблоны в поле, вам придется извлечь все экземпляры этого поля и затем запустить его через регулярное выражение, чтобы найти нужные вам кортежи.

Базы данных графиков сильно отличаютсяиз двух выше.Отношения между предметами (объектами, кортежами, элементами) изменчивы.Они не масштабируются в терабайты, но это не то, для чего они предназначены.Они отлично подходят для того, чтобы задавать вопросы типа «эй, сколько из моих пользователей любят зеленый цвет? Из них сколько живет в Калифорнии?»С реляционной базой данных у вас будет статическая структура.С базой данных графов (я упрощаю, конечно), у вас есть атрибуты и объекты.Вы соединяете их, как это имеет смысл, без применения схемы.

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

Я также не стал бы помещать сложные структуры в любой из вышеупомянутых нереляционных хранилищ.Они плохо соединяются в масштабе.И это нормально, потому что это не тот способ, которым они должны работать.Там, где вы можете поместить идентификатор для address_type в таблицу customer_address в реляционной системе, вы захотите внедрить информацию address_type в кортеж клиента, хранящийся в документе или ключе / значении.Эффективность данных - это не область документа или хранилище ключей / значений.Дело в распределении и чистой скорости.Жертва - это след.

Существуют и другие подтипы семейства магазинов, помеченных как «nosql», которые я здесь не освещал.Существует множество (по последним подсчетам, 122) различных проектов, ориентированных на нереляционные решения проблем данных различных типов.Riak - еще один, о котором я продолжаю слышать и не могу ждать, чтобы попробовать.

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

Это чрезвычайно захватывающее время для работы в области управления данными. Вы должны попробовать несколько из них. Вы можете скачать Couch или Mongo и запустить их в считанные минуты. HBase немного сложнее.

В любом случае, я надеюсь, что я сообщил, не путая, что я достиг просветления без существенной предвзятости или ошибки.

9 голосов
/ 26 марта 2011

СУБД хороши в соединениях, движки NoSQL обычно нет. Движки NoSQL хороши в распределенной масштабируемости, а СУБД обычно нет.

СУБД хороши при проверке данных, в отличие от движков NoSQL. Движки NoSQL хороши в гибких и не требующих схем подходах, а СУБД обычно нет.

Оба подхода могут решить любой набор проблем; разница в эффективности.

2 голосов
/ 26 марта 2011

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

Также как @ Дмитрий сказал, что mongodb открывает дверь для легкого горизонтального и вертикального масштабирования с репликацией и разбиением.

1 голос
/ 26 марта 2011

RDBM действительно хороши для быстрого суммирования сумм, средних значений и т. Д. Из таблиц.например, SELECT SUM(x) FROM y WHERE z.Это удивительно сложно сделать в большинстве баз данных NoSQL, если вы хотите получить ответ сразу.В некоторых хранилищах NoSQL отображение / уменьшение является способом решения одной и той же задачи, но это не настоящее время, как в мире SQL.

1 голос
/ 26 марта 2011

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

Типичным примером является банковская транзакция, когда пользователь снимает деньги, узел A обновляется этим событием, если в то же время узел B запрашивает баланс этого пользователя, он может вернуть устаревший баланс. Этого не может произойти в СУБД, поскольку атрибут согласованности гарантирует, что данные обновляются до того, как их можно будет прочитать.

...