Я маю зазначити проблеми з DRY у світі реляційних баз даних. Бази даних призначені для швидкої та ефективної роботи з використанням заданої логіки та за допомогою запитуваних запитів. Принципи DRY часто змушують розробника писати неаргабельні запити або використовувати логіку Row-by-agonging-Row для використання існуючого коду в декількох ситуаціях. Сухості та оптимізація продуктивності часто розходяться, а у світі баз даних продуктивність, як правило, набагато важливіша, ніж ремонтопридатність. Це не означає, що ви взагалі не повинні використовувати принципи DRY, просто ви повинні знати, як це вплине на загальну зручність використання бази даних. Розробники додатків річ DRY по-перше, а продуктивність по-друге, розробники баз даних вважають цілісність даних по-перше, продуктивність по-друге, безпека даних третьою (продуктивність і безпека можуть поміняти місця в деяких системах).
Я взагалі помітив, що чим більше шарів абстракції ви вводите в запити бази даних, тим повільніше вони стають. Я не кажу, що я не хотів, щоб люди, які самі розробляли програми баз даних, не зробили кращої роботи, дозволяючи розробникам використовувати DRY, не впливаючи на ефективність роботи бази даних, але я не розробляю програмне забезпечення для баз даних на цьому рівні , тому, можливо, конфлікт між абстракцією та продуктивністю в базі даних виправити важче, ніж я припускаю. Однак нам доводиться працювати з системами, якими вони побудовані. Ми можемо попросити кращого впровадження принципів DRY у майбутніх випусках, що також не призведе до вдосконалення продуктивності (і покращилось з роками, але все ще є проблематичним), але тим часом ми повинні врахувати, чи DRY є правильним кроком для цієї бази даних у цей час.
Але часто саме ті функції, які ви хочете використовувати для забезпечення дотримання принципу DRY, - це ті, що створюють величезні проблеми для бази даних. Я не кажу, що ніколи не використовуйте DRY, але не перестарайтеся з цим.
Приклади того, про що я говорю. Вам потрібно здійснювати імпорт даних мільйона записів раз на місяць. Записи вже можна вручну додавати через користувальницький інтерфейс, викликаючи збережену програму. Цей процес, оскільки він був розроблений для імпорту одного запису, додає лише один запис за один раз. Використовуючи DRY, щоб уникнути наявності коду вставки в двох місцях, ви пишете курсор для повторного виклику протоколу, а не записування необхідного імпорту на основі встановлених даних. Час імпорту йде від 30 хвилин, які знадобляться на основі заданої логіки до 18 годин. Тепер правильним способом дотримуватися DRY у цьому випадку було б виправити процедуру для обробки імпорту записів з декількома помилками. На жаль, часто неможливо або дуже складно надіслати масив до протоколу (залежно від заднього кінця db) і, змінивши proc, ви в кінцевому підсумку зламаєте додаток.
Скалярні функції та функції, що оцінюються за таблицею, також використовуються для реалізації принципів DRY, і знову вони можуть серйозно вплинути на продуктивність, особливо якщо вам потрібно використовувати їх таким чином, щоб запобігти корисності індексів.
Погляди також хороші для впровадження DRY. Однак якщо ви реалізуєте DRY шляхом використання представлень, які викликають погляди, які викликають інші представлення, ви швидко дістанетесь до того моменту, коли запити очікуються під навантаженням. Насправді вам може знадобитися генерувати набори даних із мільйонів записів, коли вам потрібно лише три в кінці. Тож однорівневий погляд на складний набір об'єднань для впровадження DRY може бути чудовим (у мене є один, який ми використовуємо, щоб переконатися, що вся фінансова звітність використовує один і той же базовий набір таблиць і розрахунки певних речей), більше ніж два рівні і вам потрібно врахувати, чи створюєте ви безлад.