Changes between Initial Version and Version 1 of CustomerContractMenuView


Ignore:
Timestamp:
05/10/26 14:39:09 (2 weeks ago)
Author:
185022
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CustomerContractMenuView

    v1 v1  
     1= Преглед: v_customer_contract_menu =
     2
     3||= Датотека ||= `views/12_customer_contract_menu_view.sql` ||
     4||= Шема ||= `kbnteam` ||
     5||= Категорија ||= Оперативна поддршка ||
     6||= Поврзани индекси ||= Зависи од `v_customer_contract_meals` и `v_customer_contract_drinks` ||
     7
     8== Опис ==
     9Го комбинира `v_customer_contract_meals` и `v_customer_contract_drinks` во една унифицирана површина за мени. Употребува `UNION ALL` и дискриминатор `item_type` ('meal' или 'drink') за разликување на ставките. Колоните се нормализирани: `item_id`, `item_name`, `item_description`, `item_price`, `item_size`. Ова е главниот преглед за мени во апликацијата при нарачување.
     10
     11'''Важно:''' Бидејќи овој преглед се базира на два прегледа, неговите перформанси директно зависат од перформансите на `v_customer_contract_meals` и `v_customer_contract_drinks`.
     12
     13== Зависности ==
     14||= Извор ||= Тип ||= Опис ||
     15|| `kbnteam.v_customer_contract_meals` || UNION ALL дел 1 || Оброци под активни договори ||
     16|| `kbnteam.v_customer_contract_drinks` || UNION ALL дел 2 || Пијачи под активни договори ||
     17
     18== Излезни колони ==
     19||= Колона ||= Оброци ||= Пијачи ||= Опис ||
     20|| `customer_user_id` || ✓ || ✓ || ID на купувачот ||
     21|| `company_id` || ✓ || ✓ || ID на компанијата ||
     22|| `company_name` || ✓ || ✓ || Назив на компанијата ||
     23|| `contract_id` || ✓ || ✓ || ID на договорот ||
     24|| `rest_id` || ✓ || ✓ || ID на ресторанот ||
     25|| `rest_name` || ✓ || ✓ || Назив на ресторанот ||
     26|| `item_type` || `'meal'` || `'drink'` || Дискриминатор ||
     27|| `item_id` || `meal_id` || `drink_id` || ID на ставката ||
     28|| `item_name` || `meal_name` || `drink_name` || Назив на ставката ||
     29|| `item_description` || `meal_description` || NULL || Опис ||
     30|| `item_price` || `meal_price` || `drink_price` || Цена ||
     31|| `item_size` || `meal_weight` (g) || `drink_milliliters` (ml) || Величина ||
     32|| `category_name` || `cat_name` || NULL || Категорија (само оброци) ||
     33|| `ingredients` || текст || `''` || Состојки ||
     34|| `allergens` || текст || `''` || Алергени ||
     35
     36== SQL Дефиниција ==
     37{{{
     38#!sql
     39CREATE OR REPLACE VIEW kbnteam.v_customer_contract_menu AS
     40SELECT
     41    m.customer_user_id,
     42    m.customer_first_name,
     43    m.customer_last_name,
     44    m.customer_email,
     45    m.company_id,
     46    m.company_name,
     47    m.contract_id,
     48    m.rest_id,
     49    m.rest_name,
     50    'meal'::text AS item_type,
     51    m.meal_id AS item_id,
     52    m.meal_name AS item_name,
     53    m.meal_description AS item_description,
     54    m.meal_price AS item_price,
     55    m.meal_weight AS item_size,
     56    m.cat_name AS category_name,
     57    m.ingredients,
     58    m.allergens
     59FROM kbnteam.v_customer_contract_meals m
     60
     61UNION ALL
     62
     63SELECT
     64    d.customer_user_id,
     65    d.customer_first_name,
     66    d.customer_last_name,
     67    d.customer_email,
     68    d.company_id,
     69    d.company_name,
     70    d.contract_id,
     71    d.rest_id,
     72    d.rest_name,
     73    'drink'::text AS item_type,
     74    d.drink_id AS item_id,
     75    d.drink_name AS item_name,
     76    NULL::varchar(255) AS item_description,
     77    d.drink_price AS item_price,
     78    d.drink_milliliters AS item_size,
     79    NULL::varchar(255) AS category_name,
     80    ''::text AS ingredients,
     81    ''::text AS allergens
     82FROM kbnteam.v_customer_contract_drinks d;
     83}}}
     84
     85== Тестирање на перформанси ==
     86
     87=== Препорачано тест прашање ===
     88{{{
     89#!sql
     90SET search_path TO kbnteam;
     91SET statement_timeout = '60s';
     92
     93-- Тест 1: по купувач (основен use-case во апликацијата)
     94EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     95SELECT * FROM kbnteam.v_customer_contract_menu
     96WHERE customer_user_id = 1;
     97
     98-- Тест 2: по ресторан
     99EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     100SELECT * FROM kbnteam.v_customer_contract_menu
     101WHERE rest_id = 1;
     102
     103-- Тест 3: само оброци
     104EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     105SELECT * FROM kbnteam.v_customer_contract_menu
     106WHERE customer_user_id = 1 AND item_type = 'meal';
     107}}}
     108
     109=== Напомена за индекси ===
     110Овој преглед нема свои индекси. Перформансите целосно зависат од:
     111* Индексите на `v_customer_contract_meals` (од `indexes/v_menu_meal_index.sql`)
     112* Индексите на `v_customer_contract_drinks` (од `indexes/v_menu_drink_index.sql`)
     113
     114=== Резултати пред индексирање ===
     115||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||= Тест 3 (customer+meal) ||
     116|| Planning Time || ___ ms || ___ ms || ___ ms ||
     117|| Execution Time || ___ ms || ___ ms || ___ ms ||
     118|| Rows Returned || ___ || ___ || ___ ||
     119
     120{{{
     121-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     122}}}
     123
     124=== Резултати по индексирање ===
     125||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||= Тест 3 (customer+meal) ||
     126|| Planning Time || ___ ms || ___ ms || ___ ms ||
     127|| Execution Time || ___ ms || ___ ms || ___ ms ||
     128|| Rows Returned || ___ || ___ || ___ ||
     129
     130{{{
     131-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     132}}}
     133
     134=== Анализа на подобрување ===
     135||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     136|| Execution Time (Тест 1) || ___ ms || ___ ms || ___ % ||
     137|| Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||
     138
     139'''Очекувано:''' Поголемото подобрување доаѓа од страна на `v_customer_contract_meals` (CTE агрегации). `v_customer_contract_drinks` е природно побрз поради поедноставниот JOIN без CTE.