Не про NoSQL проти SQL, а про BASE проти ACID.
Масштабованість має бути розбита на складові:
- Масштабування читання = обробляти більші обсяги операцій зчитування
- Масштабування запису = обробляти більші обсяги операцій запису
Бази даних, сумісні з кислотами (як традиційні RDBMS), можуть масштабувати читання. Вони за своєю суттю не менш ефективні, ніж бази даних NoSQL, оскільки (можливі) вузькі місця продуктивності вводяться через речі, яких NoSQL (іноді) не вистачає (наприклад, приєднання та де обмеження), які ви не можете використовувати. Кластеризовані SQL RDBMS можуть масштабувати зчитування, вводячи додаткові вузли в кластер. Існують обмеження щодо масштабування масштабування операцій зчитування, але вони накладаються труднощами масштабування записів, коли ви вводите більше вузлів у кластер.
Масштабування записів - це те, де все стає волохатим. Принципом ACID існують різні обмеження, яких ви не бачите в архітектурах, що узгоджуються з часом (BASE):
- Атомізм означає, що транзакції повинні завершуватися або провалюватися в цілому, тому для того, щоб гарантувати це, потрібно проводити велику кількість бухгалтерій.
- Обмеження узгодженості означають, що всі вузли кластера повинні бути однаковими. Якщо ви пишете на один вузол, це записування потрібно скопіювати на всі інші вузли, перш ніж повернути відповідь клієнту. Це робить традиційний кластер RDBMS важким для масштабування.
- Обмеження стійкості означає, що для того, щоб ніколи не втрачати запис, ви повинні переконатися, що перед тим, як відповідь буде повернута клієнтові, запис було передано на диск.
Щоб збільшити масштаб операцій запису або кількості вузлів у кластері за певний момент, ви повинні мати можливість розслабити деякі вимоги до кислотної кислоти:
- Видалення Atomicity дозволяє скоротити тривалість, за яку таблиці (набори даних) заблоковані. Приклад: MongoDB, CouchDB.
- Випадання консистенції дозволяє масштабувати записи по вузлах кластера. Приклади: ріак, кассандра.
- Зниження довговічності дає змогу відповідати на записи команд, не передаючи на диск. Приклади: memcache, redis.
Бази даних NoSQL зазвичай відповідають моделі BASE замість моделі ACID. Вони відмовляються від вимог A, C та / або D, а натомість покращують масштабованість. Деякі, як-от Кассандра, дозволяють вам увімкнути гарантії ACID, коли вони вам потрібні. Однак не всі бази даних NoSQL постійно масштабуються.
У API SQL відсутній механізм для опису запитів, де вимоги ACID послаблені. Ось чому бази даних BASE - це все NoSQL.
Особисте зауваження. Одним із останніх моментів, який я хотів би зробити, є те, що в більшості випадків, коли NoSQL використовується зараз для підвищення продуктивності, рішення було б можливим на належній RDBMS, використовуючи правильно нормалізовану схему з належними індексами. Як підтверджено цим самим сайтом (на базі MS SQL Server), RDBMS може масштабуватись до високих навантажень, якщо ви використовуєте їх належним чином. Люди, які не розуміють, як оптимізувати RDBMS, повинні триматися подалі від NoSQL, оскільки вони не розуміють, які ризики вони несуть зі своїми даними.
Оновлення (2019-09-17):
Ландшафт баз даних змінився з моменту опублікування цієї відповіді. Поки все ще існує дихотомія між світом RDBMS ACID та світом NoSQL BASE, лінія стала нечіткішою. Бази даних NoSQL додають такі функції зі світу RDBMS, як підтримка API SQL та підтримка транзакцій. Зараз є навіть бази даних, які обіцяють масштабування SQL, ACID та запису масштабів, наприклад, Cloud Cloud Spanner, YugabyteDB або CockroachDB. Зазвичай диявол є в деталях, але для більшості цілей це "достатньо кислоти". Для більш глибокого занурення в технологію баз даних та про те, як вона розвивалася, ви можете подивитися на цю слайд-колоду (до нотаток про слайди додається пояснення).