"Ніколи не роби в коді те, що ти можеш змусити SQL-сервер зробити добре для тебе" - Це рецепт поганого дизайну?


204

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

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

Питання полягає в тому, чи не використовувати таким чином механізм роботи вашої бази даних по суті погану практику проектування (і чому). Рядки далі розмиваються, коли вся логіка існує всередині бази даних, і ви просто натискаєте її через ORM.


60
Це одна з тих приказок, яку потрібно сприймати продумано. Він вибивається щоразу, коли знайдеться інший інженер, який робить "select * from table", а потім розчесає набір результатів замість того, щоб використовувати пункт де та вказувати стовпці. Але якщо ви забираєте це занадто далеко, ви закінчите інший безлад.
Майкл Коне

154
Починати фразу з "ніколи" або "завжди" майже завжди є рецептом поганого дизайну.
vsz

34
Хоча, безумовно, можна спробувати зробити занадто багато в SQL, я можу чесно сказати, що за 30 років розвитку та консалтингу я ніколи не бачив справжнього серйозного випадку (декілька другорядних). З іншого боку, я бачив буквально сотні серйозних випадків, коли розробники намагаються зробити багато в "коді", який вони повинні були робити в SQL. І я все ще їх бачу. Часто ...
RBarryYoung

2
@MrEdmundo Перейдіть до мета.
ta.speot.is

4
Це питання два в одному - я думаю, що його слід розділити. 1) Скільки потрібно зробити в SQL? 2) Скільки потрібно зробити в СУБД? Збережені процедури припадають на середину. Я бачив цілі програми, закодовані в збережених процедурах.
reinierpost

Відповіді:


321

Словами мирянина:

Це те, для чого створено SQL, і, вірите чи ні, я бачив, що робилося в коді:

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

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


88
+10000000000 за вказівку, що це небезпечно припускає, що все відбудеться лише через додаток.
HLGEM

11
@skynorth Це призводить до поганого дизайну бази даних. У нижній частині рядка ви отримуєте базу даних, доступ до якої може бути змістовно отриманий лише цим додатком завдяки всій післяобробній обробці.
Сірекс

21
@skynorth Якщо ви покладаєтесь на код, щоб переконатися, що ваші ключі підтримують цілісність, ви вилучаєте з БД основний принцип RDBMS. Це не має сенсу, оскільки тоді кожна програма, що звертається до БД, повинна переконатися, що вона точно повторить цю функціональність. Чому б просто не дозволити БД впоратися з цим, оскільки саме для цього він призначений. БД може, наприклад, попереджувати повторювані ключі.
Buttle Butkus

10
не забувайте угод!
Sklivvz

