Які аргументи проти або для введення логіки програми в рівень бази даних?


74

ПРИМІТКА Аудиторія programmers.se та dba.se різна і матиме різні точки зору, тому в цьому випадку я думаю, що правильно дублювати. Які аргументи проти або для введення логіки програми в рівень бази даних? на програмістів.se.

Я вже не міг знайти дискусію на dba з цього приводу, і в оригінальній публікації сказано все, тож:

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

Особисто я вважаю за краще тримати якомога більше у шарі додатків, щоб полегшити налагодження та тримати окремі обов'язки шарів.

Які ваші думки з цього приводу, а що потрібно або не слід добре реалізовувати у шарі бази даних?

NB Я не є ОП з цього питання, але первинне формулювання залишилося недоторканим.


4
Порівнюючи відповіді тут і на SO, розрив вражає. Розробники протестують проти затримок, пов'язаних із централізацією процесів у базі даних, але для DBA, це добре. Змушуючи людей вкладати більше часу та зусиль на запит на новий вид або провід, зменшується кількість контактних точок з даними, що полегшує підтримку узгодженості та зменшує кількість точок оптимізації.
Йон усіх торгів

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

Відповіді:


56

Різні думки ...

Ваш код бази даних буде переживати технологію вашого клієнта програми. Подумайте про ADO.NET -> Linq -> EF, а також про різні ORM. Тоді як ви все ще можете запустити код SQL Server 2000 з минулого тисячоліття проти всіх вищевказаних клієнтських технологій.

У вас також є проблема з кількома клієнтами: у мене є .net, java та Excel. Це 3 набори логіки програми.

"Бізнес-логіку" не слід плутати з "логікою цілісності даних". Якщо у вас є клієнти, які розпочинають транзакції і роблять різні перевірки, це багато db-дзвінків і довга транзакція.

Логіка програми не масштабується для великих обсягів даних. У нас є 50k рядків в секунду, використовуючи збережені програми. Сестринська команда, що використовує сплячку, не може отримати одну секунду


Поки ви залишаєтесь реляційними базами даних
JMD Coalesce

1
@JMDCoalesce: Ви все ще потребуєте ділової логіки та можете мати кілька клієнтських додатків.
gbn

40

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

Останній Fortune 500, в якому я працював, мав програми, написані щонайменше на 25 мовах, що стосуються їх бази даних OLTP. Деякі з цих програм перейшли до виробництва в 1970-х.

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

Які шанси?

Хіба це не одне найбільше " планети не повторити "?


Це застосовується лише в тому випадку, якщо кілька додатків використовують одну базу даних
JMD Coalesce

1
@JMDCoalesce, яка поширена у багатьох середовищах. Основна програма, звітування в Excel, звітування на стороні сервера, масові витяги: вона незабаром додається. Практично будь-яка банківська програма має безліч клієнтських додатків,
gbn

Звичайно, але не всі програми призначені для банківської діяльності.
JMD Coalesce

29

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

Я знаю, що мене тут загрожує світ, але ділова логіка вкладається в базу даних, оскільки:

  • Ви можете дозволити користувачам ділової енергетики прямий доступ до бази даних і не турбуватися про те, що вони їх розкручують (або турбуєтесь менше, ніж ви б використовували логіку на основі додатків)
  • Користувач живлення може створювати нові звіти, не чекаючи нової версії програмного забезпечення.
  • Ви можете протестувати код SP / TRIGGER в копії бази даних, як і ви перевіряєте логіку на основі додатків
  • Ви можете тримати SQL, щоб створити sp та тригери в текстових файлах (ви все одно повинні робити це для таблиці / коду перегляду)
  • Ви можете змішувати і співставляти мови без перенесення бізнес-логіки
  • Ви можете внести зміни в бізнес-логіку, не оновлюючи кожного програмного забезпечення
  • Ви змінюєте структуру аудиту так само, як і аудит діяльності бази даних - за допомогою журналу
  • Значно поліпшена безпека та контроль доступу до дрібного зерна (більшість логічних реалізацій на основі додатків використовують власну модель безпеки, тому дані набагато простіше поставити під загрозу. Зворотне шифрування паролем не рідкість)
  • Безпека користувачів на базі даних значно знижує збитки / крадіжки, які може зробити SQL

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

Жоден із них не повинен мати значення для кваліфікованого розробника.

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


1
* Збережені програми / тригери можуть забезпечити рівень абстракції, що дозволяє вносити структурні зміни в базу даних, не змінюючи весь код програми. * Не кожен користувач бази даних буде сумлінно використовувати ваше проміжне програмне забезпечення. * Давайте, зовнішній ключ - це правило бізнесу !! * Видалення всіх перевірок / обмежень / коду з db означає, що він не може захистити себе від невідповідності / пошкодження. * Кожен додаток не вимагає створення транзакцій без керування транзакціями, як, наприклад, eBay, розроблений після того, як вони стали успішними і могли дозволити собі це створити. * SQL не все так важко, люди.
Крейг

