wiki:CompanyUsersView

Преглед: v_company_users

Датотека views/09_company_users_view.sql
Шема kbnteam
Категорија Оперативна поддршка
Поврзани индекси Нема наменска датотека — ги користи споделените индекси

Опис

Ги комбинира купувачите, возачите и api_admin корисниците во еден преглед ориентиран на компанија. Користи три UNION гранки — по една за секоја улога. Корисниците од тип driver и api_admin се прикажуваат само ако постои активен договор помеѓу компанијата и нивниот ресторан.

Зависности

Табела Улога UNION гранка
kbnteam.customer Купувач 1 (customer)
kbnteam.company Компанија Сите
kbnteam.api_user Детали за корисник Сите
kbnteam.contract Договор за компанија-ресторан 2 (driver), 3 (admin)
kbnteam.restaurant Ресторан 2 (driver), 3 (admin)
kbnteam.driver Возач 2 (driver)
kbnteam.api_admin Администратор 3 (admin)

SQL Дефиниција

CREATE OR REPLACE VIEW kbnteam.v_company_users AS
SELECT
    cu.company_id,
    cmp.company_name,
    'customer'::text AS related_role,
    au.user_id,
    au.user_first_name,
    au.user_last_name,
    au.user_email,
    au.user_phone_no,
    NULL::integer AS rest_id,
    NULL::varchar(255) AS rest_name
FROM kbnteam.customer cu
JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id
JOIN kbnteam.api_user au ON au.user_id = cu.user_id

UNION

SELECT DISTINCT
    ct.company_id,
    cmp.company_name,
    'driver'::text AS related_role,
    au.user_id,
    au.user_first_name,
    au.user_last_name,
    au.user_email,
    au.user_phone_no,
    r.rest_id,
    r.rest_name
FROM kbnteam.contract ct
JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id
JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
JOIN kbnteam.driver drv ON drv.rest_id = r.rest_id
JOIN kbnteam.api_user au ON au.user_id = drv.user_id

UNION

SELECT DISTINCT
    ct.company_id,
    cmp.company_name,
    'api_admin'::text AS related_role,
    au.user_id,
    au.user_first_name,
    au.user_last_name,
    au.user_email,
    au.user_phone_no,
    r.rest_id,
    r.rest_name
FROM kbnteam.contract ct
JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id
JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
JOIN kbnteam.api_admin aa ON aa.rest_id = r.rest_id
JOIN kbnteam.api_user au ON au.user_id = aa.user_id;

Тестирање на перформанси

Препорачано тест прашање

SET search_path TO kbnteam;
SET statement_timeout = '60s';

-- Тест 1: по компанија
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_company_users
WHERE company_id = 1;

-- Тест 2: по улога
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_company_users
WHERE related_role = 'driver';

Резултати

Овој преглед нема наменска датотека за индекси. Перформансите зависат од договорните и корисничките индекси создадени за другите прегледи.

Метрика Тест 1 (company_id) Тест 2 (role)
Planning Time _ ms _ ms
Execution Time _ ms _ ms
Rows Returned _ _
Scan Type (customer) _ _
Scan Type (contract) _ _
-- Излезот од EXPLAIN ANALYZE овде

Потенцијални подобрувања

Доколку овој преглед е бавен, разгледајте:

  • Индекс на customer(company_id) — за Гранка 1
  • Индекс на contract(company_id) (веќе создаден со v_company_billing_overview_index.sql) — за Гранки 2 и 3
  • Индекс на driver(rest_id) (веќе создаден со v_driver_lunch_timers_index.sql) — за Гранка 2
  • Индекс на api_admin(rest_id) — за Гранка 3
Last modified 2 weeks ago Last modified on 05/10/26 14:37:25
Note: See TracWiki for help on using the wiki.