Речь идет не о NoSQL против SQL, а о BASE против ACID.
Масштабируемость должна быть разбита на составляющие:
- Масштабирование чтения = обрабатывать большие объемы операций чтения
- Масштабирование записи = обрабатывать большие объемы операций записи
ACID-совместимые базы данных (например, традиционные СУБД) могут масштабировать операции чтения. По своей природе они не менее эффективны, чем базы данных NoSQL, поскольку (возможные) узкие места в производительности возникают из-за недостатков NoSQL (иногда) (таких как объединения и ограничения), которые вы можете не использовать. Кластерные SQL СУБД могут масштабировать чтения, вводя дополнительные узлы в кластере. Существуют ограничения на то, насколько далеко могут масштабироваться операции чтения, но они связаны с трудностью масштабирования операций записи, когда вы вводите больше узлов в кластер.
Напишите масштабирование, где вещи становятся волосатыми. Существуют различные ограничения, налагаемые принципом ACID, которые вы не видите в архитектурах, согласованных в конечном итоге (BASE):
- Атомарность означает, что транзакции должны завершиться или потерпеть неудачу в целом, поэтому большая часть бухгалтерии должна вестись негласно, чтобы гарантировать это.
- Ограничения согласованности означают, что все узлы в кластере должны быть идентичны. Если вы пишете на один узел, эта запись должна быть скопирована на все остальные узлы, прежде чем возвращать ответ клиенту. Это затрудняет масштабирование традиционного кластера СУБД.
- Ограничения долговечности означают, что для того, чтобы никогда не потерять запись, вы должны убедиться, что перед возвратом ответа клиенту запись была записана на диск.
Чтобы увеличить количество операций записи или количество узлов в кластере, превышающее определенную точку, необходимо иметь возможность ослабить некоторые требования ACID:
- Удаление атомарности позволяет сократить продолжительность блокировки таблиц (наборов данных). Пример: MongoDB, CouchDB.
- Понижение согласованности позволяет увеличивать объемы записи между узлами кластера. Примеры: риак, кассандра.
- Dropping Durability позволяет вам отвечать на команды записи без сброса на диск. Примеры: memcache, redis.
Базы данных NoSQL обычно следуют модели BASE вместо модели ACID. Они отказываются от требований A, C и / или D, а взамен улучшают масштабируемость. Некоторые, например, Cassandra, позволяют вам использовать гарантии ACID, когда они вам нужны. Однако не все базы данных NoSQL все более масштабируемы.
В SQL API отсутствует механизм для описания запросов, в которых требования ACID смягчены. Вот почему все базы данных BASE являются NoSQL.
Личное примечание: последнее замечание, которое я хотел бы отметить, заключается в том, что в большинстве случаев, когда в настоящее время NoSQL используется для повышения производительности, было бы возможным решение для надлежащей СУБД с использованием правильно нормализованной схемы с надлежащими индексами. Как доказано этим самым сайтом (на базе MS SQL Server), СУБД могут масштабироваться до высоких рабочих нагрузок, если вы используете их надлежащим образом. Люди, которые не понимают, как оптимизировать СУБД, должны держаться подальше от NoSQL, потому что они не понимают, на какие риски они идут со своими данными.
Обновление (2019-09-17):
Пейзаж баз данных изменился после публикации этого ответа. Несмотря на то, что между миром RIDBMS ACID и миром NoSQL BASE все еще существует противоречие, линия стала размытой. В базы данных NoSQL добавлены функции из мира РСУБД, такие как SQL API и поддержка транзакций. В настоящее время существуют даже базы данных, которые обещают масштабирование SQL, ACID и запись, например, Google Cloud Spanner, YugabyteDB или CockroachDB. Обычно дьявол кроется в деталях, но для большинства целей они «достаточно кислотные». Чтобы глубже погрузиться в технологию баз данных и узнать, как она развивалась, вы можете взглянуть на эту панель слайдов (примечания к слайдам сопровождаются пояснениями).