Модулирование SQL, даже если только синтаксический сахар
Есть ли способ модульного кода SQL, чтобы он был более читабельным и проверяемым?
Мой код SQL часто становится длинной сложной серией вложенных объединений, внутренних объединений и т.д., которые трудно писать и трудно отлаживать. Напротив, на языке процедур, таком как Javascript или Java, можно было бы отжать отдельные элементы в виде отдельных функций, которые вы бы назвали по имени.
Да, каждый может писать каждый как полностью отдельные запросы, хранящиеся в базе данных, или как хранимые процедуры, но часто я не хочу изменять/загромождать базу данных, просто спросите, это нормально, особенно если администратор базы данных не " t желает предоставить разрешения на запись всем пользователям.
Например, концептуально сложный запрос может быть легко описан в псевдокоде следующим образом:
(getCustomerProfile)
left join
(getSummarizedCustomerTransactionHistory)
using (customerId)
left join
(getGeographicalSummaries)
using (region, vendor)
...
Я понимаю, что много написано по этой теме с теоретической точки зрения (несколько ссылок ниже), но я просто ищу способ сделать код более удобным для написания правильно и легче читать после его написания. Возможно, просто синтаксический сахар, чтобы отвлечь сложность от зрелища, если не от исполнения, который компилируется в буквальном SQL, на который я пытаюсь не смотреть. По аналогии...
- Stylus: CSS::
- CoffeeScript: Javascript::
- Язык макроса SAS: язык SAS::
- ?: SQL
И если особый вкус SQL имеет значение, большая часть моей работы находится в Vertica.
http://lambda-the-ultimate.org/node/2440
Повторное использование кода и модульность в SQL
Не работают ли базы данных и функциональное программирование?
Ответы
Ответ 1
В большинстве баз данных вы можете делать то, что хотите, с помощью CTE (Common Table Expressions):
with CustomerProfile as (
getCustomerProfile
),
SummarizedCustomerTransactionHistory as (
getSummarizedCustomerTransactionHistory
),
GeographicalSummaries as (
getGeographicalSummaries
)
select <whatever>
Это работает для одного запроса. Преимущество состоит в том, что вы можете определить CTE один раз, но использовать его несколько раз. Кроме того, я часто определяю CTE под названием const
, который имеет постоянные значения.
Следующий шаг - взять эти конструкции и создать из них виды. Это особенно полезно при совместном использовании кода между несколькими модулями для обеспечения постоянных определений. В некоторых базах данных вы можете поместить индексы в представления, чтобы "создать их", а также оптимизировать обработку.
Наконец, я рекомендую обертывать вставки/обновления/удаления в хранимых процедурах. Это позволяет вам иметь согласованную структуру.
Еще два комментария. Во-первых, SQL часто используется для транзакций или систем отчетности. Часто, как только вы получаете данные в нужном формате для этой цели, данные говорят сами за себя. Например, вы можете просто спросить о пакете данных, который содержит три таблицы, посвященные этим трем тематическим областям, которые заполняются один раз в неделю или один раз в день.
И SQL не является языком идеи для абстракции. С хорошей практикой, соглашениями об именах и стиле отступов вы можете сделать это полезным. Я очень скучаю по некоторым вещам с "настоящих" языков, таких как макросы, обработка ошибок (почему ошибки данных настолько трудно идентифицировать и обрабатывать, что это выходит за рамки меня), согласованные методы для общей функциональности (может кто-то сказать, объединение строк группы) и некоторые другие функции. Тем не менее, поскольку он ориентирован на данные и легко распараллеливается, он более полезен для меня, чем большинство других языков.
Ответ 2
Проблема здесь в том, что вам нужно думать о данных реляционным способом. Я не верю, что этот тип абстракции правильно вписывается в реляционную модель. Что касается модуляции SQL, то для чего хранятся хранимые процедуры и/или функции. Обратите внимание, как они имеют те же характеристики, что и методы на Java. Вы можете абстрагироваться таким образом. Другой способ - абстрагировать данные, которые вас интересуют, в материализованные представления. Делая это, вы можете поместить обычный вид (см. Виртуальную функцию) поверх этих материализованных представлений, которые позволяют вам проверять структуру данных, не касаясь "сырых" таблиц.