Модулирование 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. Вы можете абстрагироваться таким образом. Другой способ - абстрагировать данные, которые вас интересуют, в материализованные представления. Делая это, вы можете поместить обычный вид (см. Виртуальную функцию) поверх этих материализованных представлений, которые позволяют вам проверять структуру данных, не касаясь "сырых" таблиц.