Changes between Initial Version and Version 1 of MenuMealView


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

--

Legend:

Unmodified
Added
Removed
Modified
  • MenuMealView

    v1 v1  
     1= Преглед: v_menu_meal =
     2
     3||= Датотека ||= `views/01_menu_meal_view.sql` ||
     4||= Шема ||= `kbnteam` ||
     5||= Категорија ||= Мени и Каталог ||
     6||= Поврзани индекси ||= `indexes/v_menu_meal_index.sql` ||
     7
     8== Опис ==
     9Ги наведува сите оброци со нивната категорија, ресторан, состојки и алергени. Употребува две CTE за агрегирање на состојките и алергените во читливи низи преку `string_agg`. Се користи за прикажување на мени во веб апликацијата и во договорни погледи.
     10
     11== Зависности ==
     12||= Табела ||= Тип на употреба ||
     13|| `kbnteam.meal` || Главна табела ||
     14|| `kbnteam.category` || JOIN — категорија на оброкот ||
     15|| `kbnteam.restaurant` || JOIN — ресторан на оброкот ||
     16|| `kbnteam.meal_ingredient` || LEFT JOIN (CTE) — врска оброк-состојка ||
     17|| `kbnteam.ingredient` || JOIN (CTE) — назив на состојката ||
     18|| `kbnteam.alergen_ingredient` || JOIN (CTE) — врска состојка-алерген ||
     19|| `kbnteam.alergen` || JOIN (CTE) — назив на алергенот ||
     20
     21== Излезни колони ==
     22||= Колона ||= Извор ||= Опис ||
     23|| `meal_id` || `meal.meal_id` || Примарен клуч на оброкот ||
     24|| `meal_name` || `meal.meal_name` || Назив на оброкот ||
     25|| `meal_description` || `meal.meal_description` || Опис ||
     26|| `meal_price` || `meal.meal_price` || Цена ||
     27|| `meal_weight` || `meal.meal_weight` || Тежина во грами ||
     28|| `cat_id` || `category.cat_id` || Примарен клуч на категоријата ||
     29|| `cat_name` || `category.cat_name` || Назив на категоријата ||
     30|| `rest_id` || `restaurant.rest_id` || Примарен клуч на ресторанот ||
     31|| `rest_name` || `restaurant.rest_name` || Назив на ресторанот ||
     32|| `ingredients` || CTE `meal_ingredients` || Состојки одвоени со запирка ||
     33|| `allergens` || CTE `meal_allergens` || Алергени одвоени со запирка ||
     34
     35== SQL Дефиниција ==
     36{{{
     37#!sql
     38CREATE OR REPLACE VIEW kbnteam.v_menu_meal AS
     39WITH meal_ingredients AS (
     40    SELECT
     41        x.meal_id,
     42        string_agg(x.ingr_name, ', ' ORDER BY x.ingr_name) AS ingredients
     43    FROM (
     44        SELECT DISTINCT
     45            mi.meal_id,
     46            i.ingr_name
     47        FROM kbnteam.meal_ingredient mi
     48        JOIN kbnteam.ingredient i ON i.ingr_id = mi.ingr_id
     49    ) x
     50    GROUP BY x.meal_id
     51),
     52meal_allergens AS (
     53    SELECT
     54        x.meal_id,
     55        string_agg(x.alergen_name, ', ' ORDER BY x.alergen_name) AS allergens
     56    FROM (
     57        SELECT DISTINCT
     58            mi.meal_id,
     59            a.alergen_name
     60        FROM kbnteam.meal_ingredient mi
     61        JOIN kbnteam.alergen_ingredient ai ON ai.ingr_id = mi.ingr_id
     62        JOIN kbnteam.alergen a ON a.alergen_id = ai.alergen_id
     63    ) x
     64    GROUP BY x.meal_id
     65)
     66SELECT
     67    m.meal_id,
     68    m.meal_name,
     69    m.meal_description,
     70    m.meal_price,
     71    m.meal_weight,
     72    c.cat_id,
     73    c.cat_name,
     74    r.rest_id,
     75    r.rest_name,
     76    COALESCE(mi.ingredients, '') AS ingredients,
     77    COALESCE(ma.allergens, '') AS allergens
     78FROM kbnteam.meal m
     79JOIN kbnteam.category c ON c.cat_id = m.cat_id
     80JOIN kbnteam.restaurant r ON r.rest_id = m.rest_id
     81LEFT JOIN meal_ingredients mi ON mi.meal_id = m.meal_id
     82LEFT JOIN meal_allergens ma ON ma.meal_id = m.meal_id;
     83}}}
     84
     85== Тестирање на перформанси ==
     86
     87=== Препорачано тест прашање ===
     88{{{
     89#!sql
     90SET search_path TO kbnteam;
     91SET statement_timeout = '60s';
     92
     93-- Тест 1: филтрирање по категорија
     94EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     95SELECT * FROM kbnteam.v_menu_meal
     96WHERE cat_id = 1;
     97
     98-- Тест 2: филтрирање по ресторан
     99EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     100SELECT * FROM kbnteam.v_menu_meal
     101WHERE rest_id = 1;
     102}}}
     103
     104=== Резултати пред индексирање ===
     105Извршете ги горните прашања '''пред''' да ја примените датотеката `indexes/v_menu_meal_index.sql`.
     106
     107||= Метрика ||= Тест 1 (по cat_id) ||= Тест 2 (по rest_id) ||
     108|| Planning Time || ___ ms || ___ ms ||
     109|| Execution Time || ___ ms || ___ ms ||
     110|| Rows Returned || ___ || ___ ||
     111|| Scan Type (meal) || ___ || ___ ||
     112|| Scan Type (meal_ingredient) || ___ || ___ ||
     113
     114{{{
     115-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     116}}}
     117
     118=== Применети индекси ===
     119{{{
     120#!sql
     121-- indexes/v_menu_meal_index.sql
     122-- Note: uq_meal_restaurant_name already supports (rest_id, meal_name).
     123CREATE INDEX IF NOT EXISTS idx_meal_cat_id_meal_id
     124ON kbnteam.meal (cat_id, meal_id);
     125
     126CREATE INDEX IF NOT EXISTS idx_meal_ingredient_meal_id_ingr_id
     127ON kbnteam.meal_ingredient (meal_id, ingr_id);
     128
     129CREATE INDEX IF NOT EXISTS idx_alergen_ingredient_ingr_id_alergen_id
     130ON kbnteam.alergen_ingredient (ingr_id, alergen_id);
     131}}}
     132
     133=== Резултати по индексирање ===
     134Извршете ги истите прашања '''по''' примена на `indexes/v_menu_meal_index.sql`.
     135
     136||= Метрика ||= Тест 1 (по cat_id) ||= Тест 2 (по rest_id) ||
     137|| Planning Time || ___ ms || ___ ms ||
     138|| Execution Time || ___ ms || ___ ms ||
     139|| Rows Returned || ___ || ___ ||
     140|| Scan Type (meal) || ___ || ___ ||
     141|| Scan Type (meal_ingredient) || ___ || ___ ||
     142
     143{{{
     144-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     145}}}
     146
     147=== Анализа на подобрување ===
     148||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     149|| Execution Time || ___ ms || ___ ms || ___ % ||
     150|| meal scan (Тест 1) || Seq Scan || Index Scan (cat_id) || — ||
     151|| meal_ingredient scan || Seq Scan || Index Scan (meal_id) || — ||
     152|| alergen_ingredient scan || Seq Scan || Index Scan (ingr_id) || — ||
     153
     154'''Очекувано:''' Трите индекси заедно ги забрзуваат CTE агрегациите. `idx_meal_cat_id_meal_id` го помага JOIN-от по категорија, `idx_meal_ingredient_meal_id_ingr_id` го поддржува развивањето на состојки, а `idx_alergen_ingredient_ingr_id_alergen_id` го забрзува поврзувањето алерген-состојка.