Коли хтось використовуватиме MongoDB (або подібне) над реляційною СУБД?


134

Я трохи розгублений у всьому, що стосується NoSQL, і тому подібному. Коли ви вирішили використовувати щось на зразок MongoDB над чимось на зразок Oracle чи MySQL? Я не дуже розумію "різницю", що стосується використання між ними.

З мого розуміння, бази даних NoSQL не повинні замінювати RDBMS, а що саме вони мають робити?


Що ви читали? Чи можете ви надати котирування, посилання чи інформацію про нас? Ми не знаємо, скільки ви знаєте - чи не знаєте.
S.Lott

3
Поки / доки вони не будуть перенесені сюди, у StackOverflow виникає кілька дуже схожих питань , зокрема коли використовувати MongoDB або інші системи баз даних, орієнтовані на документи?
Ніколь

1
Це веб-масштаб mongodb-is-web-scale.com / s
Froome

3
Цинічно: Тому що це ажіотажне слово, і багато людей люблять слідкувати за обманом.
Sjoerd

@Pace: Я думаю, що важко буде обіграти цю посаду .
Роберт Харві

Відповіді:


34

Раніше я використовував CouchDB для трьох проектів для домашніх тварин.

  • Мікроблог система.
  • Для збереження інформації для невеликої замітки, взявши додаток, який я зробив.
  • Застосування для загального призначення мозкового штурму.

Основна причина, чому я вибрав це через щось на зразок MSSQL або MySQL, - це гнучкість, яку ви отримуєте при використанні. Немає жорсткої схеми. Якщо за три місяці вниз за рядком вам потрібна певна таблиця, щоб було додаткове поле, і це та інше, ви просто поміняєте її, і вона пульсує звідти назовні.

Я використовував Beginning CouchDB від Apress, щоб навчитися ним користуватися.

Наприклад, CouchDB використовує json для спілкування з / з бази даних. Якщо ваша мова може надсилати дані, ви можете використовувати їх для спілкування з БД.

Читайте також: Чому я повинен використовувати базу даних на базі документів замість реляційної бази даних? на StackOverflow


31
Ваші перші два приклади звучать як добрий домен для традиційних реляційних СУБД.
Йонас

4
@yati: Цей додаток звучить схоже на StackOverflow.com, і я вважаю, що він працює дуже добре з традиційною реляційною базою даних.
Йонас

4
@yatisagade: Я не говоримо про динамічні соціальні сайти. Але невелика примітка, що приймає додаток та систему мікро-блогів .
Йонас

2
Як не мати визначеної схеми ніколи плюсом? З реляційною БД, якщо за три місяці вниз по лінії вам потрібно додаткове поле, ви просто додасте поле. З реляційною БД ви не можете динамічно додавати поле, але ви також не можете динамічно змінювати код програми для роботи з динамічно доданим полем.
Секрет Соломонофа

12
Ця відповідь, схоже, говорить про те, що схему реляційної бази даних неможливо змінити. Я не в змозі зрозуміти, яка кількість непорозумінь може змусити когось повірити в це. Додавання нового стовпця у реляційну базу даних є тривіальним. Зазвичай є хороший інтерфейс користувача, або якщо ви віддаєте перевагу його сценарію, це можна зробити в одному операторі SQL.
ЖакБ

24

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

