Итак ... эта вещь NoSQL - PullRequest
       4

Итак ... эта вещь NoSQL

46 голосов
/ 06 июля 2010

Я смотрю на MongoDB, и я очарован. Кажется (хотя я должен быть подозрительным), что в обмен на организацию моей базы данных немного другим способом, я получаю столько же производительности, сколько у меня процессоров и оперативной памяти бесплатно? Это кажется элегантным и гибким, но я не торгую так быстро, как с Rails. Так в чем же подвох? Что дает мне реляционная база данных, которую я не могу сделать так же или вообще с Монго? Другими словами, почему (кроме незрелости существующих систем NoSQL и устойчивости к изменениям) вся индустрия не может перейти с MySQL?

Как я понял, когда вы масштабируете, вы получаете MySQL для подачи Memcache. Теперь кажется, что я могу начать с чего-то столь же производительного с самого начала.

Я знаю, что не могу совершать транзакции через отношения ... когда это будет иметь большое значение?

Я читаю http://teddziuba.com/2010/03/i-cant-wait-for-nosql-to-die.html, но, насколько я понимаю, его аргумент в основном заключается в том, что реальным предприятиям, использующим реальные инструменты, не нужно избегать SQL, поэтому люди, которые чувствуют необходимость отказаться от него, делают это неправильно. Но ни одному «предприятию» не приходится иметь дело с почти таким же количеством одновременно работающих пользователей, как Facebook или Google, поэтому я не совсем понимаю его точку зрения. (Walmart имеет 1,8 миллиона сотрудников; Facebook имеет 300 миллионов пользователей).

Мне действительно любопытно по этому поводу ... Обещаю, я не троллю.

Ответы [ 8 ]

64 голосов
/ 06 июля 2010

Я также большой поклонник MongoDB.Тем не менее, это абсолютно не полная замена RDBMS.Facebook имеет 300 миллионов пользователей, но если некоторые из ваших друзей не появятся в списке один раз, или один из фотоальбомов отсутствует по случайному запросу, вы заметите?Возможно нет.Если ваше обновление статуса не распространяется на всех ваших друзей в течение нескольких минут, имеет ли это значение?Едва.Если бухгалтерские балансы Wal-Mart не синхронизированы, кто-нибудь потеряет голову?Определенно.

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

Большой толчок к NoSQL связан с тем фактом, что за последние 30 лет мы былииспользование систем RDMBS для обоих сценариев.Теперь у нас есть более подходящий инструмент для многих ситуаций.Некоторые, скорее всего, будут спорить.Но никто не будет спорить все.

14 голосов
/ 06 июля 2010

Я пишу это, но как спор к ответу Рекса.

Я оспариваю идею о том, что nosql не имеет отношения и является нечетким.

Я работал с CODASYL много лет назад с C и Cobol - отношения между сущностями в CODASYL очень тесные.

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

Часто считается само собой разумеющимся, что SQL является синонимом СУБД, но люди пишут драйверы SQL для CODASYL, XML, инвертированных наборов и т. Д.

СУБД / SQL не равны точности данных или отношений. Фактически, СУБД является постоянной причиной неточности и неправильного восприятия отношений. Я не понимаю, как СУБД предлагают лучшую целостность данных и отношений, чем, например, hadoop. Поставьте слой JDO - и мы сможем построить сеть хороших и чистых отношений между сущностями в hadoop.

Однако мне нравится работать с SQL, потому что он дает мне возможность писать сценарии adhoc, хотя я понимаю, что adhoc отношения являются постоянной причиной фальсификации отношений и проблем.

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

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

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

Но тогда вы можете возразить, что СУБД также позволяет гибко изменять ваши отношения, поскольку именно в этом SQL работает лучше всего. Правда, очень верно - пока вы выполняете BCNF или даже 4NF. В противном случае вы начнете видеть, что ваши запросы и загрузчики данных выполняют реплицированные операции. Но затем, благодаря многолетнему опыту работы с RDBMS, вы, по крайней мере, поняли, что BCNF очень дорогой и неэффективный в работе, и что мы постоянно виновны в 2,5 NFing в наших схемах.