24
@skynorth: tl; dr: Правила, які підтримують ваші дані, повинні бути реалізовані в базі даних. тобто для 99% заявок, що коли-небудь написані, дані (і, отже, база даних) живуть looooooooooong після того, як ваша заявка буде мертвою і відпала. Я бачив це багато, багато разів за ці роки (Ей, нам потрібно розгорнути версію на Windows / iPhone / Android / що-небудь-нове-що-є, тому що {вставте сюди стару платформу} вмирає, ми ' буде хост або бази даних Oracle тут і створити новий користувальницький інтерфейс там ). Немає підстав для того, щоб ця тенденція припинилася сьогодні або в будь-який час незабаром.
Бінарний страшник

122

Я б перефразував це на "Ніколи не роби в коді те, що SQL Server може зробити для тебе добре ".

Такі речі, як маніпуляція з рядками, робота з регулярними виразками і таке, чого я б не робив у SQL Server (заборона SQL CLR).

Вищезгадане зазвичай говорить про такі речі, як - приєднання, встановлення операцій та запитів. Завданням цього є делегувати більшу частину важкого підйому на SQL Server (якщо це добре) і максимально зменшити кількість IO (тому нехай SQL виконує приєднання і фільтрує WHEREзастереження, повертаючи багато менший набір даних, ніж інакше).


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

3
Коні на курси innit guv?
StuperUser

28
@NathanLong Я не знаю, чому так багато людей все ще думають, що ви не можете тримати свій SQL в контролі джерел. Спочатку у нас просто були всі наші збережені процедури / сценарії таблиць / тощо, необхідні для створення бази даних з нуля в контролі джерел, а потім використовували проекти баз даних візуальних студій. Це прекрасно спрацювало без проектів і краще з ними. Як і будь-яка інша змінна річ, необхідна для створення вашої системи, повинна перебувати під контролем версій! Розгортання може бути виконано за допомогою інструментів redgate diff для більшості RDBMS, якщо ви будете тримати сценарії створення під контролем версій, не підтримуйте розроблені сценарії різного рівня
Jimmy Hoffa

3
Якщо ваш SQL має підтримку операцій REGEX і маніпуляції з рядками, їх виконання в SQL може стати хорошим вибором.
кевін клайн

3
@NathanLong: подумайте про це так, таблиця БД визначається фрагментом коду, записаним у текстовому файлі, синтаксис - за рядками "створити таблицю ...". Тепер ви можете зберігати цей текстовий файл у будь-якому SCM, який вам подобається, як і якщо у вас є код створення таблиці БД на вашій улюбленій мові програми, який викликає будь-який API, і ви збережете цей текстовий файл у вашому SCM. Я думаю, що проблема полягає в тому, що деякі люди вважають, що БД є якимось чином магічними звірами, і вони знають лише, як написати код VB (чи що завгодно), і тому вони думають лише з точки зору мови додатків, яку вони знають.
gbjbaanb

47

Ніколи не роби в коді те, що ти можеш змусити SQL-сервер робити добре для тебе (акцент мій)

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

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

Розглянемо наступні приклади:

  • Ви зберігаєте дату народження, і вам потрібно обчислити вік для групи користувачів. Ви можете змусити SQL-сервер робити віднімання, або ви можете зробити це у своєму коді. Кількість зворотних поїздок залишається однаковою, а кількість даних, що надсилаються вам, збільшується. Тому рішення на основі коду виграє
  • Ви зберігаєте дату народження, і вам потрібно знайти користувачів віком від 20 до 30 років. Ви можете завантажити всіх клієнтів назад на клієнта, зробити віднімання, щоб знайти вік, а потім виконати фільтрацію, але доставку логіки до SQL Server зменшив би кількість даних, не вимагаючи додаткових об’їзних поїздок; тому рішення на основі SQL виграють.

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

2
+1 це фантастична відповідь, оскільки дає конкретні приклади для підтримки обох напрямків.
Брендон

1
На вашому другому прикладі. що ви скажете, якщо сценарій наведений нижче - користувачі і bday є кешами і кажуть, що розмір запису знаходиться в межах 1000-2000. Хіба це не швидше зробити це в пам'яті, не потрібно виконувати db-дзвінок, оскільки дані кешуються, а також уникнути операції sql між «sql». Обробка буде повторюватися за допомогою списку 1000 + користувачів у пам'яті та пошуку місця відповідності. Не буде це швидше, ніж робити це в db
user4677228

1
@ user4677228 Але спробуйте збільшити масштаб :-p. Якщо ваш код повинен сканувати всі дані для обчислення всіх вікових категорій, а ваш бажаний результат - це лише "скільки користувачів принаймні 20 і молодше 30?", Кеші вам взагалі не допоможуть. Ви все одно закінчите передавати всю таблицю своєму клієнтові, але сервер баз даних може зробити це все в своїй пам'яті / кешах і дати вам швидку відповідь незалежно від того, підключається db-клієнт через локальні сокети або віддалено по мережі, якщо ви просто готові обчислити вік у WHEREзастереженні.
бінкі

21

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

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

Крім того, важлива роль відіграє вибір проекту бази даних . Наявність RDBMS (MS SQL, Oracle тощо) відрізняється від баз даних NoSQL, як RavenDB.


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

4
Те, що ви описуєте, не є кодом клієнта. Це бізнес-шар, де у вас може бути своя логіка маніпулювання. Однак виконання цієї логіки на записах 1M + відбиває вас назад.
Е.Л. Юсубов

@JimmyHoffa: Це неправда, іноді ви генеруєте перехідну інформацію, яку потрібно обробити тими даними, які вже є у пам'яті додатка. У цьому Linq творить чудеса.
Fabricio Araujo

@FabricioAraujo Я знаю, чому linq - це чудово, але ця відповідь говорить про те, щоб ніколи не встановлювати операції на основі коду програми, якщо ви ніколи не встановлювали операції в коді додатка, ви ніколи не будете використовувати linq, оскільки це вся мета linq. Я зазначаю, що ніколи не виконувати встановлені операції з кодом додатка - це погане правило
Джиммі Хоффа

@JimmyHoffa: Ні, правило говорить "ніколи не роби в програмі те, що RDBMS може зробити для тебе добре". І я кажу про перехідну інформацію - не інформацію, що зберігається в базі даних. Я працював над системами, де для повного заповнення бізнес-правил мені потрібно було обробити код. Я пам'ятаю правило Business, яке мені довелося після важкої обробки в БД додатково обробляти ці дані, щоб створити (дуже важливий) звіт. Я, який я міг би використовувати на цьому linq (це було зроблено на теперішньому неіснуючому Delphi.Net). Іншими словами, linq можна використовувати навіть за цим правилом.
Fabricio Araujo

13

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

Але у міру масштабування вашого продукту, як правило, стає легше масштабувати додаток, ніж масштабувати db. У великих установах не рідкість бачити, що сервери додатків перевищують кількість серверів баз даних в 10–1 і більше. Додавання більшої кількості серверів додатків часто є простим питанням клонування існуючого сервера на нове обладнання. Додавання нових серверів баз даних, з іншого боку, у більшості випадків значно складніше.

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


1
Гроші можуть вирішити проблеми з масштабністю обладнання, тоді як жодна сума грошей не може вирішити складність програмного забезпечення.
Тулен Кордова

3
@ user1598390 Дійсно: Апаратне забезпечення дешеве, програмісти - дорогі . Гроші можуть вирішити складність програмного забезпечення. Гроші, витрачені на програмістів. Але зауважте, що ми не говоримо про чистий код та спегетті. Ми говоримо про виконання робіт на стороні програми, а не на стороні БД. Складність програмного забезпечення пов'язана лише незначно, оскільки обидва варіанти можуть відповідати принципам хорошого дизайну. Краще питання: " який дизайн коштує дорожче? ".
tylerl

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

1
+1 за те, що єдина людина, яка згадує масштабування у своїй відповіді.
Метт

Обладнання було дешевим, але не більше - у центрі обробки даних електроенергія та обладнання становлять 88% від поточної вартості (цитується Microsoft), тому витрачати більше на програмістів для написання ефективного коду є дуже економічно вигідним, і будемо, поки ми не отримаємо необмежену кількість і дешева термоядерна синтез.
gbjbaanb

12

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

Отже, речі, які необхідно зробити в базі даних:

  • Аудит (лише аудит додатків не буде відслідковувати всі зміни в базі даних і, таким чином, марний).

  • Обмеження негідності даних, включаючи значення за замовчуванням, обмеження іноземних ключів та правила, які завжди повинні застосовуватися до всіх даних. Всі дані не завжди змінюються або вставляються через додаток, є одноразові виправлення даних, особливо великі набори даних, які не практично робити один раз за один раз (будь ласка, оновіть ці 100 000 записів, які отримали неправильне позначення як статус 1, коли вони повинні бути 2 через помилку коду програми або оновіть усі записи від клієнта A до клієнта B, оскільки компанія B придбала компанію A) та імпорт даних та інші програми, які можуть торкатися тієї самої бази даних.

  • ПРИЄДНАЄТЬСЯ та де фільтрує застереження (щоб зменшити кількість записів, надісланих по мережі)


6

"Передчасна оптимізація - корінь усього зла (більшість із нього, все одно) в комп'ютерному програмуванні" - Дональд Кнут

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

Незважаючи на те, що настрої в заголовковому рядку є захоплюючими і точними до точного (суцільна зернистість фільтрування, проектування, групування тощо повинна в переважній кількості випадків залишатися в БД), визначення "добре" може бути в замовлення. Завдань, які SQL Server може виконувати з високим рівнем продуктивності, безліч, але завдання, які ви можете продемонструватищо SQL Server робить правильно ізольованим, повторюваним чином, дуже мало. SQL Management Studio - це чудова IDE бази даних (особливо враховуючи інші параметри, з якими я працював, як TOAD), але вона має свої обмеження, спочатку серед них є те, що ви майже все використовуєте для цього (або будь-який процедурний код, який ви виконуєте в БД внизу) за визначенням є "побічним ефектом" (зміна стану, що лежить поза домену простору пам'яті вашого процесу). Крім того, процедурний код у SQL Server лише зараз, за ​​допомогою останніх IDE та інструментів, можна виміряти способом керованого коду, використовуючи метрику покриття та аналіз шляхів (так що ви можете продемонструвати, що це конкретно, якщо з твердженням зустрічаються тести X , Y і Z, і тест X призначений для того, щоб виправдати умову і виконати цю половину, тоді як Y і Z виконують "else" . Це, у свою чергу, передбачає, що у вас є тест, який може встановити базу даних у певному стартовому стані, виконати процедурний код бази даних за допомогою певних дій та стверджувати очікувані результати.

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


Чекай, чекай, що? Як ви отримали від підтверджень правильності тестів, які можуть довести, що помилки існують, але ніколи не можуть довести, що код правильний?
Мейсон Уілер

2
збережена процедура не є процесуальним кодом. SP - це попередньо обчислений SQL-запит, що зберігається та виконується всередині БД. Це не код програми.
gbjbaanb

1
Якщо SP обмежується запитом SQL, то ви праві. Якщо це T-SQL або PL / SQL, включаючи умовні перерви, цикли, курсори та / або іншу логіку без запитів, ви помиляєтесь. І багато SP, функцій та тригерів у БД по всьому кіберпростору мають ці додаткові елементи.
KeithS

5

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

Наприклад, якщо вам потрібно захопити деякі дані, а потім обчислити щось із даних, а потім зберегти ці дані в базі даних. Є два варіанти:

  • Візьміть дані у свою програму, обчисліть усередині програми та відправте дані назад у базу даних
  • Створіть збережену процедуру або подібне, щоб захопити дані, обчислити їх, а потім зберегти все з одного виклику на SQL-сервер.

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

Звичайно, ви збриєте 2 секунди. Однак, ви швидше витрачали 100% (принаймні) одного ядра процесора на сервері бази даних протягом 10 секунд, або ви швидше витрачали цей час на своєму веб-сервері?

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

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


1
ви також забуваєте мережеві поїздки - ви не можете горизонтально масштабувати, додаючи сервери без певного ефекту ефективності. Таким чином, зменшуйте навантаження даних, додаючи пункт де очевидно - але інші операції sql не обов'язково знижуватимуть продуктивність. Хоча ваша думка в цілому правильна, але не до того, коли ви ставитеся до БД як до глухого сховища даних. Найбільш масштабоване додаток, яке я коли-небудь працював над використаними збереженими процедурами для кожного дзвінка даних (за винятком 2 складних запитів). Третє рішення - найкраще - "зберігається програма, щоб забрати лише необхідні дані", не впевнений, чи ти мав на увазі це як "обчислити" чи ні.
gbjbaanb

4

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

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

Тільки мої 0,02 долара, хоча.


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

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

3

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

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

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

Чи виконує ваш ORM окремий вставку / оновлення для кожного об’єкта? Якщо так, то у вас буде серйозні проблеми з продуктивністю при пакетній обробці великих наборів даних. Встановити операції - це шлях. ORM матиме проблеми з точним моделюванням усіх можливих об'єднаних наборів, над якими можна було виконувати операції.

Чи вважаєте ви "шар" фізичним розщепленням серверів або логічним розщепленням? Запуск логіки на будь-якому сервері теоретично все ще може підпадати під логічний рівень. Ви можете організувати розділення, компілюючи в різні DLL, а не розбиваючи виключно сервери. Це може різко збільшити час реагування (але принести шкоду жертвам), зберігаючи при цьому проблеми. Розділена DLL пізніше може бути перенесена на інші сервери без нової збірки для збільшення пропускної здатності (за рахунок часу відгуку).


чому потік?
mike30

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

1
@HLGEM. Відповідь описує причини збереження логіки в базі даних або сидінні на сервері БД. Досі це не пояснює.
mike30

Вони, можливо, не потрапили до контрпунктів, як я це зробив, і тому я не подав заявки.
HLGEM

3

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

Тож це насправді хороша дизайнерська ідіома або правило. Жодна кількість продуктивності не допоможе в системі з пошкодженими даними.


0

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

Використання збережених процедур у базі даних дозволяє розробникам взаємодіяти з базою даних як API, не турбуючись про складну схему на звороті. Це також зменшує дані, що надсилаються на сервер, оскільки надсилаються лише ім'я та кілька параметрів. У цьому випадку більша частина логіки бізнесу все ще може бути в коді, але не у формі SQL. Код, по суті, готує те, що потрібно надіслати або запитати з бази даних.


0

Слід пам’ятати кілька речей:

  • Реляційна база даних повинна забезпечувати референтну цілісність через зовнішні ключі
  • Масштабування однієї бази даних може бути важким і дорогим. Масштабування веб-сервера набагато простіше, просто додавши більше веб-серверів. Приємно намагаються додати більше потужності SQL-сервера.
  • За допомогою C # і LINQ ви можете робити свої "приєднання" і багато чого за допомогою коду, так що ви в багатьох випадках отримуєте найкраще з обох світів.

0

"Передчасна оптимізація - корінь усього зла" - Дональд Кнут

Використовуйте найбільш підходящий для роботи інструмент. Для цілісності даних це часто база даних. Для передових бізнес-правил - це така система, заснована на правилах, як JBoss Drools. Для візуалізації даних це буде рамкою звітності. тощо.

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

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