Роберт Мартин в своей книге "Чистая архитектура" утверждает, что "База данных — это деталь", давайте разберемся, так ли это.
Время от времени появляется задача, в которой логика уплывает из кода в бд.
-- находим все бонусные пакеты с которыми взаимодействовала определенная точка продажи + сколько на данный бонусный пакет зачислено баллов
WITH tmp_main_sale_point_data AS (
SELECT
bp.id AS package_id, -- бонусный пакет
SUM(t.bonus_accumulated_write_on + t.bonus_present_write_on + t.bonus_action_write_on) AS write_on -- сколько зачислила точка подажи (на данный бонусный пакет)
FROM bonus_package bp
INNER JOIN transaction_package tp on tp.package_id = bp.id
INNER JOIN transaction t on t.id = tp.transaction_id
AND t.organization_id = 'ac0a1d3d-3cd5-f565-e351-beb7303aebb7'
AND t.sale_point_id = '9fdc912a-afd4-3e2a-ddf0-858037092e1a'
GROUP BY bp.id
)
-- находим все точки продаж (которые взаимодействовали с ранее найденными бонусными пакетами), бонусные пакеты (с которыми взаимодействовала точка продаж) + сколько бонусов списано (с данного бонусного пакета)
, tmp_other_sale_point_data AS (
SELECT
t.sale_point_id,
tp.package_id,
SUM(t.bonus_accumulated_write_off + t.bonus_present_write_off + t.bonus_action_write_off) AS write_off -- сколько списала точка продажи (с данного бонусного пакета)
FROM transaction t
INNER JOIN transaction_package tp on tp.transaction_id = t.id
INNER JOIN tmp_main_sale_point_data m ON m.package_id = tp.package_id
WHERE t.sale_point_id is not null AND t.sale_point_id <> '9fdc912a-afd4-3e2a-ddf0-858037092e1a' -- исключаем выше найденную точку продажи
GROUP BY t.sale_point_id, tp.package_id
)
-- находим все точки продаж, которые с бонусного счета списали бонусов больше, чем зачислила выбранная точка продаж
SELECT
o.sale_point_id,
o.package_id,
o.write_off,
m.write_on
FROM tmp_other_sale_point_data o
INNER JOIN tmp_main_sale_point_data m ON m.package_id = o.package_id
AND m.write_on < o.write_off
;
Мы видим условия в SQL-запросе (значит логика уплывает в базу данных), следовательно база данных это уже не деталь (или не совсем деталь).
А теперь давайте подумаем, что было бы, если бы мы сделали базу данных всего лишь деталью:
Уверен, в Вашей практике возникали тоже задачи с логикой в SQL.
Итак, база данных это не всегда деталь, или деталь, но с логикой. Таким образом архитектурные слои немного размываются - часто говорят "абстракции текут".
Комментарии
Комментариев пока нет.