Плюси:

  • MongoDB має меншу затримку на запит і витрачає менше часу процесора на запит, оскільки він робить набагато менше роботи (наприклад, ніяких об'єднань, транзакцій). Як результат, він може обробляти більш високе навантаження з точки зору запитів в секунду, і тому часто використовується, якщо у вас є маса користувачів.
  • MongoDB легше відшаровувати (використовувати в кластері), оскільки йому не потрібно турбуватися про транзакції та послідовність.
  • MongoDB має більш високу швидкість запису, тому що йому не потрібно турбуватися про транзакції чи зворотні звороти (і, таким чином, не потрібно турбуватися про блокування).
  • У MongoDB немає схеми, якщо у вас є спеціальний випадок використання, який може цим скористатися.

Мінуси:

  • MongoDB не підтримує транзакції . Ось як він отримує більшість своїх переваг.
  • Взагалі, MongoDB створює більше роботи (наприклад, більше витрат на процесор) для клієнтського сервера . Наприклад, щоб приєднатись до даних, потрібно видати декілька запитів і виконати об'єднання на клієнті.
  • Навіть у 2017 році існує менша підтримка інструментарію для MongoDB, ніж для реляційних баз даних просто тому, що вона новіша. Також є менше експертів з MongoDB, ніж їх реляційні колеги.

Бали часто неправильно зрозуміли:

  • І MongoDB, і реляційні бази даних підтримують індексацію. Їх ефективність запитів схожа з точки зору виконання великих запитів .
  • MongoDB не знімає необхідності міграції, а точніше, оновлення наявних даних у міру розвитку вашої схеми. Наприклад: Якщо у вас є програма, яка покладається на таблицю користувачів, щоб містити певні дані, і ви модифікуєте цю таблицю, щоб вона містила різні дані (скажімо, ви додали поле зображення профілю), вам все одно потрібно буде:
    • Напишіть вам додаток для обробки об'єктів, для яких ця властивість не визначена АБО
    • Напишіть одноразову міграцію, щоб вказати значення за замовчуванням для цього властивості АБО
    • Напишіть код, щоб вказати значення за замовчуванням під час запиту, якщо це поле відсутнє АБО
    • Обробіть пропущене поле якось іншим способом

2
Я додам величезну річ, яку якимось чином пропускаю в багатьох дискусіях NoSQL vs RDBMS: Бази даних NoSQL набагато складніше для спеціального запиту (це "частина без SQL". Це вірно, чи ви розробник чи ні. Тому , їм також набагато складніше створювати звіти , що має вирішальне значення для будь-якої серйозної справи.
Michael

Хе, я б майже назвав цю функцію для MongoDB, оскільки відмовляю від такої взаємодії з моїми базами даних. Однак у Mongo є спеціальна мова запитів та графічний спеціальний клієнт (Compass). Це не так багато функцій, як SQL, тому я погоджуся, що це потенційний недолік, але для мене особисто це ніколи не змінить, коли я вирішувати, яку базу даних використовувати.
Темп

1
Чому ви не хочете досліджувати дані у вашій базі даних? Якщо ця база даних має будь-яку корисну інформацію для бізнесу, вона повинна бути максимально доступною. Очевидно, не додаючи навантаження на виробництво, саме для цього ви читали репліки.
Майкл

Це, мабуть, саме по собі цікаве питання, і я думаю, що багато людей мали б різні точки зору. Особисто я уникаю цього, оскільки це стає проблемою технічного обслуговування. Я створюю веб-додатки і розкриваю API REST, які я зобов'язуюсь підтримувати та оптимізувати для роботи. Я був у ситуаціях, коли я не можу вносити оптові зміни в базу даних, оскільки це порушить занадто багато сценаріїв запитів інженерів з продажу, і я намагаюся уникати цього сценарію зараз. Наприклад, я нещодавно був частиною свого db від PostgreSQL до Cassandra для високої продуктивності, і мені не довелося міняти свій API.
Темп

Згодом у вас завжди будуть зацікавлені сторони, які зацікавлені переглядати дані. Будь то через запит SQL чи якийсь сценарій ноутбука ipython, або через re: dash. Тому коли ви вносите зміни в базу даних, вам завжди доведеться переконатися, що ви не подолаєте ці залежності. SQL (не RDBMS) робить дані більш доступними, і для цього це добре для бізнесу.
Майкл

13

Щоб безсоромно красти з Ренезису (насправді я даю цю відповідь CW):


Використання RDBMS замість інших типів:


4
"RDBMS дуже активно використовує індексацію для продуктивності" Чи не використовується індексація також у MongoDB?
Ротарети

Коли використовувати MongoDB або інші системи баз даних, орієнтовані на документи? наразі видалено на SO ... не більше .. відновили питання, як добре захистили його. Не впевнений, що міркування про видалення.
Рахул

9

Якщо ваші дані не є реляційними, можуть бути основні переваги використання баз даних NoSQL, таких як продуктивність та масштабованість (звичайно, залежно від обставин). Деякі дизайнерські малюнки, такі як CQRS, значно полегшують використання нереляційних даних у областях, які, як правило, вимагають виключного використання бази даних SQL.

Загальноприйнято використовувати бази даних, такі як mongo, для кешованих даних. Наприклад, якщо вам потрібно створити звіт, ви можете зробити складний запит SQL, який з'єднує та агрегує купу даних під час руху, або ви можете просто отримати один документ json зі своєї бази даних mongo, у якому вже є все, що потрібно для створення звіт. Це робить читання даних по-справжньому легким (і швидким!), Але може зробити запис даних досить складним (саме тут надходить CQRS).


8

Бази даних на зразок MongoDB чудові, коли ви зазвичай знаєте, де ваші дані (на відміну від необхідності писати кілька складних запитів). У Монго "пов'язані" дані або вкладені в батьківські дані, або вони мають первинні / зовнішні ключі. Це чудово, якщо, наприклад, у вас є повідомлення та коментарі; як правило, ви не збираєтеся показувати коментарі поза контекстом публікації, тому має сенс, що коментарі містяться в публікації (таким чином ви отримуєте всі коментарі до публікації, не вимагаючи запиту в окрему таблицю).

MongoDB не є схемою. Це означає, що вона буде займати будь-яку структуру даних, яку ви кидаєте на неї, здебільшого.

З іншого боку, якщо вам потрібно використовувати сукупні функції і відчуваєте необхідність запитувати дані складними способами, яких неможливо досягти за допомогою вбудовування або простих відносин у Монго, тоді ви знаєте, що прийшов час використовувати RDBMS на зразок MySQL або PostgreSQL.

MongoDB не призначений для заміни SQL. Він просто відповідає різним потребам, і MongoDB та RDBMS можуть використовуватися спільно. На мою думку, MongoDB не все є таким необхідним, якщо вам не потрібні ваші дані, щоб бути гнучкими або вбудованими в батьківський документ. Розвиток за допомогою MongoDB - це дуже цікаво, тому що для запуску та запуску проекту (скажімо, у Rails), набагато менше кроків. Потрібно внести зміни? Нема проблем. Просто додайте атрибут до вашої моделі. Зроблено.

Я не можу говорити про багато інших баз даних NoSQL, хоча я знаю, що вони зазвичай аналогічно розроблені для задоволення конкретної потреби, яку RDBMS не може задовольнити. Деякі повністю мешкають у пам'яті або їх можна легко зрубати або змінити. Я майже впевнений, що Кассандра призначена для продовження роботи без втрати даних, якщо вузол знизиться. Redis - це в основному сховище значень, яке знаходиться в пам'яті (з періодичними записами на диск для постійності), але також має можливість зберігати типи даних, як набори, і сортувати їх.


6

Основна виграш - це те, коли ви хочете поділити дані або мати багато основних баз даних. Ви можете розміщувати дані в MySQL, але це стає головним болем. Якщо ви багато пишете, часто корисно ділити дані на декількох серверах, проблема полягає в тому, що якщо ви хочете мати сильну референтну узгодженість, роблячи це, це може бути дуже важко, якщо не неможливо, шукати теорему CAP.

Бази даних SQL мають дуже гарну узгодженість, але дуже погана підтримка розділення, ноти SQL баз даних мають інший шлях. Легко розділити, але часто називають можливою послідовністю. Якщо ви створюєте сайт для обміну повідомленнями, це нормально, для банку, ймовірно, це не нормально.

Плюс у тому, що зараз існує декілька моделей, як зберігати дані, тому є вибір у тому, як ви реалізуєте речі, тоді як раніше у вас були бази даних SQL.

SE Radio провів кілька хороших епізодів на цю тему.


Потрібно пам’ятати, що різко залежать від архітектури вашого центру обробки даних. Якщо у вас є серверна стійка, її продуктивність є приголомшливою. На розподілених постійних струмах не так багато. Погодившись з тим, що ви говорите про загальну простоту розбиття баз даних на NoSql БД - але надійність є ключовою проблемою.
Апоорв Хурасія

Якщо ви багато пишете, у вас може бути просто дві моделі: денормалізовані строгі покажчики, прочитані модель ТА нерозроблена модель запису. Природно, потрібна реплікація, яка додає складності. Вам доведеться оцінити, що для вас вигідніше: впоратися з обмеженнями NoSQL, тобто зробити набагато більше роботи з програмуванням, щоб відповідати записам у домені Java, або наявна технологія реплікації БД виконає роботу, або ви будете коштувати більше за умови конфігурації та обладнання.
Лоуренс

1

MongoDB добре працює, коли ви пишете багато даних, і коли ваші запити не надто складні. Отже, MongoDB добре підходить, коли ви реалізуєте CQRS з використанням подій на стороні Command, тобто ваш магазин подій є базою даних MongoDB.

Що стосується запиту, ми все ще використовуємо db SQL Server із переглядами та службами даних WCF зверху, завдяки своїй гнучкості. Я думаю, що в більшості випадків вам справді потрібна потужність реляційного БД для запитів.


Якщо ви пишете багато даних, чи глобальні блоки записів негативно не вплинуть на вас?
Апоорв Хурасія

1
Зауважте, що Mongodb більше не використовує глобальне блокування запису (і він уже був оновлений, щоб не вимагати його, коли був розміщений вище коментар).
Жуль

1

Безпосередня і принципова відмінність між MongoDB і RDBMS є базовою моделлю даних. Реляційна база даних структурує дані в таблиці та рядки, тоді як MongoDB структурує дані у колекції документів JSON. JSON - це самоописуваний, читаний людиною формат даних. Спочатку призначений для легких обмінів між браузером і сервером, він став широко прийнятим для багатьох типів програм.

Документи JSON особливо корисні для управління даними з кількох причин. Документ JSON складається з набору полів, які самі є ключовими значеннями. Це означає, що кожен документ JSON має в своєму розпорядженні власночитаною схемою, зрозумілою для людини, куди б не було, що дозволяє документам легко переміщуватися між додатками бази даних та клієнтами, не втрачаючи сенсу.

JSON - це також природний формат даних для використання в прикладному шарі. JSON підтримує більш багату і гнучку структуру даних, ніж таблиці, що складаються з стовпців і рядків. Окрім підтримки типів полів, таких як число, рядок, булеве значення тощо, поля JSON можуть бути масивами або вкладеними суб-об'єктами. Це означає, що ми можемо представляти набір складних відносин, які є більш чітким представленням об'єктів, з якими працюють наші програми. Використання документів JSON у нашій базі даних означає, що нам не потрібен об’єктний реляційний маппер між нашою базою даних та програмами, які вона обслуговує. Ми можемо зберігати наші дані в потрібній формі


1

Якщо ваші дані потребують безлічі запитів, тоді рішення NoSQL не годиться, і коли вам потрібна транзакційна підтримка (ACID), то NoSql не найкраще підходить. Я думаю, що NoSQL світиться, коли у вас є багато читань, які повинні бути швидкими, і коли структура дещо прихильна, ви отримуєте документ або структуру сторінки, щось подібне. Але багато NoSQL-рішень вдосконалюються дуже швидко, тому недоліки, можливо, скоро не зникнуть. У будь-якому випадку я думаю, що реляційні бази даних все ще добре підходять для більшості програм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.