wiki:ReviewsFullView

Преглед: 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).

Last modified 2 weeks ago Last modified on 05/10/26 14:32:16
Note: See TracWiki for help on using the wiki.