23

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


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

4
ви використовуєте "власний" в іншому сенсі, ніж я: я можу сказати, що якщо ви "вирішите" проблеми з одночасністю, перш ніж вони потраплять у базу даних, ви також повинні переконатися, що ваші - це єдині програми, що впливають на базу даних, або їх потрібно вирішити. знову на цьому рівні. Я погоджуюсь з голосовою відповіддю: "Ваш код бази даних [ймовірно] переживе вашу технологію клієнта програми".
Джек Дуглас

17

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


3. Додайте обмеження цілісності / перевірки до базової бази даних,зі складнішим кодом, реалізованим мовою процедур, що зберігаються в базі даних. Завдяки цьому ми отримуємо одне центральне місце для підтримки, і ми отримуємо абсолютне виконання правил навіть для програм, про які ми не знаємо! Ми отримуємо одну мову для вираження ділових правил протягом усього портфоліо додатків та життєвого циклу, оскільки мова змінюється набагато частіше, ніж база даних. Він працює в системі, яка вже настільки важлива як місія, як і найважливіші програми. Помилки обробляються існуючим кодом, який обробляє помилки бази даних в цих додатках. Все ще існує ризик, що програма може зламати звичайно, але з трьох сценаріїв це найменше, і лише зламана програма потребує будь-яких змін, не всі з них (і більшість механізмів SP / бази даних дозволять зробити виняток для однієї програми, якщо це дійсно, дійсно необхідно). Думаєте, це не має значення на вашому сайті Greenfield або невеликій компанії? Добре, якщо ваш бізнес буде успішним, через 30 років ви побажаєте, щоб ви прислухалися до моєї мудрості!

… Деякі [заперечення], які я часто чую:

  • Важко контролювати версію SP-коду, розгорнутого в БД. Я не думаю, що це правда, ніж сказати, що важко керувати версією Java-коду, розгорнутого на сервері додатків, що означає, що це зовсім не складно, це звичайно. А в Ruby-land цілі книги написані саме про те, як отримати свій код із середовища розробки у виробництво, з чим, схоже, не стикається жодна інша мовна спільнота. Але все-таки керування збереженою процедурою, мабуть, занадто складно.
  • Збережені процедури важко перевірити. Це дивне. Для початку СП сильно набрані; компілятор скаже вам, чи є шлях коду до або не, що не має сенсу, а в Oracle принаймні обчислить усі залежності для вас. Отож, це один набір загальних тестових одиниць, який може знадобитися у Ruby, усунутому з місця. Для тестування OO-коду потрібно знущатися над тим, щоб примусити об'єкт до внутрішнього стану, необхідного для відображення тестового сценарію - як налаштування даних тесту відрізняється? Крім того, є виробник TAP для PL / SQL та інших інструментів. Є налагоджувачі і профілі теж.
  • Мова, що зберігається, не є повноцінною мовою. Ну, ми не намагаємось написати всю заявку лише у збережених процедурах! Більшість виділених мов SP мають усі сучасні конструкції, яких ви очікували, і в Oracle принаймні ви можете використовувати Java Stored Procedure з усіма мовними особливостями, якими розробники OO знайомі, або зовнішні процедури будь-якою мовою. Важливо, де реалізована логіка - в одному місці, близькому до даних - власне мова - це лише деталь. PL / SQL компілюється в початковий код і працює в процесі роботи з базою даних; немає більш високої продуктивності архітектури, ніж ця.
  • Мені не хочеться вивчати іншу мову. Якщо не помітити на секунду, це величезний червоний прапор у будь-якого розробника (особливо того, який пропонує змінити виробничі додатки, які так чи інакше можуть бути іншими мовами!), Можна багато чому навчитися працювати в будь-яких сучасних умовах: типовий магазин Java може мати Eclipse , WebLogic, Maven, Hudson, Anthill, Subversion та цілу низку інших, про які потрібно дізнатися, перш ніж писати єдиний рядок коду програми. Знання мови на високому рівні SP дуже просте в порівнянні, і, швидше за все, спеціаліст або DBA можуть допомогти вам теж. Не кажучи вже про те, що улюблений розробник Hibernate має власну мову запитів ...


12

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

Крім того, як GBN вказувало вище, SQL-код майже повсюдно переживає код програми.

