Changes between Initial Version and Version 1 of ReviewsFullView


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

--

Legend:

Unmodified
Added
Removed
Modified
  • ReviewsFullView

    v1 v1  
     1= Преглед: v_reviews_full =
     2
     3||= Датотека ||= `views/03_reviews_view.sql` ||
     4||= Шема ||= `kbnteam` ||
     5||= Категорија ||= Прегледи ||
     6||= Поврзани индекси ||= `indexes/v_reviews_full_index.sql` ||
     7
     8== Опис ==
     9Обединет извештај за прегледи на нарачки и прегледи на достави преку `UNION ALL`. Двата подтипа имаат различни колони — полињата кои не постојат за еден тип се пополнуваат со `NULL`. Прегледот е погоден за пrikажување на оценки по ресторан, по возач или по купувач во веб апликацијата.
     10
     11== Зависности ==
     12||= Табела ||= Тип на употреба ||= Дел ||
     13|| `kbnteam.review` || Главна табела || И двата дела ||
     14|| `kbnteam.order_review` || JOIN — преглед на нарачка || Прв дел (order) ||
     15|| `kbnteam.customer_order` || JOIN — нарачката || Прв дел ||
     16|| `kbnteam.customer` || JOIN — купувач || Прв дел ||
     17|| `kbnteam.api_user` || JOIN — детали за купувач/возач || И двата дела ||
     18|| `kbnteam.company_order` || JOIN — компаниска нарачка || И двата дела ||
     19|| `kbnteam.company` || JOIN — компанија || И двата дела ||
     20|| `kbnteam.delivery_review` || JOIN — преглед на достава || Втор дел (delivery) ||
     21|| `kbnteam.delivery` || JOIN — достава || Втор дел ||
     22|| `kbnteam.driver` || LEFT JOIN — возач || Втор дел ||
     23
     24== Излезни колони ==
     25||= Колона ||= Опис ||= Нарачка ||= Достава ||
     26|| `review_id` || ID на прегледот || ✓ || ✓ ||
     27|| `review_type` || `'order'` или `'delivery'` || `'order'` || `'delivery'` ||
     28|| `review_created_at` || Датум на прегледот || ✓ || ✓ ||
     29|| `review_rating` || Општа оценка (1-5) || ✓ || ✓ ||
     30|| `review_comment` || Коментар || ✓ || ✓ ||
     31|| `order_id` || ID на нарачката || ✓ || NULL ||
     32|| `delivery_id` || ID на доставата || NULL || ✓ ||
     33|| `company_id` || ID на компанијата || ✓ || ✓ ||
     34|| `company_name` || Назив на компанијата || ✓ || ✓ ||
     35|| `customer_user_id` || ID на купувачот || ✓ || NULL ||
     36|| `driver_user_id` || ID на возачот || NULL || ✓ ||
     37|| `order_review_food_rating` || Оценка за храна (1-5) || ✓ || NULL ||
     38|| `order_review_res_rating` || Оценка за ресторан (1-5) || ✓ || NULL ||
     39|| `del_review_courier_rating` || Оценка за курир (1-5) || NULL || ✓ ||
     40|| `del_review_speed_rating` || Оценка за брзина (1-5) || NULL || ✓ ||
     41
     42== SQL Дефиниција ==
     43{{{
     44#!sql
     45CREATE OR REPLACE VIEW kbnteam.v_reviews_full AS
     46SELECT
     47    r.review_id,
     48    'order'::text AS review_type,
     49    r.review_created_at,
     50    r.review_rating,
     51    r.review_comment,
     52    orv.order_id,
     53    NULL::integer AS delivery_id,
     54    co.company_id,
     55    cmp.company_name,
     56    au.user_id AS customer_user_id,
     57    au.user_first_name AS customer_first_name,
     58    au.user_last_name AS customer_last_name,
     59    NULL::integer AS driver_user_id,
     60    NULL::varchar(255) AS driver_first_name,
     61    NULL::varchar(255) AS driver_last_name,
     62    orv.order_review_food_rating,
     63    orv.order_review_res_rating,
     64    NULL::integer AS del_review_courier_rating,
     65    NULL::integer AS del_review_speed_rating
     66FROM kbnteam.review r
     67JOIN kbnteam.order_review orv ON orv.review_id = r.review_id
     68JOIN kbnteam.customer_order o ON o.order_id = orv.order_id
     69JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
     70JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     71JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id
     72JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
     73
     74UNION ALL
     75
     76SELECT
     77    r.review_id,
     78    'delivery'::text AS review_type,
     79    r.review_created_at,
     80    r.review_rating,
     81    r.review_comment,
     82    NULL::integer AS order_id,
     83    drvrev.delivery_id,
     84    co.company_id,
     85    cmp.company_name,
     86    NULL::integer AS customer_user_id,
     87    NULL::varchar(255) AS customer_first_name,
     88    NULL::varchar(255) AS customer_last_name,
     89    du.user_id AS driver_user_id,
     90    du.user_first_name AS driver_first_name,
     91    du.user_last_name AS driver_last_name,
     92    NULL::integer AS order_review_food_rating,
     93    NULL::integer AS order_review_res_rating,
     94    drvrev.del_review_courier_rating,
     95    drvrev.del_review_speed_rating
     96FROM kbnteam.review r
     97JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id
     98JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id
     99LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
     100LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
     101LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
     102LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id;
     103}}}
     104
     105== Тестирање на перформанси ==
     106
     107=== Препорачано тест прашање ===
     108{{{
     109#!sql
     110SET search_path TO kbnteam;
     111SET statement_timeout = '60s';
     112
     113-- Тест 1: по тип на преглед
     114EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     115SELECT * FROM kbnteam.v_reviews_full
     116WHERE review_type = 'order';
     117
     118-- Тест 2: по компаниска нарачка
     119EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     120SELECT * FROM kbnteam.v_reviews_full
     121WHERE company_id = 1;
     122}}}
     123
     124=== Резултати пред индексирање ===
     125||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) ||
     126|| Planning Time || ___ ms || ___ ms ||
     127|| Execution Time || ___ ms || ___ ms ||
     128|| Rows Returned || ___ || ___ ||
     129|| customer_order scan || ___ || ___ ||
     130
     131{{{
     132-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     133}}}
     134
     135=== Применети индекси ===
     136{{{
     137#!sql
     138-- indexes/v_reviews_full_index.sql
     139CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id
     140ON kbnteam.customer_order (comp_order_id);
     141}}}
     142
     143=== Резултати по индексирање ===
     144||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) ||
     145|| Planning Time || ___ ms || ___ ms ||
     146|| Execution Time || ___ ms || ___ ms ||
     147|| Rows Returned || ___ || ___ ||
     148|| customer_order scan || ___ || ___ ||
     149
     150{{{
     151-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     152}}}
     153
     154=== Анализа на подобрување ===
     155||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     156|| Execution Time || ___ ms || ___ ms || ___ % ||
     157
     158'''Напомена:''' Прегледот `v_reviews_full` главно се потпира на споделени патеки на нарачки и достави. Индексот `idx_customer_order_comp_order_id` помага при JOIN-от на нарачки. Доколку работите со голем волумен на прегледи, разгледајте дополнителен индекс на `review(review_created_at)`.