Коли використовувати MongoDB або інші системи баз даних, орієнтовані на документи? [зачинено]


516

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

Однак ми продовжуємо розробляти нашу платформу та додавати функції. Тепер одним із наступних кроків буде надання форуму для наших користувачів. Питання, яке зараз виникає: використовувати базу даних MySQL, яка була б хорошим вибором для зберігання форумів і дописів на форумах тощо, чи використовувати для цього також MongoDB?

Отже, питання: коли використовувати MongoDB і коли використовувати RDBMS. Що б ви взяли, mongoDB або MySQL, якби у вас був вибір і чому ви взяли б його?


12
Не впевнений, чому це позначено як засноване на думці, коли явно це не так. Тут є чітка правильна чи неправильна відповідь.
Спенсер

Відповіді:


659

У NoSQL: Якби це було так просто , автор пише про MongoDB:

MongoDB - це не ключ / цінність, це трохи більше. Це точно також не RDBMS. Я не використовував MongoDB у виробництві, але я його трохи побудував для тестового додатка, і це дуже класна частина комплекту. Це здається дуже ефективним, або або має, або незабаром матиме відмовостійкість і автоматичне посилення (так само воно буде масштабуватися). Я думаю, що Монго може бути найближчим до заміни RDBMS, яку я бачив досі. Він не працюватиме для всіх наборів даних та шаблонів доступу, але він створений для ваших типових CRUD-матеріалів. Зберігання того, що по суті є величезним хешем, і можливість вибору на будь-якій з цих клавіш - це те, для чого більшість людей використовують реляційну базу даних.Якщо ваш БД 3NF і ви не приєднуєтесь (ви просто вибираєте купу таблиць і складаєте всі об'єкти, AKA, що робить більшість людей у ​​веб-додатку), MongoDB, ймовірно, запустить вам дупу.

Потім у висновку:

Справжня річ, на яку слід зазначити, що якщо вас стримують робити щось надзвичайне, оскільки ви не можете вибрати базу даних, ви робите це неправильно. Якщо ви знаєте mysql, просто використовуйте його. Оптимізуйте, коли вам насправді потрібно. Використовуйте його як магазин ак / в, використовуйте його як rdbms, але заради бога, створіть свою програму-вбивцю! Нічого цього не має значення для більшості програм. Facebook все ще багато використовує MySQL. У Вікіпедії дуже багато використовується MySQL. FriendFeed багато використовує MySQL. NoSQL - чудовий інструмент, але це, безумовно, не буде вашою конкурентоспроможною програмою, це не стане робити вашу програму гарячою, і, більш за все, ваші користувачі не будуть піклуватися ні про що з цього.

На чому я буду будувати свій наступний додаток? Ймовірно, Postgres. Чи буду використовувати NoSQL? Можливо. Я також можу використовувати Hadoop і Hive. Я можу зберігати все в плоских файлах. Можливо, я почну ламати Маглева. Я буду використовувати все, що найкраще для роботи. Якщо мені потрібно звітувати, я не буду використовувати жоден NoSQL. Якщо мені потрібно кешування, я, мабуть, використовую Tokyo Tyrant. Якщо мені потрібна ACIDity, я не буду використовувати NoSQL. Якщо мені потрібна тонна лічильників, я буду використовувати Redis. Якщо мені потрібні транзакції, я буду використовувати Postgres. Якщо у мене є тонна одного типу документів, я, мабуть, буду використовувати Монго. Якщо мені потрібно писати 1 мільярд об’єктів на день, я, мабуть, використовую Волдеморта. Якщо мені потрібен повний пошук тексту, я, мабуть, використовую Solr. Якщо мені потрібен повнотекстовий пошук енергонезалежних даних, я, мабуть, використовую Sphinx.

Мені подобається ця стаття, я вважаю її дуже інформативною, вона дає хороший огляд пейзажу та шуму NoSQL. Але, і це найважливіша частина, вона дійсно допомагає задавати собі правильні питання, коли мова йде про вибір між RDBMS і NoSQL. Варто прочитаного ІМХО.

Альтернативне посилання на статтю


4
дякую, це дійсно дуже цікава стаття.
aurora


48
@iddqd ROFL! Людина, це було весело. "Якщо ви досить дурні, щоб повністю ігнорувати надійність лише для того, щоб отримати орієнтири, я пропоную вам передати свої дані /dev/null, це буде дуже швидко" : D
Pascal Thivent

3
Дякуємо за усвідомлену відповідь.
Діамон

2
Сподіваємось, BJ Clark не вирішить використовувати всі ці технології в одному проекті. Це було б трохи кривої навчання.
Адам Монсен

186

Після двох років використання MongoDb для соціального додатку я був свідком того, що насправді означає жити без SQL RDBMS.

  1. Ви закінчуєте писати завдання, щоб робити такі речі, як об'єднання даних з різних таблиць / колекцій, що RDBMS зробить для вас автоматично.
  2. Ваші можливості запиту за допомогою NoSQL різко калічені. MongoDb може бути найближчим до SQL, але він все ще сильно відстає. Довірся мені. SQL-запити надзвичайно інтуїтивні, гнучкі та потужні. MongoDb запитів немає.
  3. Запити MongoDb можуть отримати дані лише з однієї колекції та скористатися лише одним індексом. І MongoDb - це, мабуть, одна з найбільш гнучких баз даних NoSQL. У багатьох сценаріях це означає більше зворотних поїздок на сервер для пошуку відповідних записів. І тоді ви починаєте денормалізувати дані - це означає фонові завдання.
  4. Той факт, що це не реляційна база даних, означає, що ви не матимете (вважається, що хтось погано спрацьовує) зовнішніх ключових обмежень для забезпечення відповідності ваших даних. Запевняю, що врешті-решт це створить невідповідності даних у вашій базі даних. Будь готовий. Швидше за все, ви почнете писати процеси чи перевірки на відповідність своїй базі даних, що, ймовірно, не буде краще, ніж дозволити RDBMS робити це за вас.
  5. Забудьте про зрілі рамки на кшталт сплячки.

Я вважаю, що 98% всіх проектів, ймовірно, набагато кращі з типовим SQL RDBMS, ніж з NoSQL.


10
цікаві думки ...
luigi7up

3
З іншого боку, можливості запитів та з'єднання, які ви описуєте, не повинні бути проблемою: якщо ви використовуєте MongoDB, вам все одно доведеться виконати певну роботу, щоб створити свої колекції та які дані ви будете вносити всередину, щоб вам не знадобилося складних ПРИЄДНАЄТЬСЯ тощо. У будь-якому разі БД не є вузьким місцем, і для деяких випадків використання є обхідні шляхи, як Memcache. Якщо почати з нуля, ви можете виявити, що проектування та використання MongoDB простіше і швидше (як розробник, який працює з об'єктним кодом, мені не потрібна ORM). Звичайно, вам доведеться написати кілька сценаріїв, але насправді це не так складно, і ви повторно використовуєте код
Aki

