Плюси / мінуси баз даних на основі документів та реляційні бази даних


76

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

  • CRUD сутностей з деякими полями, на яких є унікальний індекс
  • веб-програма для електронної комерції, як eBay ( кращий опис тут ).

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

Чи можете ви пояснити мені, чи я прошу груш у в'яза, коли я намагаюся використовувати базу даних, орієнтовану на документи, для цих вимог?


2
"просити груші * у в'яза" = просити неможливе. (Посилання Джейсона мертве.)
Денніс,

Відповіді:


37

Вам потрібно продумати, як ви підходите до заявки орієнтованим на документи. Якщо ви просто спробуєте повторити, як ви змоделюєте проблему в СУБД, тоді ви зазнаєте невдачі. Існують також різні компроміси, які ви, можливо, захочете зробити. ([ed: не впевнений, як це пов’язано з аргументом, але:] Пам’ятайте, що конструкція CouchDB передбачає, що у вас буде активний кластер із багатьох вузлів, які можуть вийти з ладу в будь-який час. Як ваш додаток буде обробляти один із вузлів бази даних, що зникає з під ним?)

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

Інший кут, про який слід подумати, - це можлива послідовність, коли ви врешті-решт перейдете в стабільний стан, але певний період часу ви можете бути непослідовними. Це анафема на землі СУБД, але надзвичайно поширена в реальному світі. Прикладом канонічної операції є переказ грошей з банківських рахунків. Як це насправді відбувається в реальному світі - за допомогою окремих атомних операцій або через різні банки, що видають один одному кредитні та дебетові повідомлення? Що відбувається, коли ви пишете чек?

Тож давайте розглянемо ваші приклади:

  • CRUD сутностей із деякими полями з унікальним індексом.

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

Тому нам потрібно розглянути реальну проблему та з’ясувати, чи зможемо ми це моделювати. Вам справді потрібні, щоб вони були унікальними? Чи може ваша програма обробляти кілька документів з однаковим значенням? Вам потрібно призначити унікальний ідентифікатор? Чи можете ви це зробити детерміновано? Поширеним сценарієм, коли це потрібно, є де потрібно унікальний послідовний ідентифікатор. Це важко вирішити в тиражованому середовищі. Насправді, якщо унікальний ідентифікатор повинен бути строго послідовним щодо створеного часу, це неможливо, якщо вам потрібен ідентифікатор відразу. Вам потрібно послабити принаймні одне з цих обмежень.

  • веб-додаток для електронної комерції, як

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


Як щодо використання UUID для розподілених глобальних унікальних ідентифікаторів, що не мають спільного доступу? Чи часто люди роблять це у світі баз даних документів?
Paul Legato,

@Tim Lovell-Smith + kerrr +1 Мені подобається реальне порівняння з паперовими документами. :) Важливо відзначити, що CouchDB вимагає / передбачає кластеризацію. Також добре, що послідовність не завжди гарантована. Для мене як прихильника RDB це звучить (звичайно, серед інших): "якщо узгодженість має вирішальне значення, використовуйте реляційну базу даних". Правда? (Примітка: Зараз я починаю новий проект, якщо б я хотів вирішити, чи використовувати NoSQL або RDB.)
try-catch-нарешті

12

Чи потрібна нормалізація даних?

  • Так: Використовуйте реляційні.
  • Ні: використовувати документ.

13
Я знаю, ви давно відповіли на це, але я думав, що запитаю ... Коли вам "потрібно" нормалізувати? Чи не є нормалізація вибором / найкращою практикою?
Matt Grande

1
@Matt, нормалізація даних - це лише інструмент. Ступінь нормалізації даних - це компроміс між зусиллями з проектування бази даних та зусиллями щодо забезпечення узгодженості.
pyon

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

Що ви маєте на увазі під нормалізацією тут? Якщо я правильно розумію нормалізацію як засіб досягнення мети, ваша відповідь здається неповною ...
Тім Ловелл-Сміт

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

8

Я перебуваю в одному човні, зараз люблю couchdb, і я думаю, що весь функціональний стиль чудовий. Але коли саме ми починаємо використовувати їх найефективніше для додатків. Я маю на увазі, так, ми всі можемо почати розробляти додатки надзвичайно швидко, без утилізації, з усіма тими неприємними зависаннями про нормальну форму, які залишаються на стороні і не використовують схеми. Але, щоб висловити фразу "ми стоїмо на плечах велетнів". Існує вагома причина використовувати СУБД, а також нормалізувати та використовувати схеми. Моя стара голова оракула хитається, думаючи про дані без форми.

Мій головний фактор вау на couchdb - це реплікація та система версій, яка працює в тандемі.

