Преглед: v_reviews_full
| Датотека | views/03_reviews_view.sql
|
|---|
| Шема | kbnteam
|
|---|
| Категорија | Прегледи
|
|---|
| Поврзани индекси | indexes/v_reviews_full_index.sql
|
|---|
Опис
Обединет извештај за прегледи на нарачки и прегледи на достави преку UNION ALL. Двата подтипа имаат различни колони — полињата кои не постојат за еден тип се пополнуваат со NULL. Прегледот е погоден за пrikажување на оценки по ресторан, по возач или по купувач во веб апликацијата.
Зависности
| Табела | Тип на употреба | Дел
|
|---|
kbnteam.review | Главна табела | И двата дела
|
kbnteam.order_review | JOIN — преглед на нарачка | Прв дел (order)
|
kbnteam.customer_order | JOIN — нарачката | Прв дел
|
kbnteam.customer | JOIN — купувач | Прв дел
|
kbnteam.api_user | JOIN — детали за купувач/возач | И двата дела
|
kbnteam.company_order | JOIN — компаниска нарачка | И двата дела
|
kbnteam.company | JOIN — компанија | И двата дела
|
kbnteam.delivery_review | JOIN — преглед на достава | Втор дел (delivery)
|
kbnteam.delivery | JOIN — достава | Втор дел
|
kbnteam.driver | LEFT JOIN — возач | Втор дел
|
Излезни колони
| Колона | Опис | Нарачка | Достава
|
|---|
review_id | ID на прегледот | ✓ | ✓
|
review_type | 'order' или 'delivery' | 'order' | 'delivery'
|
review_created_at | Датум на прегледот | ✓ | ✓
|
review_rating | Општа оценка (1-5) | ✓ | ✓
|
review_comment | Коментар | ✓ | ✓
|
order_id | ID на нарачката | ✓ | NULL
|
delivery_id | ID на доставата | NULL | ✓
|
company_id | ID на компанијата | ✓ | ✓
|
company_name | Назив на компанијата | ✓ | ✓
|
customer_user_id | ID на купувачот | ✓ | NULL
|
driver_user_id | ID на возачот | NULL | ✓
|
order_review_food_rating | Оценка за храна (1-5) | ✓ | NULL
|
order_review_res_rating | Оценка за ресторан (1-5) | ✓ | NULL
|
del_review_courier_rating | Оценка за курир (1-5) | NULL | ✓
|
del_review_speed_rating | Оценка за брзина (1-5) | NULL | ✓
|
SQL Дефиниција
CREATE OR REPLACE VIEW kbnteam.v_reviews_full AS
SELECT
r.review_id,
'order'::text AS review_type,
r.review_created_at,
r.review_rating,
r.review_comment,
orv.order_id,
NULL::integer AS delivery_id,
co.company_id,
cmp.company_name,
au.user_id AS customer_user_id,
au.user_first_name AS customer_first_name,
au.user_last_name AS customer_last_name,
NULL::integer AS driver_user_id,
NULL::varchar(255) AS driver_first_name,
NULL::varchar(255) AS driver_last_name,
orv.order_review_food_rating,
orv.order_review_res_rating,
NULL::integer AS del_review_courier_rating,
NULL::integer AS del_review_speed_rating
FROM kbnteam.review r
JOIN kbnteam.order_review orv ON orv.review_id = r.review_id
JOIN kbnteam.customer_order o ON o.order_id = orv.order_id
JOIN kbnteam.customer cu ON cu.user_id = o.customer_user_id
JOIN kbnteam.api_user au ON au.user_id = cu.user_id
JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id
JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
UNION ALL
SELECT
r.review_id,
'delivery'::text AS review_type,
r.review_created_at,
r.review_rating,
r.review_comment,
NULL::integer AS order_id,
drvrev.delivery_id,
co.company_id,
cmp.company_name,
NULL::integer AS customer_user_id,
NULL::varchar(255) AS customer_first_name,
NULL::varchar(255) AS customer_last_name,
du.user_id AS driver_user_id,
du.user_first_name AS driver_first_name,
du.user_last_name AS driver_last_name,
NULL::integer AS order_review_food_rating,
NULL::integer AS order_review_res_rating,
drvrev.del_review_courier_rating,
drvrev.del_review_speed_rating
FROM kbnteam.review r
JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id
JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id
LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id;
Тестирање на перформанси
Препорачано тест прашање
SET search_path TO kbnteam;
SET statement_timeout = '60s';
-- Тест 1: по тип на преглед
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_reviews_full
WHERE review_type = 'order';
-- Тест 2: по компаниска нарачка
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_reviews_full
WHERE company_id = 1;
Резултати пред индексирање
| Метрика | Тест 1 (по тип) | Тест 2 (по company_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| customer_order scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
Применети индекси
-- indexes/v_reviews_full_index.sql
CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id
ON kbnteam.customer_order (comp_order_id);
Резултати по индексирање
| Метрика | Тест 1 (по тип) | Тест 2 (по company_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| customer_order scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
Анализа на подобрување
| Метрика | Пред | По | Δ Подобрување
|
|---|
| Execution Time | _ ms | _ ms | _ %
|
Напомена: Прегледот v_reviews_full главно се потпира на споделени патеки на нарачки и достави. Индексот idx_customer_order_comp_order_id помага при JOIN-от на нарачки. Доколку работите со голем волумен на прегледи, разгледајте дополнителен индекс на review(review_created_at).