1
Більшість людей не використовуватимуть бази даних NoSQL для тих самих конкретних випадків використання, для яких вони були створені, винаходивши потім стільки коліс. У NoSQL проти SQL дебатів показують , що багато людей відчувають , використовуючи NoSQL , як якщо б вони йшли назад 20-30 років під час, щоб попередньо Кодд, попередньо реляційний, раз заздалегідь SQL . Або, як зазначає Майкл Стоунбрейкер: "Що відбувається навколо"
Лукас Едер

1
Чи діє предмет №3 "і скористатися лише одним індексом" сьогодні? Я просто зараз потрапляю в MongoDB, і здається, що я читав / переглядав досі, що він може підтримувати кілька індексів?
Jeach

1
@Jeach: Ні, №3 вже не відповідає дійсності. MongoDB 2.6 запровадив перетин індексу .
Роб Гаррісон

26

для зберігання цих неструктурованих даних

Як ви вже говорили, MongoDB найкраще підходить для зберігання неструктурованих даних. І це може організувати ваші дані у форматі документа. Ці альтернативи RDBMS, які називаються сховищами даних NoSQL ( MongoDB , CouchDB , Voldemort ), дуже корисні для додатків, які масштабують масштаби та потребують швидшого доступу до даних з цих великих сховищ даних.

