Нереляційна розробка баз даних [закрито]


114

Мені цікаво почути про стратегії дизайну, які ви використовували з нереляційними базами даних "nosql" - тобто (переважно новим) класом сховищ даних, які не використовують традиційний реляційний дизайн або SQL (наприклад, Hypertable, CouchDB, SimpleDB, сховище даних Google App Engine, Voldemort, Cassandra, SQL Data Services тощо). Їх також часто називають "магазинами ключів / цінностей", а в основі вони діють як гігантські стійкі розподілені стійкі хеш-таблиці.

Зокрема, я хочу дізнатися про відмінності концептуальної розробки даних із цими новими базами даних. Що легше, що складніше, що взагалі неможливо зробити?

  • Ви придумали альтернативні конструкції, які працюють набагато краще в нереляційному світі?

  • Чи вдарили ти головою об все, що здається неможливим?

  • Чи ви усунули проміжок будь-якими моделями дизайну, наприклад, щоб перевести з одного на інший?

  • Ви взагалі взагалі робите чіткі моделі даних (наприклад, в UML), або ви цілком їх налаштовували на користь напівструктурованих / орієнтованих на документ крапок даних?

  • Чи сумуєте за будь-якими основними додатковими послугами, які надають RDBMS, як цілісність реляцій, підтримка довільно складних транзакцій, тригери тощо?

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

FYI, тут були обговорені StackOverflow на подібні теми:


2
ключ / значення баз даних стара нова річ.
Крістофер

1
Для будь-кого, хто зацікавлений убер, триває довга форма дискусії про групу Google NoSQL тут: groups.google.com/group/nosql-discussion/browse_thread/thread/…
Іан Варлі

4
FYI, я написав звіт на довгу форму на цю тему тут: google.com/url?sa=D&q=http://ianvarley.com/UT/MR/… Дякуємо всім вам за корисну інформацію!
Ян Варлі

Відповіді:


55

Я думаю, ви повинні врахувати, що нереляційні СУБД сильно відрізняються щодо своєї моделі даних, тому концептуальна конструкція даних також сильно відрізнятиметься. У потоці Дизайн даних у нереляційних базах даних групи NOSQL групи Google різні парадигми класифікуються так:

  1. Великі подібні системи (HBase, Hypertable тощо)
  2. Ключові цінності (Токіо, Волдеморт тощо)
  3. Бази даних документів (CouchDB, MongoDB тощо)
  4. Графічні бази даних (AllegroGraph, Neo4j, Кунжут тощо)

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

Слайди презентації (SlideShare) Graph База дані і майбутня великомасштабного управління знаннями по Марко Родрігесу містять дуже гарне введення в конструкцію даних з використанням бази даних графіків , а також.

Відповідаючи на конкретні запитання з точки зору graphdb:

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

Подолання розриву: я схильний робити це по-різному для кожного випадку, виходячи з самого домену, оскільки я не хочу "орієнтований на таблицю графік" тощо. Однак ось деякі відомості щодо автоматичного перекладу з RDBMS на graphdb.

Явні моделі даних: я роблю це постійно (стиль дошки), а потім використовую модель, як це є в БД.

Міс зі світу RDBMS: прості способи створення звітів. Оновлення: може бути , це не що важко створити звіти з бази даних графів, см Створення звіту для бази даних Neo4j зразка .


79

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

Але я маю кілька попередніх висновків:

Ви придумали альтернативні конструкції, які працюють набагато краще в нереляційному світі?

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

Структура БД документа змінює складності: у SQL є негнучкі дані та гнучкі запити, у БД документів - навпаки.

Модель CouchDB - це набір "документів JSON" (в основному вкладені хеш-таблиці). Кожен документ має унікальний ідентифікатор і його можна тривіально отримати за ідентифікатором. Для будь-якого іншого запиту ви пишете "представлення", які називаються наборами функцій карти / зменшення. Перегляди повертають набір результатів у вигляді списку пар ключів / значень.

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

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

Оформлення документів надзвичайно гнучка. Я знайшов лише два обмеження:

  • Зберігайте пов’язані дані разом в одному документі, оскільки приєднання нічого не відповідає.
  • Не робіть документи настільки великими, що вони надто часто оновлюються (як, наприклад, розміщення всіх продажів компанії за рік в одному документі), оскільки кожне оновлення документа викликає повторну індексацію.

Але все залежить від проектування поглядів.

У альтернативних конструкціях я виявив, що робочі замовлення на розмір краще з CouchDB, ніж будь-яка база даних SQL, знаходяться на системному рівні, а не на рівні зберігання. Якщо у вас є деякі дані та ви хочете розмістити їх на веб-сторінці, складність загальної системи знижується щонайменше на 50%:

  • відсутність проектування таблиць БД (незначна проблема)
  • немає проміжного шару ODBC / JDBC, всі запити та транзакції через http (помірний випуск)
  • просте відображення DB-об'єкта від JSON, що майже тривіально порівняно з аналогічним у SQL (важливо!)
  • Ви можете потенційно пропустити весь сервер додатків, оскільки Ви можете спроектувати документи, які слід отримувати безпосередньо в браузері за допомогою AJAX, та додати трохи полірування JavaScript перед тим, як вони відображатимуться як HTML. (ВЕЛИЧЕЗНО !!)

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

Чи вдарили ти головою об все, що здається неможливим?

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

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

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

Чи ви усунули проміжок будь-якими моделями дизайну, наприклад, щоб перевести з одного на інший?

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

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