Сказать, что СУБД и SQL поддерживают целостность данных и отношений, является грубым заблуждением. Либо вы работаете в такой маленькой компании, либо не оставались на своих должностях более двух лет - вы не увидите объем данных или информационную мутацию, а также проблемы, вызванные СУБД. Злоупотребление СУБД является причиной того, что руководители ограничивают представление компьютерных приложений, и причиной финансовых неудач компаний, которые не видят изменений в поведении рынка, потому что их взгляды были ограничены программистами, чьи взгляды были ограничены их почитанием своих любимых. Схемы СУБД.

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

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

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

10 голосов
/ 07 июля 2010

Позвольте мне ответить на вопросы по одному:

Я знаю, что не могу совершать транзакции через отношения ... когда это будет иметь большое значение?

Каскадное изображение удаляется. Или даже просто базовая ссылочная целостность. Понятие «внешние ключи» не может быть действительно применено к «коллекциям» (монгольский термин для таблиц). Вы можете делать атомарные записи только в один «документ» (запись AKA). Поэтому, если у вас есть проблема с БД, вы можете потерять данные в БД.

Я получаю столько же производительности, сколько у меня процессоров и оперативной памяти бесплатно?

Не бесплатно, но определенно с другим набором компромиссов. Например, Mongo отлично справляется с поиском по одной записи, ключу / значению. Однако Mongo плохо справляется с реляционными запросами. Вам нужно будет использовать map-Reduce для многих из них. Монго это "RAM-шлюха". Mongo в основном требует 64-бит для любого значимого набора данных. Mongo будет занимать место на диске, загружать 140 ГБ БД, и вы можете использовать более 200 ГБ по мере увеличения файла подкачки во время использования.

И вам все еще захочется быстрой езды.

На самом деле, я думаю, можно с уверенностью сказать, что MongoDB - это действительно система БД, которая обслуживает передовое аппаратное обеспечение (64-разрядное, много ОЗУ, твердотельные накопители). Я имею в виду, что вся БД сконцентрирована на поиске данных индекса данных в ОЗУ (привет 64-разрядная версия), а затем на целевом случайном поиске на диске (привет SSD).

почему ... вся индустрия не прыгает с MySQL?

  1. не соответствует ACID . Вероятно, это очень плохо для банковской системы (конечно, большинство из них по-прежнему обрабатывают простые файлы, но это другая проблема). Однако обратите внимание, что вы можете принудительно выполнять «безопасные» записи с Mongo и гарантировать, что данные попадают на диск, но только один «документ» за раз.
  2. Это еще очень молод . Многие крупные компании все еще используют старые версии Crystal Reports в своем приложении SQL Server 2000, написанном на VB6. Или же они строят служебные автобусы предприятия для управления сумасшедшими гетерогенными средами, которые они создавали на протяжении многих лет.
  3. Это совершенно другая парадигма . Возможно, 30% вопросов, которые я регулярно вижу в списках рассылки Mongo (и здесь), в основном связаны с «как мне выполнить запрос X?» или «как структурировать эти данные?» . Использование MongoDB обычно требует предварительной денормализации. Это не только немного сложно, это не обучено. Большинство людей учатся «нормализации» только в школе, никто не учит нас, как денормализовать для производительности.
  4. Это не подходящий инструмент для всего . Честно говоря, я думаю, что MongoDB - отличный инструмент для чтения и записи транзакционных данных. Это простой «одноразовый» CRUD, который включает в себя большинство современных приложений. Однако MongoDB не очень хорош в отчетности. На самом деле, я искренне предполагаю, что следующим шагом будет не «Монго для всего» * ​​1043 *, это «Монго для транзакций» и «MySQL для отчетности» . Когда ваши данные становятся настолько большими, что вы выбрасываете «отчеты в режиме реального времени», то использование Map-Reduce для заполнения базы данных отчетов не кажется таким уж плохим.

Как я понял, при масштабировании MySQL получает питание для Memcache. Теперь кажется, что я могу начать с чего-то столь же производительного с самого начала.

