Чим орієнтований на стовпці NoSQL відрізняється від документ-орієнтованого?


89

Три типи баз даних NoSQL, про які я читав, це ключ-значення, орієнтований на стовпці та документ.

Ключ-значення досить прямий - ключ із простим значенням.

Я бачив орієнтовані на документи бази даних, що описуються як ключ-значення, але значення може бути структурою, як об'єкт JSON. Кожен "документ" може мати всі, деякі або жоден з тих самих ключів, що й інший.

Орієнтований на стовпці схожий на документ, орієнтований на те, що ви не вказуєте структуру.

То яка різниця між цими двома, і чому б ви використовували одне над іншим?

Я спеціально розглядав MongoDB та Cassandra. Мені в основному потрібна динамічна структура, яка може змінюватися, але не впливати на інші значення. Одночасно мені потрібно мати можливість шукати / фільтрувати певні клавіші та запускати звіти. Для CAP AP є для мене найважливішим. Дані можуть "врешті-решт" синхронізуватися між вузлами, лише якщо немає конфлікту чи втрати даних. Кожен користувач отримав би свою "таблицю".

Відповіді:


41

У Кассандрі кожен рядок (до якого звертається ключ) містить один або кілька "стовпців". Стовпці самі по собі є парами ключ-значення. Назви стовпців не потрібно задавати заздалегідь, тобто структура не є фіксованою. Стовпці в рядку зберігаються у відсортованому порядку відповідно до їх ключів (імен).

У деяких випадках у вас може бути дуже велика кількість стовпців підряд (наприклад, щоб діяти як індекс, щоб увімкнути певні типи запитів). Кассандра може ефективно обробляти такі великі структури, і ви можете отримувати певні діапазони колон.

Існує ще один рівень структури (не так часто вживаний), який називається супер-стовпцями, де стовпець містить вкладені (допоміжні) стовпці.

Ви можете уявити загальну структуру як вкладений хеш-таблицю / словник з 2 або 3 рівнями ключа.

Звичайне сімейство стовпців:

row
    col  col  col ...
    val  val  val ...

Супер сімейство колонок:

row
      supercol                      supercol                     ...
          (sub)col  (sub)col  ...       (sub)col  (sub)col  ...
           val       val      ...        val       val      ...

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

Дивіться також це запитання: Кассандра: Що таке підколонка

Або посилання на моделювання даних з http://wiki.apache.org/cassandra/ArticlesAndPresentations

Щодо: порівняння з орієнтованими на документи базами даних - останні зазвичай вставляють цілі документи (як правило, JSON), тоді як у Кассандрі ви можете звертатися до окремих стовпців або суперколонок та оновлювати їх окремо, тобто вони працюють на різному рівні деталізації. Кожен стовпець має свою окрему позначку часу / версію (використовується для узгодження оновлень у розподіленому кластері).

Значення стовпця Кассандри - це просто байти, але їх можна ввести як ASCII, текст UTF8, числа, дати тощо.

Звичайно, ви можете використовувати Кассандру як примітивний сховище документів, вставляючи стовпці, що містять JSON - але ви не отримаєте всіх можливостей справжнього сховища, орієнтованого на документи.


5
Родина стовпців - як стіл. Рядок схожий на рядок таблиці. Стовпці схожі на стовпці бази даних, за винятком того, що їх можна визначити на льоту, тому у вас може бути дуже рідко заповнена таблиця в деяких випадках, або у вас можуть бути різні стовпці, заповнені в кожному рядку.
DNA

1
Це залежить від бази даних. У MongoDB (орієнтований на документи) ви також можете оновити кожен окремий ключ.
Девід Рааб,

1
Якщо це правда, як MongoDB визначає базу даних, орієнтовану на документи, тоді як Кассандра орієнтована на стовпці. Чим вони відрізняються?
Лука

3
Орієнтована на @Luke Column виглядає майже так само, як безсистемна СУБД, але, крім її нещільної структури, головна відмінність полягає в тому, що вона не є відносною.
user327961

1
@ user327961 Але MongoDB також схожий на безсистемну СУБД, і це також не відносини.
huggie

54

Основна відмінність полягає в тому, що сховища документів (наприклад, MongoDB та CouchDB) дозволяють довільно складні документи, тобто піддокументи в піддокументах, списки з документами тощо, тоді як сховища стовпців (наприклад, Cassandra та HBase) дозволяють лише фіксований формат, наприклад, строгий однорівневий або дворівневі словники.


У цьому випадку mongo (документ) може робити те, що може cassendra (стовпець). Навіщо тоді потрібна колонка?
sanjay patel

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

29

У "вставці", щоб використовувати слова rdbms, Документознавство є більш послідовним і прямим вперед. Примітка, ніж cassandra, дозволяє вам досягти узгодженості з поняттям кворуму, але це не стосуватиметься всіх систем на основі стовпців і що зменшує доступність. На важкій системі, що пише один раз / часто читає, перейдіть до MongoDB. Також враховуйте це, якщо ви завжди плануєте прочитати всю структуру об’єкта. Система, заснована на документах, призначена для повернення цілого документа, коли ви його отримаєте, і не дуже сильна при поверненні частин цілого рядка.

Системи, що базуються на стовпцях, такі як Кассандра, набагато кращі за документи, орієнтовані на "оновлення". Ви можете змінити значення стовпця, навіть не прочитавши рядок, який його містить. Запис фактично не потрібно робити на одному сервері, рядок може міститися в декількох файлах декількох серверів. На величезній швидкозростаючій системі даних вирушайте до Кассандри. Також розгляньте це, якщо ви плануєте мати дуже великий шматок даних на ключ, і вам не потрібно буде завантажувати їх усі під час кожного запиту. У "вибрати" Cassandra дозволяє завантажувати лише потрібний стовпець.

Також врахуйте, що Mongo DB написана на C ++ і перебуває у другому великому випуску, тоді як Кассандрі потрібно працювати на JVM, а її перший великий випуск є кандидатом на випуск лише з вчора (але випуски 0.X перетворилися на виробництва вже велика компанія).

З іншого боку, розроблений Кассандрою частково базувався на Amazon Dynamo, і в основі його побудовано як рішення високої доступності, але це не має нічого спільного з форматом на основі стовпців. MongoDB теж масштабується, але не настільки витончено, як Кассандра.


1
Що поганого в тому, що частина програмного забезпечення написана на C ++ проти Java?
Наюкі

@Nayuki Зараз, я знаю, що існують високі навантаження, де лінивий збір сміття в Java-моделі управління пам'яттю перевершує теоретично модель "ручного" управління C ++, але загалом кажучи, зазвичай не складно перевершити Java, написавши еквівалент програма на C ++, принаймні до тих пір, поки ви вимкнете винятки та RTTI. І якщо ви добре використовуєте бездоганні програми та функції, що відновлюються, ну, я особисто ще не бачив, щоб Java перемагала мій C ++.
patrickjp93

0

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

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

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