Тобто: один документ для Замовлення, який містить ідентифікатор клієнта та ідентифікатори продукту, із необхідними копіями полів для спрощення запитів. Все, що знаходиться в документі, можна легко запитати, все, що вимагає перехресних посилань між, наприклад, Замовлення та Клієнт, має робити клієнт. Тож, якщо ви хочете отримати звіт про продажі по регіонах, вам, мабуть, слід покласти код регіону в замовлення.

Ви навіть взагалі робите чіткі моделі даних (наприклад, в UML)?

Вибачте, ніколи не робив багато UML перед документами БД :)

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

Чи сумуєте ви про якісь основні додаткові послуги, які надають RDBMS?

Ні. Але мій досвід розробник веб-додатків, ми маємо справу з базами даних лише в тій мірі, в якій ми повинні :)

Компанія, в якій я працював, зробила продукт (webapp), розроблений для запуску через бази даних SQL від багатьох постачальників, а "додаткові сервіси" настільки відрізняються від БД до БД, що їх доводилося реалізовувати окремо для кожної БД. Таким чином, нам було менше роботи з переміщення функціональності з RDBMS. Це навіть розширилося до повнотекстового пошуку.

Тож від чого я відмовляюся - це те, чого я ніколи насправді не мав. Очевидно, ваш досвід може відрізнятися.


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

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

Що я намагаюся сказати, це те, що всі успішні додатки документів, про які я знаю, були з даними, які в першу чергу не мали великої взаємозв'язку: Документи (як у пошуку Google), повідомлення в блогах, статті новин, фінансові дані .

Я очікую, що є набори даних, які краще відображають SQL, ніж модель документа, тому я думаю, що SQL виживе.

Але для тих із нас, хто хоче просто простий спосіб зберігання та отримання даних - і я підозрюю, що нас багато - бази даних документів (як у CouchDB) є знахідкою.


9
Дуже корисний. Особливо "SQL має негнучкі дані та гнучкі запити, БД документів - навпаки" та відсутність об'єднань.
j_random_hacker

2
+1, це було дуже проникливим.
Мас

2
Так правда, я б голосував за це не раз, якщо можливо.
Октавіан А. Дам’ян

Це все ще було надзвичайно корисно у 2014 році. Було б чудово, якби ви могли додати те, що ви дізналися з 2010 року, або посилання на інформацію, яку ви можете мати деінде.
Меггі

11

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

Важче:

  • Переосмислюється на концептуальному рівні, тому це "важче", оскільки це просто інше. Оскільки ви повинні заздалегідь знати свої шаблони доступу до даних, автоматичний переклад не застосовується. Вам потрібно буде хоча б додати шаблон доступу.
  • Послідовність даних не обробляється базою даних, але вона повинна вирішуватися в додатку. Менші гарантії означають більш просту міграцію, відмову та кращу масштабованість ціною складнішого додатка. Додаток має вирішувати конфлікти та невідповідності.
  • Посилання, на яких перехресні документи (або ключ / значення) також мають бути вирішені на рівні заявки.
  • Бази даних типів SQL мають значно більш зрілі IDE. Ви отримуєте велику кількість бібліотек підтримки (хоча розшарування цих бібліотек робить речі набагато складнішими, ніж потрібно для SQL).

Простіше:

  • Швидше, якщо ви знаєте свої схеми доступу до даних.
  • Міграція / відмова від системи простіша для бази даних, оскільки вам не обіцяно як програмісту програми. Хоча ви отримуєте можливу консистенцію. Ймовірно. Нарешті. Деякий час.
  • Один ключ / значення зрозуміти набагато простіше, ніж один рядок із таблиці. Всі (дерево) відносини вже є, і повноцінні об'єкти можна розпізнати.

Моделювання має бути приблизно однаковим, але ви повинні бути обережними щодо того, що ви вкладаєте в один документ: UML також можна використовувати як для моделювання OO, так і для моделювання БД, що вже є двома різними звірами.

Мені б хотілося побачити гарну відкриту базу даних OO, добре поєднану з C # / Silverlight. Просто зробити вибір ще складніше. :)


1

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

Наприклад, зазвичай ви можете прочитати файл із 10000 записів і сортувати його за полем менше ніж за півсекунди, прийнятний час відповіді.

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


1

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

Ще один момент, коли у RDBM є проблеми, - це обробка ключами, що залежать від історії / часу.


3
Стефан - ви праві, що реальних систем часто бракує у відділі нормалізації. Але не точно сказати, що RDBMses "не добре вступати"; Більшість комерційних продуктів (наприклад, Oracle, MS SQL Server тощо) мають надзвичайно розширені оптимізатори запитів і можуть виконувати широкий спектр різних алгоритмів фізичного об'єднання, набагато швидше, ніж ті ж операції, які можна було б зробити в коді програми. (MySQL - виняток із цього, з того, що я розумію). На мій досвід, передчасна денормалізація, як і інші передчасна оптимізація, часто є ознакою поганих розробників.
Ян Варлі

2
Продовжуючи цю думку: погані приєднання є результатом поганої індексації та статистики. Якщо оптимізатору немає з чим працювати або інформація про те, що він має, застаріла, він зробить поганий вибір. Багато хто помиляє це за «погане приєднання». Сучасні системи RDBM мають автоматичну настройку, яка маскує необхідність використання вашого мозку під час налаштування індексації та статистики. Також люди плутають логічну схему (п'ята нормальна форма) та фізичну схему (часто денормалізовану до третьої норми). Тільки тому, що БД, який ви бачите , "широкий", не означає, що він був погано розроблений логічно.
Годеке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.