І реалізація цих баз даних простіша, ніж звичайні RDBMS. Оскільки це прості бінарні об'єкти в стилі документа або двосторонні документи, безпосередньо серіалізовані на диск. Ці сховища даних не застосовують властивості ACID та будь-які схеми . Це не забезпечує жодних можливостей для транзакцій . Таким чином, це може бути масштабним, і ми можемо досягти більш швидкого доступу (і читати, і писати).

Але навпаки, RDBM застосовує ACID та схеми для даних. Якщо ви хочете працювати зі структурованими даними, ви можете перейти до RDBM.

Я б вибрав MySQL для створення форумів для подібних матеріалів. Тому що це не буде масштабуватися великим. І це дуже простий (звичайний) додаток, який має структуровані відносини між даними.


10
"Я б вибрав mysql для створення форумів." Дійсно? Я думаю, що такі речі, як форуми, було б набагато простіше написати, використовуючи базу даних, орієнтовану на документи, ніж реляційну (якщо ви писали це з нуля). Якщо вам спеціально не потрібні функції RDBMS, я б сказав, перейдіть за допомогою MongoDB або подібної бази даних для зручності використання та масштабування.
Саша Чедигов

2
CouchDB має підтримку ACID. couchdb.apache.org/docs/overview.html
Соня

2018: MongoDB також має підтримку ACID
Nepoxx

10

Зауважте, що Монго фактично зберігає JSON. Якщо ваш додаток має справу з великою кількістю об'єктів JS (з вкладкою), і ви хочете зберегти ці об'єкти, то існує дуже сильний аргумент щодо використання Mongo. Це робить ваші шари DAL та MVC надто тонкими, оскільки вони не розпаковують усі властивості об'єкта JS і намагаються примусити їх вписати їх у структуру (схему), до якої вони, природно, не вписуються.

У нас є система, що має в основі кілька складних об'єктів JS, і ми любимо Монго за те, що можемо наполегливо все наполегливо, дуже легко. Наші об'єкти також досить аморфні та неструктуровані, і Монго вбирає це ускладнення, не моргаючи. У нас є спеціальний шар звітності, який розшифровує аморфні дані для споживання людиною, і це було не так складно.


7

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


7
Складні транзакції не працюють в MongoDB, але вони працюють в інших базах даних NoSQL, як, наприклад, MarkLogic (я також упереджений, оскільки запускаю спільноту розробників для MarkLogic).
Ерік Блох

Дякую за підказку до MarkLogic - я про це не знав.
Аврора

Я хотів би почути від mdirolf про це. Чому MongoDB вирішив не здійснювати транзакції?
Акі

7

Кому потрібні розподілені, роздрібнені форуми? Можливо, Facebook, але якщо ви не створюєте конкурента у Facebook, просто використовуйте Mysql, Postgres або все, що вам найбільше подобається. Якщо ви хочете спробувати MongoDB, добре, але не сподівайтеся, що це зробить магію для вас. У ньому будуть свої химерності та загальна гнучкість, як і все інше, оскільки я впевнений, що ви вже виявили, чи справді вже працювали над цим.

Звичайно, MongoDB може бути розкритим і здається легким на поверхні, але ви зіткнетесь з проблемами, які вже подолали більш зрілі продукти. Не заманюйте так легко, а скоріше зачекайте, поки "nosql" дозріє або не помре.

Особисто я думаю, що "nosql" в'яне і помре від роздробленості, оскільки немає встановлених стандартів (майже за визначенням). Тому я особисто не ставлю на це жодних довгострокових проектів.

Єдине, що може зберегти "nosql" у моїй книзі, це якщо вона може інтегруватися в Ruby або подібні мови безперешкодно, а також зробити мову "стійкою", майже не маючи накладних витрат у кодуванні та дизайні. Це може статися, але я зачекаю до тих пір, не зараз, і це, звичайно, має бути більш зрілим.