Хоча це правда, що EF або NHibernate або LinqToSql або що завгодно дозволить вам генерувати код швидше, кожен програміст, вартий їх продуктивності, знає, що лише оптимізація SQL оптимізує пошук даних. RDBMS розуміє лише SQL, тому вам потрібно зробити все в SQL, перш ніж це все буде сказано і зроблено. (припускаючи, що ми можемо погодитися, що TSQL і PLSQL все ще є SQL)


11

Одне з приводу того, що люди не обов'язково обговорюють - плюси тут вичерпані, - це вартість.

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


7

Ось де неминуче має відбутися зустріч розумів, тобто розуму розробників (DV) та DBA. Робота з Business Logic (BL) та зберігання таких у базі даних може мати вплив, який може як прославити, так і жахнути її реалізацію.

Для деяких продуктів RDBMS існує чудові бібліотеки / інструменти / API для бізнес-логіки та об’єктних інфраструктур, які можна швидко вивчити та використовувати у своїх програмах. Для інших RDBMS відсутні бібліотеки / інструменти / API.

Раніше клієнтські серверні програми перетворювали міст в BL за допомогою зберіганих процедур (SP). Для таких продуктів, як Oracle і SQL Server, це було зроблено рано. По мірі створення баз даних з відкритим кодом, таких як PostgreSQL та MySQL, ті, хто їх використовує, ризикують зламати нову основу із збереженими процедурами в BL. PostgreSQL дуже швидко визрівав у цьому, оскільки були впроваджені не тільки збережені процедури, але і можливість розробки мов клієнтів. MySQL в основному припинив розвиватися у світі збережених процедур і прийшов у вичерпаній формі мови з багатьма обмеженнями. Таким чином, якщо мова заходить про BL, ви повністю перебуваєте на милі MySQL та мови його збереженої процедури.

Залишається лише одне питання: Незалежно від RDBMS, чи повинен BL проживати повністю або частково в базі даних?

Подумайте про розробника. Коли в програмі все не вдається, процес налагодження дозволить розробнику скачувати та виходити з бази даних, щоб слідкувати за ланцюжками даних, які можуть або не можуть бути виправними. Це як кодування програми C ++ та виклик коду Assembler посередині. Ви повинні перейти з вихідного коду, класів і структур на переривання, регістри та зсуви І НАЗАД !!! Це налагодження на тому самому рівні.

Розробники можуть мати можливість створити високошвидкісний метод виконання BL у поєднанні з мовними конфігураціями (прапори компілятора для C ++, різні налаштування для PHP / Python тощо) через бізнес-об'єкти, що сидять у пам'яті, а не в базі даних. Деякі намагаються перенести цю ідеологію для швидшого запуску коду в базу даних, написавши бібліотеки, де налагодження збережених процедур і тригерів добре інтегровано в базу даних і, здавалося б, корисно.

Таким чином, розробнику поставлено завдання розробляти, налагоджувати та підтримувати вихідний код та BL у двох мовах.

А тепер подумайте про DBA. База даних Бази даних хоче зберегти СУБД максимально вираженою та значущою у царині збережених процедур. DBA може сприймати BL як щось зовнішнє до Бази даних. Тим не менш, коли SQL вимагає даних, необхідних для BL, SQL має бути худорлявим і середнім.

Тепер на зустріч умів !!!

Розробник кодує SP та використовує ітерактивні методи. DBA дивиться на SP. DBA визначає, що один оператор SQL може замінити ітерактивні методи, написані розробником. Розробник бачить, що оператор SQL, запропонований DBA, вимагає викликати інший BL-код або SQL, який не відповідає нормальним планам виконання оператора SQL.

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

ВИСНОВОК

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


4

Це приємне запитання на веб-сайті, повному DBA. Сподіваємось, більшість відповідей буде "про" щодо збереження бази даних у ACID-стані та, таким чином, збереження ділової логіки в базі даних. :-)

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


1
Одна і та ж логіка в два шари?
дезсо

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

2
Вся логіка бізнесу повинна бути реалізована в базі даних (тому не діліть "логіку"). Все, що ви можете легко перевірити в додатках (наприклад, з регулярними виразами у Javascript) - це менше роботи для бази даних (у разі недійсного введення).
Рууд ван де Бітен

2
+1 це те, що я роблю - я просто називаю це "введення реєстраційного коду в базу даних і встановлення зручності перевірки в додатку"
Джек Дуглас

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

2

Як сказав Адам Муш вище, тут є ще що враховувати для продуктивності. Використання процесора. Використання пам'яті.

Блокуйте, очевидно, неправильні речі, щоб потрапити до бази даних.

  • Вилучіть електронні адреси, які не відповідають певним чином.
  • Перевірте довжину

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

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

Використовуйте сили кожного кінця на вашу користь.

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