Я должен упомянуть проблемы с DRY в мире реляционных баз данных. Базы данных предназначены для быстрой и качественной работы с использованием основанной на множестве логики и посредством запросов sargable. Принципы СУХОГО часто заставляют разработчика писать запросы без Sargable или использовать логику Row-by-agonizing-Row для использования существующего кода в различных ситуациях. СУХОЙ и оптимизации производительности часто противоречат друг другу, и в мире баз данных, производительность, как правило, гораздо более критична, чем поддержка. Это не означает, что вам вообще не следует использовать принципы DRY, просто вы должны знать, как это повлияет на общее удобство использования базы данных. Разработчики приложений считают «СУХОЙ» в первую очередь, а производительность - во-вторых, разработчики баз данных - в первую очередь «целостность данных», «второе - производительность», «третья безопасность данных» (в некоторых системах производительность и безопасность могут меняться местами).
В целом я заметил, что чем больше уровней абстракции вы помещаете в запросы к базе данных, тем медленнее они становятся. Я не говорю, что не хотел, чтобы люди, разрабатывающие сами программы баз данных, не делали работу, позволяющую разработчикам использовать DRY, не влияя на производительность базы данных, но я не занимаюсь разработкой программного обеспечения для баз данных на этом уровне. поэтому, возможно, конфликт между абстракцией и производительностью в базе данных сложнее исправить, чем я полагаю. Тем не менее, мы должны работать с системами, как они в настоящее время построены. Мы можем просить о лучшем внедрении принципов DRY в будущих выпусках, которые также не снижают производительность (и с годами она стала лучше, но все еще проблематична), но в то же время мы должны рассмотреть, является ли DRY правильным решением для этой базы данных. в это время.
Но часто именно те функции, которые вы хотите использовать для обеспечения соблюдения принципа СУХОЙ, вызывают огромные проблемы для базы данных. Я не говорю, никогда не используйте СУХОЙ, но не переусердствуйте с этим.
Примеры того, о чем я говорю. Вам необходимо выполнять импорт данных из миллиона записей раз в месяц. Записи уже могут быть добавлены вручную через пользовательский интерфейс, вызывая сохраненный процесс. Этот процесс, поскольку он был разработан для импорта отдельных записей, добавляет только одну запись за раз. Используя DRY, чтобы избежать вставки кода в двух местах, вы пишете курсор для многократного вызова proc, а не для записи необходимого импорта на основе набора. Время на импорт идет от 30 минут, которые потребуются при использовании логики на основе набора, до 18 часов. Теперь правильным способом придерживаться DRY в этом случае было бы исправление proc для обработки импорта нескольких записей. К сожалению, часто невозможно или очень трудно отправить массив в процесс (в зависимости от серверной части базы данных), и, изменяя процесс, вы в конечном итоге нарушаете работу приложения.
Скалярные функции и табличные функции также используются для реализации принципов DRY, и они также могут серьезно повлиять на производительность, особенно если вам нужно использовать их таким образом, чтобы индексы не были полезными.
Представления также хороши для реализации DRY. Однако, если вы реализуете DRY с помощью представлений, которые вызывают представления, которые вызывают другие представления, вы быстро достигнете точки, в которой запросы будут задерживаться при загрузке. На самом деле вам может понадобиться сгенерировать наборы данных из миллионов записей, когда вам нужно только три в конце. Таким образом, одноуровневое представление сложного набора объединений для реализации DRY может быть превосходным (у меня есть одно, которое мы используем, чтобы убедиться, что вся финансовая отчетность использует один и тот же базовый набор таблиц и вычислений определенных вещей), более двух уровней и вам нужно подумать, если вы создаете беспорядок производительности.