Btw, чому ти створюєш форум з нуля? Є багато форумів з відкритим кодом, які можна налаштувати під більшість вимог, якщо ви справді не створюєте Форуми нового покоління (що я сумніваюся).


5
Дякую за вашу відповідь. інтеграція форуму - це безлад - ми вже це зробили і вирішили не йти цим шляхом знову: нам не потрібні тисячі функцій, а повна інтеграція в наше програмне забезпечення.
аурора

4

Я бачив у багатьох компаніях, які використовують MongoDB для аналітики в реальному часі з журналів додатків. Його безпроблемна схема дійсно підходить для журналів додатків, де схема запису має тенденцію змінюватись час від часу. Крім того, його функція Capped Collection є корисною, оскільки вона автоматично очищає старі дані, щоб зберегти дані в пам'яті.

Це одна сфера, на яку я дійсно думаю, що MongoDB підходить, але MySQL / PostgreSQL більше рекомендується. В Інтернеті дуже багато документальних та програмних ресурсів, а також їх функціональності та надійності.


4

Дві головні причини, чому ви хочете віддати перевагу Монго, - це

  • Гнучкість в дизайні схем (зберігання документів типу JSON).
  • Масштабованість - Просто додайте вузли, і вона може гарно горизонтально масштабуватися.

Він підходить для великих даних. RDBMS не корисний для великих даних.


3

Ви знаєте, все це про приєднання та "складні транзакції" - але саме Монті багато років тому пояснив "потребу" в COMMIT / ROLLBACK, сказавши, що "все, що робиться в класах логіки (а не база даних) у будь-якому разі '- значить, все те саме і знову. Потрібно - німий, але неймовірно охайний та швидкий механізм зберігання / пошуку даних, для 99% того, що роблять веб-програми.


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

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

Десь на цьому веб-сайті 10gen є примітка ... згадується, як поля "блокування" або "храповики" використовуються вручну для позначення стану багатоступеневого процесу. Мені здається, що якщо переглянути масштабний механізм MySQL, "блокова транзакція" все-таки розшириться на серію кроків, незалежно від того; це просто те, що блокування або храповики робляться набагато меншими, швидшими способами, ніж відстеження вручну в полях баз даних.
FYA

Ми ще не знайшли хорошого способу обмежити демон MongoDB - він обробляє майже всю наявну оперативну пам’ять для свого індексу та зберігання даних у пам'яті, хоча він швидко видає пам'ять, коли потрібні інші програми. Але все-таки було б добре мати "use_max_memory" або якісь інші легко визначені обмеження, щоб переконатися, що MongoDB не тікає та відправляє сервер на обмін трейдерами (ми це бачили вже кілька разів, навіть в останній версії). Принаймні MySQL приймає всі види визначених обмежень та підказки щодо експлуатації.
FYA

Не пов’язане безпосередньо, а своєрідне: ми використовували memcached, але відмовились від нього через незрозуміле фіаско-драйвер Memcache / Memcached PHP. Ми використовували MongoDB як швидкий, тимчасовий ключ: магазин магазинів val (для якого він працював чудово!), Поки не з'ясували, наскільки швидкий і простий apc_store (). Якщо ми виявимо, що APC заповнює тимчасовий сирий (проти збереженого попередньо компільованого PHP), який ми використовували для того, щоб увімкнути пам'ять, ми повернемося до MongoDB для зберігання ключа: val.
FYA

1

Як було сказано раніше, ви можете вибрати між багатьма варіантами, поглянути на всі ці варіанти: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

Я пропоную знайти найкращу комбінацію: MySQL + Memcache - це справді чудово, якщо вам потрібен ACID і ви хочете приєднатися до деяких таблиць. MongoDB + Redis ідеально підходить для зберігання документів. Neo4J ідеально підходить для бази даних графіків

Що я роблю: я починаю з MySQl + Memcache, тому що я звик, потім починаю використовувати рамки інших баз даних. У одному проекті ви можете об'єднати, наприклад, MySQL та MongoDB!


MySQL + запам’ятовуючий додасть вам можливої ​​послідовності. Що я не вважаю кислотою в контексті RDMB.
Р. ван Твіск
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.