Протягом останнього місяця я розбивав мозок, намагаючись розібратися з механізмами зберігання couchdb, очевидно, він використовує дерева B, але не зберігає дані на основі нормальної форми. Чи означає це, що він насправді дуже розумний і розуміє, що біти даних реплікуються, тож давайте просто зробимо вказівник на цей запис дерева B?

Поки що я думаю про xml-документи, конфігураційні файли, файли ресурсів, потокові до рядків base64.

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

Може бути корисним для зберігання даних RDF або навіть тексту у вільній формі.


6

Можливість мати основну реляційну базу даних, яка зберігає визначення елементів, які можна отримати за їх ідентифікаторами, та базу даних документів для описів та / або специфікацій цих елементів. Наприклад, ви можете мати реляційну базу даних із таблицею Products із такими полями:

  • ProductID
  • Опис
  • Ціна за одиницю
  • Розмір лоту
  • Технічні характеристики

І це поле «Технічні характеристики» насправді містило б посилання на документ із технічними характеристиками продукту. Таким чином, у вас є найкраще з обох світів.


2
SQL Server 2008 є прикладом бази даних, яка може виконувати і те, і інше (з використанням типу даних FILESTREAM).
Джон Сондерс,

Ого. Чудова функція. (Я ніколи не користувався SQL Server 2008.)
pyon,

Просто можливість зберігати вільний "документ" або файл не робить його системою баз даних, орієнтованою на документ. Реальні бази даних, орієнтовані на документи, надають вам можливості для індексування та ефективної роботи з документами.
Тім Ловелл-Сміт,

@ TimLovell-Smith Якщо існує якась структура, найвигідніше скористатися використанням реляційної бази даних (або, ще краще, категоричної: math.mit.edu/~dspivak/informatics/talks/CTDBIntroductoryTalk ). Я виступаю за встановлення чіткого розділення між структурованою та неструктурованою частинами даних.
pyon

@ TimLovell-Smith Як так? Ви згадали "функції для індексування та роботи з документами". Індекси є структурами, і, таким чином, як я вже сказав, "найбільш вигідно скористатися перевагами використання реляційної бази даних", навіть якщо фактичний зміст документів не є такою.
pyon

4

БД на основі документів найкраще підходять для зберігання, ну, документів. Lotus Notes є загальним впровадженням, а електронною поштою Notes є прикладом. Для того, що ви описуєте, електронної комерції, CRUD тощо, реальні БД краще призначені для зберігання та пошуку елементів даних / елементів, які індексуються (на відміну від документів).


9
Я не згоден. База даних документів не призначена в першу чергу для зберігання документів. Він призначений для зберігання ієрархічних фрагментів даних (або JSON, або XML). Ви можете індексувати вкладені поля JSON та масиви JSON, наприклад, MongoDB. Ви можете зберігати документи (файли) у MongoDB (gridfs), але MongoDB все одно буде корисним, якщо ви не можете зберігати документи (файли) за допомогою MongoDB. Я думаю, що MongoDb слід називати JSON db, а не db документа.
Тео,

1
Відповідно до статті Вікіпедії для "Бази даних, орієнтованої на документи", "... використання XML, YAML або JSON для зберігання інформації має переваги, подібні до бази даних, орієнтованої на документи", але це не одне і те ж. Бази даних документів спочатку були розроблені таким чином, щоб зберігати документи. Якщо ви використовуєте їх для інших даних, ви не збираєтесь отримати найкращу продуктивність / використання точно так само, як якщо б ви зберігали документи в реляційних базах даних. Цього трапляється багато. Люди зберігають реляційні дані в базах даних документів, а потім скаржаться, наскільки поганими є бази даних. Якщо ви зловживаєте ними, так.
Джим Андерсон,

1
Запис у Вікіпедії en.wikipedia.org/wiki/Document-oriented_database був оновлений з того часу, і варто поглянути, щоб підтвердити, що бази даних, орієнтовані на документи, насправді більше, ніж картотеки для фактичних документів.
Zsolt Török

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

2

Re CRUD: вся парадигма REST відображається безпосередньо в CRUD (або навпаки). Отже, якщо ви знаєте, що можете змоделювати свої вимоги за допомогою ресурсів (ідентифікуваних за допомогою URI) та базового набору операцій (а саме CRUD), ви можете бути дуже близькими до системи на основі REST, яку пропонує безліч систем, орієнтованих на документи коробки.


1
Я не думаю, що порівняння CRUD з REST достатньо, щоб подумати про використання баз даних, орієнтованих на документ. Є набагато більше речей, які слід врахувати, REST <> CRUD - це лише невелика його частина.
igorsantos07

1
Я підтримав це, оскільки мені здавалося, що я похило посилаюся на те, що відоме як "невідповідність імпедансу об'єктно-реляційного зв'язку" (див. Blogs.tedneward.com/post/the-vietnam-of-computer-science ).
Том Рассел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.