| 10 | | Примарен оперативен преглед за нарачки во веб апликацијата. Ги прикажува целосните детали за нарачка: контекст на купувач/компанија, статус на нарачка, контекст на достава и агрегирани листи на нарачани оброци и пијачи. Двете CTE (`order_meals`, `order_drinks`) ги собираат ставките по нарачка во читливи стрингови. |
| 11 | | |
| 12 | | '''Важно:''' Овој преглед е еден од најтешките во шемата. Никогаш не го извршувајте со `SELECT *` без WHERE клаузула при бенчмарк тестирање. |
| | 9 | |
| | 10 | Прикажува нарачки со податоци за клиентот, компанијата, статусот, доставата и нарачаните јадења и пијалоци. |
| | 11 | |
| | 12 | Јадењата и пијалоците се прикажуваат во подредени листи без повторувања. Податоците за доставувачот се поврзани со доставата. Се прикажуваат и нарачките за кои сè уште нема достава. |
| | 13 | |
| | 14 | Еден ред за секоја клиентска нарачка. Недостасувачките податоци за достава се NULL, а празните листи со производи се празен текст. |
| 15 | | ||= Табела ||= Тип на употреба || |
| 16 | | || `kbnteam.customer_order` || Главна табела (нарачка) || |
| 17 | | || `kbnteam.order_status` || JOIN — статус на нарачката || |
| 18 | | || `kbnteam.customer` || JOIN — купувач || |
| 19 | | || `kbnteam.api_user` || JOIN (×2) — детали за купувач и возач || |
| 20 | | || `kbnteam.company_order` || JOIN — компаниска нарачка || |
| 21 | | || `kbnteam.company` || JOIN — компанија || |
| 22 | | || `kbnteam.delivery` || LEFT JOIN — достава || |
| 23 | | || `kbnteam.delivery_status` || LEFT JOIN — статус на достава || |
| 24 | | || `kbnteam.driver` || LEFT JOIN — возач || |
| 25 | | || `kbnteam.order_meal` || LEFT JOIN (CTE) — оброци во нарачката || |
| 26 | | || `kbnteam.meal` || JOIN (CTE) — назив на оброк || |
| 27 | | || `kbnteam.order_drink` || LEFT JOIN (CTE) — пијачи во нарачката || |
| 28 | | || `kbnteam.drink` || JOIN (CTE) — назив на пијач || |
| | 17 | |
| | 18 | ||= Табела / преглед ||= Употреба || |
| | 19 | || `kbnteam.order_meal` || Јадења вклучени во нарачките. || |
| | 20 | || `kbnteam.meal` || Јадења, цени и поврзаност со категорија и ресторан. || |
| | 21 | || `kbnteam.order_drink` || Пијалоци вклучени во нарачките. || |
| | 22 | || `kbnteam.drink` || Пијалоци, количини, цени и ресторан. || |
| | 23 | || `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. || |
| | 24 | || `kbnteam.order_status` || Називи на статусите на нарачките. || |
| | 25 | || `kbnteam.customer` || Клиенти и компаниите на кои припаѓаат. || |
| | 26 | || `kbnteam.api_user` || Лични и контактни податоци за корисниците. || |
| | 27 | || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || |
| | 28 | || `kbnteam.company` || Податоци за компаниите. || |
| | 29 | || `kbnteam.delivery` || Достави, датуми, забелешки и назначени доставувачи. || |
| | 30 | || `kbnteam.delivery_status` || Називи на статусите на доставите. || |
| 31 | | ||= Колона ||= Извор ||= Опис || |
| 32 | | || `order_id` || `customer_order` || Примарен клуч на нарачката || |
| 33 | | || `order_datetime` || `customer_order` || Датум и час на нарачката || |
| 34 | | || `order_total` || `customer_order` || Вкупна цена || |
| 35 | | || `o_status_name` || `order_status` || Статус на нарачката || |
| 36 | | || `customer_user_id` || `customer` || ID на купувачот || |
| 37 | | || `customer_company_id` || `customer` || ID на компанијата на купувачот || |
| 38 | | || `customer_first_name` || `api_user` || Ime на купувачот || |
| 39 | | || `customer_last_name` || `api_user` || Презиме на купувачот || |
| 40 | | || `customer_email` || `api_user` || Е-пошта на купувачот || |
| 41 | | || `comp_order_id` || `company_order` || ID на компаниската нарачка || |
| 42 | | || `order_company_id` || `company_order` || ID на компанијата || |
| 43 | | || `company_name` || `company` || Назив на компанијата || |
| 44 | | || `delivery_id` || `delivery` || ID на доставата (NULL ако нема) || |
| 45 | | || `delivery_date` || `delivery` || Датум на достава || |
| 46 | | || `d_status_name` || `delivery_status` || Статус на достава || |
| 47 | | || `driver_user_id` || `driver` || ID на возачот || |
| 48 | | || `driver_first_name` || `api_user` || Ime на возачот || |
| 49 | | || `driver_last_name` || `api_user` || Презиме на возачот || |
| 50 | | || `driver_phone` || `api_user` || Телефон на возачот || |
| 51 | | || `meals` || CTE `order_meals` || Оброци одвоени со запирка || |
| 52 | | || `drinks` || CTE `order_drinks` || Пијачи одвоени со запирка || |
| 53 | | |
| 54 | | == SQL Дефиниција == |
| | 33 | |
| | 34 | ||= Колона ||= Извор / пресметка ||= Опис || |
| | 35 | || `order_id` || `customer_order.order_id` || Идентификатор на клиентската нарачка. || |
| | 36 | || `order_datetime` || `customer_order.order_datetime` || Датум и време на нарачката. || |
| | 37 | || `order_total` || `customer_order.order_total` || Вкупен износ на нарачката. || |
| | 38 | || `o_status_name` || `order_status.o_status_name` || Статус на нарачката. || |
| | 39 | || `customer_user_id` || `customer.user_id` || Идентификатор на клиентот. || |
| | 40 | || `customer_company_id` || `customer.company_id` || Компанија на клиентот. || |
| | 41 | || `customer_first_name` || `api_user.user_first_name` || Име на клиентот. || |
| | 42 | || `customer_last_name` || `api_user.user_last_name` || Презиме на клиентот. || |
| | 43 | || `customer_email` || `api_user.user_email` || Е-пошта на клиентот. || |
| | 44 | || `comp_order_id` || `company_order.comp_order_id` || Идентификатор на компаниската нарачка. || |
| | 45 | || `order_company_id` || `company_order.company_id` || Компанија на компаниската нарачка. || |
| | 46 | || `company_name` || `company.company_name` || Назив на компанијата. || |
| | 47 | || `delivery_id` || `delivery.delivery_id` || Идентификатор на доставата. || |
| | 48 | || `delivery_date` || `delivery.delivery_date` || Датум на доставата. || |
| | 49 | || `d_status_name` || `delivery_status.d_status_name` || Статус на доставата. || |
| | 50 | || `driver_user_id` || `delivery.driver_user_id` || Идентификатор на доставувачот. || |
| | 51 | || `driver_first_name` || `api_user.user_first_name` || Име на доставувачот. || |
| | 52 | || `driver_last_name` || `api_user.user_last_name` || Презиме на доставувачот. || |
| | 53 | || `driver_phone` || `api_user.user_phone_no` || Телефон на доставувачот. || |
| | 54 | || `meals` || `COALESCE(order_meals.meals, '')` || Подредена листа со називи на нарачаните јадења. || |
| | 55 | || `drinks` || `COALESCE(order_drinks.drinks, '')` || Подредена листа со називи на нарачаните пијалоци. || |
| | 56 | |
| | 57 | == SQL дефиниција == |
| | 58 | |
| 131 | | WHERE order_datetime >= CURRENT_DATE - INTERVAL '30 days'; |
| 132 | | |
| 133 | | -- Тест 2: по купувач (тестира idx по customer_user_id) |
| 134 | | EXPLAIN (ANALYZE, BUFFERS, VERBOSE) |
| 135 | | SELECT * FROM kbnteam.v_orders_full |
| 136 | | WHERE customer_user_id = 1; |
| 137 | | |
| 138 | | -- Тест 3: по компаниска нарачка (тестира idx по comp_order_id) |
| | 127 | WHERE customer_user_id = 1 |
| | 128 | AND order_datetime >= DATE '2026-09-01' |
| | 129 | AND order_datetime < DATE '2026-10-01'; |
| | 130 | |
| | 131 | -- Тест 2: по компаниска нарачка |
| 151 | | || customer_order scan || ___ || ___ || ___ || |
| 152 | | || order_meal scan || ___ || ___ || ___ || |
| 153 | | || delivery scan || ___ || ___ || ___ || |
| 154 | | |
| 155 | | {{{ |
| 156 | | -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) |
| 157 | | }}} |
| 158 | | |
| 159 | | === Применети индекси === |
| 160 | | {{{ |
| 161 | | #!sql |
| 162 | | -- indexes/v_orders_full_index.sql |
| | 154 | || Начин на читање по табела || ___ || ___ || ___ || |
| | 155 | || Shared Hit Blocks || ___ || ___ || ___ || |
| | 156 | || Shared Read Blocks || ___ || ___ || ___ || |
| | 157 | |
| | 158 | {{{ |
| | 159 | -- Планови и резултати пред дополнителното индексирање: |
| | 160 | |
| | 161 | }}} |
| | 162 | |
| | 163 | === Дополнителни и заеднички индекси === |
| | 164 | |
| | 165 | Примарните клучеви ги покриваат идентификаторите, а `company_order(delivery_id)` има уникатен индекс. |
| | 166 | |
| | 167 | ||= Индекс ||= Табела и колони ||= Намена || |
| | 168 | || `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. || |
| | 169 | || `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. || |
| | 170 | || `idx_order_meal_order_id_meal_id` || `order_meal(order_id, meal_id)` || Пристап до јадењата на нарачката и групирање по order_id. || |
| | 171 | || `idx_order_drink_order_id_drink_id` || `order_drink(order_id, drink_id)` || Пристап до пијалоците на нарачката и групирање по order_id. || |
| | 172 | || `idx_delivery_driver_user_id_delivery_date` || `delivery(driver_user_id, delivery_date)` || Пронаоѓање достави по доставувач; во прегледите за нарачки и достави и по датум. || |
| | 173 | || `idx_customer_order_customer_user_id_order_datetime` || `customer_order(customer_user_id, order_datetime DESC)` || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. || |
| | 174 | || `idx_customer_company_id` || `customer(company_id)` || Пронаоѓање клиенти по компанијата на која припаѓаат. || |
| | 175 | |
| | 176 | {{{ |
| | 177 | #!sql |
| | 178 | CREATE INDEX IF NOT EXISTS idx_company_order_company_id |
| | 179 | ON kbnteam.company_order (company_id); |
| | 180 | |
| 169 | | CREATE INDEX IF NOT EXISTS idx_delivery_driver_user_id_delivery_date |
| 170 | | ON kbnteam.delivery (driver_user_id, delivery_date); |
| 171 | | |
| 172 | | CREATE INDEX IF NOT EXISTS idx_order_meal_order_id_meal_id |
| 173 | | ON kbnteam.order_meal (order_id, meal_id); |
| 174 | | |
| 175 | | CREATE INDEX IF NOT EXISTS idx_order_drink_order_id_drink_id |
| 176 | | ON kbnteam.order_drink (order_id, drink_id); |
| | 196 | CREATE INDEX IF NOT EXISTS idx_customer_company_id |
| | 197 | ON kbnteam.customer (company_id); |
| | 198 | }}} |
| | 199 | |
| | 200 | === Проверка на индексите === |
| | 201 | |
| | 202 | {{{ |
| | 203 | #!sql |
| | 204 | SELECT tablename, indexname, indexdef |
| | 205 | FROM pg_indexes |
| | 206 | WHERE schemaname = 'kbnteam' |
| | 207 | AND indexname IN ( |
| | 208 | 'idx_company_order_company_id', |
| | 209 | 'idx_customer_order_comp_order_id', |
| | 210 | 'idx_order_meal_order_id_meal_id', |
| | 211 | 'idx_order_drink_order_id_drink_id', |
| | 212 | 'idx_delivery_driver_user_id_delivery_date', |
| | 213 | 'idx_customer_order_customer_user_id_order_datetime', |
| | 214 | 'idx_customer_company_id' |
| | 215 | ) |
| | 216 | ORDER BY tablename, indexname; |