NoSQL: Що таке неструктуровані дані?


9

в даний час ми працюємо на краю ресурсів за допомогою нашого сервера на основі сервера mssql.

Зараз у нас є багато традиційних варіантів щодо наступного кроку щодо вирішення навантаження:

  • купуйте швидші процесори та IO
  • розділити деяких клієнтів на окремий сервер
  • переміщення db до кластеру

Всі вони або дорогі з точки зору ліцензування та обладнання, або за часом. Отже, я хочу додати ще один варіант, перемістивши всю систему до масштабованого рішення, яке обіцяє каскадра двигуна nosql.

Але я не впевнений і не маю досвіду роботи з базами даних noSQL, тому мені потрібно зрозуміти структуру "неструктурованих" даних.

У нашому додатку ми в основному зберігаємо дані, введені користувачами різними способами, як списки "ключові значення". Існує батьківська таблиця, яка містить головний елемент (як Порядок), і є дочірня таблиця з парами ключ-значення, що містить вміст замовлення (наприклад, Order_Lines).

Бізнес-розумні, Order та OrderLines - це одиниця. Але завдяки RDBMS вони зберігаються в таблицях і повинні постійно з'єднуватися.

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

Наприклад, у списку огляду ми показуємо ідентифікатор заголовка + деякі значення у стовпцях для кожного рядка.

ОНОВЛЕННЯ: Ми зберігаємо форми будь-якого типу. Отже, в основному ми зберігаємо «документи». Тим не менш, нам доводиться готувати і шукати ці форми за будь-яким значенням, сортуванням і т.д.

Як ви здогадуєтесь, кількість та доступність певних КВП варіюється від об'єкта до об’єкта. Немає дійсної можливості створювати єдині таблиці для кожного виду об’єктів, оскільки нам доведеться створити тисячі таблиць для різних комбінацій даних.

Чи краще такий тип «словника», як набори даних, зберігатись у базі даних noSQL? І чи матимемо ми від цього переваги від продуктивності? Буде Cassandra моделювати ці head + KVP як один набір даних? Переглядаючи веб-сторінку кассандри та деякі підручники, у мене складається враження, що між нашими RDBMS та кассандрою не так вже й багато різниться в організації даних - залишаючи нам таку ж величезну кількість приєднань, якщо ви хочете вибрати 5 KVP для списку для кожного рядка.

Просвітництво вітається, також вказівки на документи, що пояснюють проблеми, добре.

Відповіді:


3

Є кілька понять, які потрібно розрізнити. Один - про структуру, а інший - про схему.

Структуровані дані - це те, де програма заздалегідь знає значення кожного байту, який він отримує. Хороший приклад - вимірювання від датчика. На відміну від цього, потік Twitter неструктурований. Схема полягає в тому, яка частина структури передається СУБД, і як просять її застосувати. Він контролює, наскільки СУБД аналізує дані, які зберігається. Необхідні схеми СУБД, такі як SQL Server, можуть зберігати непартовані дані (варбінарні) або необов'язково проаналізовані дані (xml) та повністю проаналізовані дані (стовпці).

СУБД NoSQL лежать на спектрі від розбору (сховища ключових значень) вгору. Кассандра пропонує в цьому відношенні реально багату функціональність. Там, де вони помітно відрізняються від реляційних сховищ, є однаковість даних. Після того, як у таблиці визначено лише ті дані, які відповідають цьому визначенню, можуть міститися там. Однак у Кассандрі, навіть якщо стовпці та сімейство визначені, немає жодних вимог для двох рядків у одній таблиці, щоб вони були схожими один на одного. Дизайнеру програм належить вирішити, скільки коштує в одному рядку (який також називається документом) і що міститься окремо, пов'язане вказівниками. Насправді, скільки денормалізації ви хочете.

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


1
У нашому випадку дані, які ми зберігаємо, в основному утворюють дані. Користувач визначає форму під час виконання і може змінювати її в будь-який час, коли йому подобається. Форма може бути побудована з тисяч полів. Це може статися, якщо дані схожі на список. Якби ми знали дані заздалегідь - під час проектування db, ми би їх нормалізували. Ваш коментар щодо погляду на дані змушує задуматися: Якщо форми написані як документ, як створити подання на них за списком або сортувати дані за полем у реальному житті? Зніміть дані на карті, пригадайте та підготуйте список у коді?
1515

Історично все було на стороні клієнта - ви отримали документи і зробили те, що вам довелося. У CQL є положення, з якими будь-який розробник SQL був би знайомий. Зменшення карт - це архітектура переходів для великих наборів даних. І схоже на те, що Cassandra 3.0 матиме перегляд матеріалів .
Майкл Грін

5

Незважаючи на те, що в IMHO є основна база даних noSQL, рішення про впровадження такої технології повинно прийматися відповідно до досягнень, необхідних відповідно до інформації, що зберігається, а не лише для того, щоб ви працювали на даний момент. Це означає, що, можливо, найкращим варіантом є приєднання до бази даних SQL та вдосконалення вашого HW.

Але додатково я прочитав щось у вашому запитанні, що змусило мене задуматися. Про поточний стан вашої бази даних не так багато, але ваше речення "ми, як правило, зберігаємо дані, введені користувачами різними способами, як" списки ключових значень ", змушує задуматися, чи проблема не буде поганою моделлю даних, а не брак фізичних ресурсів. Я керував дійсно великими таблицями (+10 млрд. Рядків) з неймовірною продуктивністю в "традиційних" базах даних SQL.

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

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

CREATE TABLE benchmarkTable (
  element INTEGER,
  key1 VARCHAR(xx),
  key2 INTEGER,
  key3 DECIMAL(5,2),
...
);

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

Сподіваюся, що це допомагає або, принаймні, розширює можливості та відкриває нову лінію для розслідування.


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

Зрозумів. Я не знаю, наскільки це складно, але як ідея спробувати, чи вдасться створити таблицю, що містить пул загальних ключів, на який посилається в заповненій користувачем таблиці виконуючим FK, можливо, ІНТЕГЕР? Можливо, це трохи ефективніше, ніж індексація стовпчика вархара, що, якщо вона змінюється дуже динамічно, я думаю, це не буде коротким. І це також зменшило б розмір індексу.
LironCareto

1
Це відходить від питання, але ми обговорили певні обмеження можливостей користувача. Наприклад, зменшіть поля максимальної таблиці додатків до 10 ванільних varchar db-полів. Це денормалізація схеми для вибору головного набору даних та 10 значень стовпців додатків за один раз або з максимум одним приєднанням на додатковій таблиці db. Змінюючи відповідні значення, нам доведеться також змінити цей один db-рядок у коді. Це здається можливим і зменшує кількість приєднань до 10 для вибору для відображення таблиці додатків. Тим не менш, зміна визначення колонки додатків користувача дуже дорога.
15.15

1
Це нормально, не хвилюйтесь. Я думаю, що я бачу вашу думку, і ваш підхід вважає мене гарною компромісом між поліпшенням ефективності та здійсненністю. Важливо мати статистику використання, очевидно, для визначення цих полів. Ви це орієнтували? Принаймні, це може придбати вам деякий час, поки ви не знайдете (краще? Остаточне?) Рішення або, можливо, виявите, що можете довго працювати з цим.
LironCareto
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.