Моя команда боїться реляційних баз даних із зовнішніми ключовими стосунками, і я не розумію, чому


12

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

У наших схемах db для мікросервісів суб’єкти рідко мають більше однієї таблиці. Все, що ви зазвичай нормалізуєте в іншій таблиці, зберігається у колонці json. Якщо згодом буде виявлено, що один із властивостей цього json потрібно запитувати, додається новий стовпець і дані зберігаються в обох місцях (так, у двох різних стовпцях тієї ж таблиці).

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

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

Сьогодні, розмовляючи з одним із наших головних інженерів, він намагався відштовхнути мене від цієї схеми. Намагаючись всіляко стверджувати, що нам насправді це не потрібно, це спричинить проблеми в майбутньому, посилаючись на старий моноліт, який ми маємо, - це дизайнерська травестія. Він назвав те, що ми робимо як "по-старому", а плоскі столи з json як "новий шлях". Він стверджував, що там, де я хочу атомності, вона нам не потрібна і що замість запитів нам слід робити більше пам’яті. Це принцип дизайну, якого зараз дотримуються багато наших служб. Ми не передбачаємо, що обсяг наших даних істотно зросте, що повинно швидше підтримувати наші запити. Ми передбачаємо, що багато часу витрачається на оцінку правил та виконання дій.

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

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


Відповідь на ваше запитання в заголовку була б "Вони злякані через старий моноліт у вашій компанії". Але частина вашого запитання, здається, взагалі задає щось інше, тобто "Чи вводять зовнішні ключі проблеми з продуктивністю?"
Крістіан

2
Цікаво, який відсоток RDBMS вони вбудували в "додаток" коду
Caleth

Хороший підхід чи ні, залежить від того, який саме додаток ви будуєте, його потреби та напрямок, яким він рухається (вимоги, архітектурні обмеження) - те, що ми не можемо оцінити тут. Що стосується NoSQL - вся справа полягала у підтримці масивної горизонтальності, а також у визнанні того, що не всі програми потребують суворих обмежень RDBMS. Щоб дізнатися більше, використовуйте найкращі 3 відповіді тут як вихідну точку (2-й та 3-й ідемо більш глибоко).
Філіп Мілованович

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

@Blrfl Відмінно кажучи
Роббі Ді

Відповіді:


8

Ключове слово, щоб зрозуміти, звідки походить ваша команда, - це "мікросервіси". Варто спочатку прочитати цю концепцію, особливо для наступної інформації:

  • Як слід зберігати дані?
  • Принципи дизайну?
  • Як вони розроблені для масштабування?

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

Один із ідеалів - кожен мікросервіс повинен мати власний сховище даних. ПРИМІТКА. Я сказав, що сховище даних, а не база даних. Бувають випадки, коли ви просто хочете пошукову машину, зберігання блоків або просту кешування, на відміну від звичайної бази даних. Залежно від того, з ким ви спілкуєтесь, цей ідеал може навіть перейти до сховища даних для кожного екземпляра мікросервісу!

Підсумок полягає в тому, що, коли ви говорите про перехід до масштабу Інтернету, безпека та знайомість транзакцій ACID (атомічність, послідовність, ізоляція та довговічність) просто не змінюються, коли у вас є мільйони користувачів на одній базі даних. З появою NoSQL парадигма більше змістилася до BASE (Основно доступний, м'який стан, подія консистенції). ( довідник )

Існує вплив зміни PH на те, як ви керуєте даними:

  • Речами, якими використовувалася база даних, вам потрібно керувати в коді зараз
  • Легше масштабувати, кидаючи більше екземплярів мікросервісу при проблемі, ніж додавати "нескінченні" ресурси на сервер
  • Ви збільшуєте надійність ціною підвищеної складності

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


+1 Чудовий матеріал - навколо мікросервісів є багато тонкощів, напевно, це означає, що це не лише випадок заміни баз даних.
Роббі Ді

@RobbieDee, погодився. У цьому світі багато складності, і не всі згодні з деталями.
Berin Loritsch

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

7
Це гарна відповідь, і я її підтримав. Я хотів би лише зазначити, що те, що ви називаєте "масштабом Інтернету", стосується лише найбільшої компанії; Для переважної більшості корпоративних баз даних та веб-сайтів (я б сказав 95%) "звичайні" нормалізовані бази даних SQL все ще є повністю життєздатними.
Роберт Харві

@RobertHarvey, я погоджуюся від щирого серця. Я прочитав кілька статей про мікросервіси, які вказують, про що я писав. У власних проектах ми використовуємо базу даних SQL з належною нормалізацією та обмеженнями. Це може зашкодити пуристському серцю, але реальність полягає в тому, що наша база користувачів досить мала (сотні або користувачів), і база даних не є проблемою продуктивності для нас.
Berin Loritsch

3

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

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

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

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


+1 Відмінна ідея. І якщо обсяги занадто великі для машини розробників, зразок 1 в N часто може також давати чудові уявлення.
Роббі Ді

2

Я думаю, що вони бояться відтворити ту саму стару "травестію", яка була там раніше, а не саму референтну доброчесність.

Він стверджував, що там, де я хочу атомності, вона нам не потрібна ...

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

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

Будемо сподіватися, що ви праві. Я б припустив, що покладатися на дані, які залишаються "досить малими", щоб залишатися ефективними, є ризикованим.

Крім того, яка швидкість змін у цих Правилах? Чим більше у вас дублікацій, тим більше часу (інакше грошей) ви будете витрачати на оновлення тієї самої речі в декількох місцях.


1

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

Отже, для RDBMS заданого розміру ти зазвичай маєш свій логічний дизайн (без надмірності) та фізичний дизайн (із надмірністю) для продуктивності.

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

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

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

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


1
чому це заборонено? це врівноважена відповідь. прагматизм +1
Дірк Бур

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

Денормалізація даних у назві виступу на початку проекту ... Підказка: ви цього не робите :)
Роббі Ді

1
Значення RDBMS не походить від ефективності диска.
TehShrike

0

Це залежить від того, яку базу даних ви використовуєте.

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

У способі налаштування nosql це менш зрозуміло. Оскільки міцних відносин немає, правозастосування відносин стає менш важливим. Такий вміст json з індексом стовпців набагато частіше зустрічається в цих системах, оскільки жодні відносини не означають, що його менше шансів вийти з синхронізації. Атомність обмежена єдиною таблицею, тому що так працює noql.

Що краще, залежить від того, що ви насправді робите, і що вам насправді потрібно.

Але це звучить так, ніби ваші колеги перебувають у вантажному культі. Їх вкусили старі погані речі, тому тепер речі повинні бути новими блискучими. Через кілька років, як тільки вони будуть укушені новою блискучою річчю, вони, сподіваємось, зрозуміють, що SQL проти noSQL - це набір компромісів.

Але вони не стануть. Сподіваємось, ви хочете.

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