Честно говоря, я работаю над этим в нескольких моих проектах. Опять же, я думаю, что MongoDB действительно создает корректный уровень кэширования. Фактически, он создает слой кэширования с файловой поддержкой. Так что, если вы способны изменить MySQL на Mongo, вы получите Memcached без промахов кэша. Это также позволяет легко «подогреть кеш» на новом сервере, просто скопировать файлы и запустить Mongo, указывая на нужную папку, это действительно так просто.

7 голосов
/ 06 июля 2010

Как часто, по вашему мнению, Facebook выполняет произвольные запросы к своим хранилищам данных? Не все является веб-приложением, и, наоборот, не каждый набор данных требует глубокого анализа.

NoSQL, по моему мнению, является в значительной степени реакционным ответом на то, что в основном составляло людей, использующих RDBMS для задач, которые им не подходили, потому что люди не принимали активное решение на основе своих потребностей и выбирали некоторые значения по умолчанию. «Прыгнуть с MySQL» (или СУБД в целом) в масштабах всей отрасли означало бы снова и снова совершать одну и ту же ошибку, и маятник в конечном итоге поворачивал назад.

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

2 голосов
/ 06 июля 2010

Помните, NoSQL не совсем новый.В конце концов, им приходилось что-то использовать перед SQL и реляционными базами данных, верно?На самом деле, такие системы, как MUMPS и CODASYL, работают одинаково и им уже десятки лет.Реляционные базы данных дают вам возможность произвольно запрашивать данные.

Скажем, у вас есть база данных с покупателями, их покупками и какими товарами они приобрели.БД NoSQL может иметь клиентов, содержащих покупки, и покупки, содержащие товары.Это позволяет легко узнать, какие товары приобрел данный покупатель, но сложно определить, какие клиенты приобрели данный товар.Реляционная БД будет иметь таблицы для клиентов, покупок, товаров и таблицы, связывающие товары с покупками.В SQL оба запроса сформулировать тривиально, и ядро ​​базы данных выполняет всю тяжелую работу за вас.

Кроме того, имейте в виду, что часть тенденции NoSQL заключается в том, чтобы жертвовать согласованностью или надежностью ради скорости, масштабируемости,и стоимость.Реляционные БД могут масштабироваться, но это не дешево.Если вы перейдете к http://tpc.org, вы сможете найти RDBMS, которые работают на сотнях ядер одновременно, чтобы доставлять миллионы транзакций в минуту, но они стоят миллионы долларов.

2 голосов
/ 06 июля 2010

Я использовал MongoDB, Redis (больше, чем пара ключ-значение поддерживает список, набор и отсортированный набор), Tokyo Tyrant, Memcached и MySql & PostgreSQL.

Аргументы между NoSQL DB и SQL на основе DB абсолютно беспочвенны. Вам нужно выбрать подходящую модель на основе вашего варианта использования. Если вам нужны соответствия ACID, продолжайте работу с БД SQL, такой как PostgreSQL, Oracle и т. Д. Вам нужна высокая производительность, но вы меньше заботитесь о данных, тогда вы можете рассмотреть возможность использования БД noSQL. Это принципиально разные технологии. Вы даже можете использовать комбинацию моделей. С NoSQL у вас будут отсутствовать связи, ограничения, а иногда и транзакции. Фактически, это одна из причин, по которой NoSQL быстрее ..

Как только я потерял два месяца совокупных данных с MongoDB ... Понятия не имею, как я их потерял ... Но у меня была резервная копия, и я потерял несколько минут данных. Я вернул MongoDB с резервной копией. Если вы используете NoSQL, время от времени выполняйте резервное копирование или планируйте задания cron для резервного копирования БД. Это применимо и для БД SQL.

По сравнению с СУБД SQL базы данных NoSQL моложе, и в настоящее время они находятся на стадии полной разработки, но базы данных NoSQL уже разработаны, что означает высокую производительность и простоту репликации.

На моем сайте (stacked.in) я использовал только redis DB, он работает намного быстрее, чем MySQL.

2 голосов
/ 06 июля 2010

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

Я знаю, что не могу совершать транзакции через отношения ... когда это будет иметь большое значение?

Чаще, чем вы могли ожидать. Есть много вещей, которые могут пойти не так, если вы не можете принять согласованный набор данных.

0 голосов
/ 06 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...