Changes between Version 1 and Version 2 of ReviewsFullView


Ignore:
Timestamp:
09/14/26 00:41:01 (2 weeks ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ReviewsFullView

    v1 v2  
    11= Преглед: v_reviews_full =
    22
    3 ||= Датотека ||= `views/03_reviews_view.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Категорија ||= Прегледи ||
    6 ||= Поврзани индекси ||= `indexes/v_reviews_full_index.sql` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Категорија || Рецензии ||
     6|| Поврзани индекси || [wiki:ReviewsFullIndex Индекси за рецензии] ||
    77
    88== Опис ==
    9 Обединет извештај за прегледи на нарачки и прегледи на достави преку `UNION ALL`. Двата подтипа имаат различни колони — полињата кои не постојат за еден тип се пополнуваат со `NULL`. Прегледот е погоден за пrikажување на оценки по ресторан, по возач или по купувач во веб апликацијата.
     9
     10Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата.
     11
     12Секој запис го задржува типот на рецензијата и соодветните оценки. Ако една рецензија се однесува и на нарачка и на достава, се прикажуваат двата записа.
     13
     14Еден ред за секој запис во поттипот за нарачка или достава. Рецензиите без поттип не се прикажуваат. Компанијата и доставувачот кај рецензија за достава можат да бидат NULL.
     15
     16Прегледот нема колона rest_id. Филтрирање по ресторан бара дополнително поврзување со податоците за нарачката или доставувачот.
    1017
    1118== Зависности ==
    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 — возач || Втор дел ||
     19
     20||= Табела / преглед ||= Употреба ||
     21|| `kbnteam.review` || Заеднички податоци за рецензиите. ||
     22|| `kbnteam.order_review` || Рецензии за нарачки и оценки за храна и ресторан. ||
     23|| `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. ||
     24|| `kbnteam.api_user` || Лични и контактни податоци за корисниците. ||
     25|| `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. ||
     26|| `kbnteam.company` || Податоци за компаниите. ||
     27|| `kbnteam.delivery_review` || Рецензии за достави и оценки за доставувач и брзина. ||
     28|| `kbnteam.delivery` || Достави, датуми, забелешки и назначени доставувачи. ||
    2329
    2430== Излезни колони ==
    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 Дефиниција ==
     31
     32||= Колона ||= Опис ||= Извор за order ||= Извор за delivery ||
     33|| `review_id` || Идентификатор на рецензијата. || `review.review_id` || `review.review_id` ||
     34|| `review_type` || Тип на рецензијата: order или delivery. || `'order'::text` || `'delivery'::text` ||
     35|| `review_created_at` || Датум и време на рецензијата. || `review.review_created_at` || `review.review_created_at` ||
     36|| `review_rating` || Општа оценка од 1 до 5. || `review.review_rating` || `review.review_rating` ||
     37|| `review_comment` || Коментар за рецензијата. || `review.review_comment` || `review.review_comment` ||
     38|| `order_id` || Идентификатор на клиентската нарачка. || `order_review.order_id` || `NULL::integer` ||
     39|| `delivery_id` || Идентификатор на доставата. || `NULL::integer` || `delivery_review.delivery_id` ||
     40|| `company_id` || Идентификатор на компанијата. || `company_order.company_id` || `company_order.company_id` ||
     41|| `company_name` || Назив на компанијата. || `company.company_name` || `company.company_name` ||
     42|| `customer_user_id` || Идентификатор на клиентот. || `api_user.user_id` || `NULL::integer` ||
     43|| `customer_first_name` || Име на клиентот. || `api_user.user_first_name` || `NULL::varchar(255)` ||
     44|| `customer_last_name` || Презиме на клиентот. || `api_user.user_last_name` || `NULL::varchar(255)` ||
     45|| `driver_user_id` || Идентификатор на доставувачот. || `NULL::integer` || `api_user.user_id` ||
     46|| `driver_first_name` || Име на доставувачот. || `NULL::varchar(255)` || `api_user.user_first_name` ||
     47|| `driver_last_name` || Презиме на доставувачот. || `NULL::varchar(255)` || `api_user.user_last_name` ||
     48|| `order_review_food_rating` || Оценка за храната од 1 до 5. || `order_review.order_review_food_rating` || `NULL::integer` ||
     49|| `order_review_res_rating` || Оценка за ресторанот од 1 до 5. || `order_review.order_review_res_rating` || `NULL::integer` ||
     50|| `del_review_courier_rating` || Оценка за доставувачот од 1 до 5. || `NULL::integer` || `delivery_review.del_review_courier_rating` ||
     51|| `del_review_speed_rating` || Оценка за брзината од 1 до 5. || `NULL::integer` || `delivery_review.del_review_speed_rating` ||
     52
     53== SQL дефиниција ==
     54
    4355{{{
    4456#!sql
    … …  
    6779JOIN kbnteam.order_review orv ON orv.review_id = r.review_id
    6880JOIN kbnteam.customer_order o ON o.order_id = orv.order_id
    69 JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
    70 JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     81JOIN kbnteam.api_user au ON au.user_id = o.customer_user_id
    7182JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id
    7283JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
    … …  
    97108JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id
    98109JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id
    99 LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
    100 LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
     110LEFT JOIN kbnteam.api_user du ON du.user_id = d.driver_user_id
    101111LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
    102112LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id;
    … …  
    105115== Тестирање на перформанси ==
    106116
    107 === Препорачано тест прашање ===
    108 {{{
    109 #!sql
    110 SET search_path TO kbnteam;
    111 SET statement_timeout = '60s';
    112 
    113 -- Тест 1: по тип на преглед
     117Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби.
     118
     119=== Тест прашалници ===
     120
     121{{{
     122#!sql
     123BEGIN READ ONLY;
     124SET LOCAL statement_timeout = '60s';
     125
     126-- Тест 1: по тип и компанија
    114127EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    115128SELECT * FROM kbnteam.v_reviews_full
    116 WHERE review_type = 'order';
    117 
    118 -- Тест 2: по компаниска нарачка
     129WHERE review_type = 'order' AND company_id = 1;
     130
     131-- Тест 2: по компанија
    119132EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    120133SELECT * FROM kbnteam.v_reviews_full
    121134WHERE company_id = 1;
     135
     136-- Тест 3: по доставувач
     137EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     138SELECT * FROM kbnteam.v_reviews_full
     139WHERE driver_user_id = 1;
     140
     141ROLLBACK;
    122142}}}
    123143
    124144=== Резултати пред индексирање ===
    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
     145
     146Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.
     147
     148||= Метрика ||= Тест 1 (по тип и компанија) ||= Тест 2 (по компанија) ||= Тест 3 (по доставувач) ||
     149|| Planning Time || ___ ms || ___ ms || ___ ms ||
     150|| Execution Time || ___ ms || ___ ms || ___ ms ||
     151|| Rows Returned || ___ || ___ || ___ ||
     152|| Начин на читање по табела || ___ || ___ || ___ ||
     153|| Shared Hit Blocks || ___ || ___ || ___ ||
     154|| Shared Read Blocks || ___ || ___ || ___ ||
     155
     156{{{
     157-- Планови и резултати пред дополнителното индексирање:
     158
     159}}}
     160
     161=== Дополнителни и заеднички индекси ===
     162
     163`order_review(review_id)`, `order_review(order_id)`, `delivery_review(review_id)` и `delivery_review(delivery_id)` имаат уникатни индекси. `company_order(delivery_id)` исто така е уникатен. Останатите потребни индекси се споделени со нарачките и доставите.
     164
     165||= Индекс ||= Табела и колони ||= Намена ||
     166|| `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. ||
     167|| `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. ||
     168|| `idx_delivery_driver_user_id_delivery_date` || `delivery(driver_user_id, delivery_date)` || Пронаоѓање достави по доставувач; во прегледите за нарачки и достави и по датум. ||
     169|| `idx_customer_order_customer_user_id_order_datetime` || `customer_order(customer_user_id, order_datetime DESC)` || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. ||
     170
     171{{{
     172#!sql
     173CREATE INDEX IF NOT EXISTS idx_company_order_company_id
     174ON kbnteam.company_order (company_id);
     175
    139176CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id
    140177ON kbnteam.customer_order (comp_order_id);
     178
     179CREATE INDEX IF NOT EXISTS idx_delivery_driver_user_id_delivery_date
     180ON kbnteam.delivery (driver_user_id, delivery_date);
     181
     182CREATE INDEX IF NOT EXISTS idx_customer_order_customer_user_id_order_datetime
     183ON kbnteam.customer_order (customer_user_id, order_datetime DESC);
     184}}}
     185
     186=== Проверка на индексите ===
     187
     188{{{
     189#!sql
     190SELECT tablename, indexname, indexdef
     191FROM pg_indexes
     192WHERE schemaname = 'kbnteam'
     193  AND indexname IN (
     194    'idx_company_order_company_id',
     195    'idx_customer_order_comp_order_id',
     196    'idx_delivery_driver_user_id_delivery_date',
     197    'idx_customer_order_customer_user_id_order_datetime'
     198)
     199ORDER BY tablename, indexname;
    141200}}}
    142201
    143202=== Резултати по индексирање ===
    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 овде (по индексирање)
     203
     204Мерењето ги користи истите тест прашалници и услови како почетното мерење.
     205
     206||= Метрика ||= Тест 1 (по тип и компанија) ||= Тест 2 (по компанија) ||= Тест 3 (по доставувач) ||
     207|| Planning Time || ___ ms || ___ ms || ___ ms ||
     208|| Execution Time || ___ ms || ___ ms || ___ ms ||
     209|| Rows Returned || ___ || ___ || ___ ||
     210|| Начин на читање по табела || ___ || ___ || ___ ||
     211|| Shared Hit Blocks || ___ || ___ || ___ ||
     212|| Shared Read Blocks || ___ || ___ || ___ ||
     213
     214{{{
     215-- Планови и резултати по дополнителното индексирање:
     216
    152217}}}
    153218
    154219=== Анализа на подобрување ===
    155 ||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
    156 || Execution Time || ___ ms || ___ ms || ___ % ||
    157 
    158 '''Напомена:''' Прегледот `v_reviews_full` главно се потпира на споделени патеки на нарачки и достави. Индексот `idx_customer_order_comp_order_id` помага при JOIN-от на нарачки. Доколку работите со голем волумен на прегледи, разгледајте дополнителен индекс на `review(review_created_at)`.
     220
     221||= Метрика ||= Пред ||= По ||= Промена (%) ||
     222|| Execution Time (Тест 1) || ___ ms || ___ ms || ___ % ||
     223|| Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||
     224|| Execution Time (Тест 3) || ___ ms || ___ ms || ___ % ||
     225
     226Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување.
     227
     228Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.