База данных — это деталь

Роберт Мартин в своей книге "Чистая архитектура" утверждает, что "База данных — это деталь", давайте разберемся, так ли это.

Время от времени появляется задача, в которой логика уплывает из кода в бд.

-- находим все бонусные пакеты с которыми взаимодействовала определенная точка продажи + сколько на данный бонусный пакет зачислено баллов
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 понятнее)

Уверен, в Вашей практике возникали тоже задачи с логикой в SQL.

Итак, база данных это не всегда деталь, или деталь, но с логикой. Таким образом архитекурные слои немного размываются - часто говорят "абстракции текут".

Оцени публикацию:
  • 0,0
Оценили: 0


Предложения и пожелания:

 

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2020 YaPro.Ru

Лебеденко Николай Николаевич
Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter