Changes between Version 51 and Version 52 of DatabaseCreation


Ignore:
Timestamp:
06/29/26 21:38:36 (6 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseCreation

    v51 v52  
    331331== DML скрипти - Погледи (Views)
    332332
    333 === `Performer_Events`
    334 
    335 Овој поглед дава преглед на сите изведувачи и настаните на кои тие учествуваат, заедно со прецизниот термин на нивниот настап.
    336 
    337 {{{
    338 
    339 CREATE VIEW "Performer_Events" AS
    340 SELECT p.performer_id,
    341        p.name AS performer_name,
    342        e.event_id,
    343        e.name AS event_name,
    344        eh.event_time
    345 FROM "Performer" p
    346 JOIN "Event_Happening_Performer" ehp ON p.performer_id = ehp.performer_id
    347 JOIN "Event_Happening" eh ON ehp.event_happening_id = eh.event_happening_id
    348 JOIN "Event" e ON eh.event_id = e.event_id;
    349 
    350 }}}
    351 
    352333=== `Venue_Layout`
    353334
    354 Овој поглед ја прикажува целосната структура на секој објект (сала), поврзувајќи ги поединечните седишта со соодветните сектори и името на објектот.
    355 
    356 {{{
    357 
    358 CREATE VIEW "Venue_Layout" AS
     335Овој поглед ја прикажува деталната физичка структура на секој објект (сала), поврзувајќи ги поединечните седишта со нивните сектори и самите локации. Патеката на релациите е поставена линеарно, овозможувајќи брза проверка на точната позиција на седиштето преку неговиот ред и број.
     336
     337{{{
     338
     339CREATE OR REPLACE VIEW "Venue_Layout" AS
    359340SELECT v.venue_id,
    360341       v.name AS venue_name,
     
    362343       s.name AS section_name,
    363344       st.seat_id,
     345       st.row_number,
    364346       st.seat_number
    365347FROM "Venue" v
     
    371353=== `User_Tickets`
    372354
    373 Овој поглед дава детален преглед на сите купени билети по корисник, вклучувајќи го соодветниот настан, QR-кодот за влез и информациите за евентуална рефундација.
    374 
    375 {{{
    376 
    377 CREATE VIEW "User_Tickets" AS
     355Овој поглед дава детален хронолошки преглед на сите купени поединечни билети по корисник, вклучувајќи ја точната платена цена, QR-кодот за влез и терминот на настанот. Преку релацијата со ставките за рефундација, погледот нуди и инстантна информација за тоа кои карти се откажани и кога се вратени парите.
     356
     357{{{
     358
     359CREATE OR REPLACE VIEW "User_Tickets" AS
    378360SELECT u.user_id,
    379361       u.username,
     362       toi.order_item_id,
    380363       t.ticket_id,
    381364       e.event_id,
    382365       e.name AS event_name,
    383        tp.purchase_id,
    384        tp.qr_code,
    385        tr.refund_id,
     366       eh.event_time,
     367       toi.qr_code,
     368       toi.item_price AS price_paid,
     369       tri.refund_item_id,
    386370       tr.refund_time
    387371FROM "User" u
    388 JOIN "Ticket_Purchase" tp ON u.user_id = tp.user_id
    389 JOIN "Ticket" t ON tp.ticket_id = t.ticket_id
     372JOIN "Regular_User" ru ON u.user_id = ru.user_id
     373JOIN "Ticket_Order" o ON ru.user_id = o.user_id
     374JOIN "Ticket_Order_Item" toi ON o.order_id = toi.order_id
     375JOIN "Ticket" t ON toi.ticket_id = t.ticket_id
    390376JOIN "Event_Happening" eh ON t.event_happening_id = eh.event_happening_id
    391377JOIN "Event" e ON eh.event_id = e.event_id
    392 LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id;
    393 
    394 }}}
    395 
    396 === `Event_User_Ratings`
    397 
    398 Овој поглед овозможува детален пристап до поединечните коментари и оценки што секој корисник ги оставил за одреден термин на настан.
    399 
    400 {{{
    401 
    402 CREATE VIEW "Event_User_Ratings" AS
    403 SELECT eh.event_happening_id,
    404        e.event_id,
    405        e.name AS event_name,
    406        u.user_id,
    407        u.username,
    408        ehr.rating_id,
    409        ehr.rating,
    410        ehr.comment
    411 FROM "Event" e
    412 JOIN "Event_Happening" eh ON e.event_id = eh.event_id
    413 JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id
    414 JOIN "User" u ON ehr.user_id = u.user_id;
    415 
    416 }}}
    417 
    418 === `Event_Overall_Ratings`
    419 
    420 Овој поглед врши статистичка анализа на задоволството на публиката преку пресметување на просечната оцена и вкупниот број на рецензии за секој поединечен настан.
    421 
    422 {{{
    423 
    424 CREATE VIEW "Event_Overall_Ratings" AS
    425 SELECT
    426     e.event_id,
    427     e.name AS event_name,
    428     eh.event_happening_id,
    429     eh.event_time,
    430     COUNT(ehr.rating_id) AS total_reviews,
    431     AVG(ehr.rating) AS average_rating
    432 FROM "Event" e
    433 JOIN "Event_Happening" eh ON e.event_id = eh.event_id
    434 JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id
    435 GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time;
    436 
    437 }}}
    438 
    439 === `Event_Financial_Summary`
    440 
    441 Овој поглед ги сумира финансиските резултати за секој настан, прикажувајќи го вкупниот број на продадени билети, нето приходот по одбивање на рефундациите и посебно издвоената заработка од административните такси при враќање на влезниците.
    442 
    443 {{{
    444 
    445 CREATE VIEW "Event_Financial_Summary" AS
    446 SELECT
    447     e.event_id,
    448     e.name AS event_name,
    449     eh.event_happening_id,
    450     eh.event_time,
    451     COUNT(tp.purchase_id) AS total_tickets_sold,
    452    
    453     -- total revenue
    454     SUM(tp.purchase_amount) - SUM(CASE WHEN tr.refund_amount IS NOT NULL THEN tr.refund_amount ELSE 0 END) AS net_revenue,
    455    
    456     -- refund taxes
    457     SUM(CASE WHEN tr.refund_id IS NOT NULL THEN tp.purchase_amount - tr.refund_amount ELSE 0 END) AS refund_tax_profit
    458 
    459 FROM "Event" e
    460 JOIN "Event_Happening" eh ON e.event_id = eh.event_id
    461 JOIN "Ticket" t ON eh.event_happening_id = t.event_happening_id
    462 JOIN "Ticket_Purchase" tp ON t.ticket_id = tp.ticket_id
    463 LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id
    464 GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time;
     378LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id
     379LEFT JOIN "Ticket_Refund" tr ON tri.refund_id = tr.refund_id;
    465380
    466381}}}
     
    468383=== `Future_Events`
    469384
    470 Овој поглед служи за динамично генерирање на репертоарот, прикажувајќи ги исклучиво претстојните настани во реално време преку филтрирање на изминатите термини.
    471 
    472 {{{
    473 
    474 CREATE VIEW "Future_Events" AS
     385Овој поглед служи за динамично генерирање на репертоарот, прикажувајќи ги исклучиво претстојните настани преку филтрирање на изминатите термини во однос на моменталното време на системот. Дополнително, тој ја прикажува комплетната географска адреса и локација на објектот каде ќе се одржи настанот.
     386
     387{{{
     388
     389CREATE OR REPLACE VIEW "Future_Events" AS
    475390SELECT
    476391    e.event_id,
     
    480395    v.venue_id,
    481396    v.name AS venue_name,
    482     v.address_city AS city
     397    v.address_street AS street,
     398    v.address_city AS city,
     399    v.address_country AS country
    483400FROM "Event" e
    484401JOIN "Event_Happening" eh ON e.event_id = eh.event_id
     
    490407=== `Available_Tickets`
    491408
    492 Овој поглед овозможува моментален увид во инвентарот на достапни седишта и автоматско враќање на рефундираните билети во понуда.
    493 
    494 {{{
    495 
    496 CREATE VIEW "Available_Tickets" AS
     409Овој поглед овозможува моментален увид во инвентарот на достапни слободни седишта за активните настани. Во него е имплементирана комплексна логика која ја калкулира крајната продажна цена во реално време, земајќи го предвид актуелниот процент на попуст за тековниот временски период во кој се наоѓа купувачот.
     410
     411{{{
     412
     413CREATE OR REPLACE VIEW "Available_Tickets" AS
    497414SELECT
    498415    t.ticket_id,
    499     t.ticket_type,
    500     t.base_price,
     416    ROUND(
     417        t.base_price * (1 - COALESCE(ep.price_discount_percent, 0) / 100.0),
     418        2
     419    ) AS price,
    501420    e.event_id,
    502421    e.name AS event_name,
    503422    eh.event_happening_id,
    504423    eh.event_time,
     424    v.name AS venue_name,
    505425    s.name AS section_name,
     426    st.row_number,
    506427    st.seat_number
    507428FROM "Ticket" t
    508429JOIN "Event_Happening" eh ON t.event_happening_id = eh.event_happening_id
    509430JOIN "Event" e ON eh.event_id = e.event_id
     431JOIN "Venue" v ON eh.venue_id = v.venue_id
    510432JOIN "Seat" st ON t.seat_id = st.seat_id
    511433JOIN "Section" s ON st.section_id = s.section_id
     434LEFT JOIN "Event_Period" ep ON eh.event_happening_id = ep.event_happening_id
     435                           AND CURRENT_DATE BETWEEN ep.start_date AND ep.end_date
    512436WHERE t.is_available = TRUE;
    513437
    514438}}}
     439
     440=== `Event_Overall_Ratings`
     441
     442Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции (COUNT и AVG), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата.
     443
     444{{{
     445
     446CREATE MATERIALIZED VIEW "Event_Overall_Ratings" AS
     447SELECT
     448    e.event_id,
     449    e.name AS event_name,
     450    eh.event_happening_id,
     451    eh.event_time,
     452    COUNT(ehr.rating_id) AS total_reviews,
     453    ROUND(AVG(ehr.rating), 2) AS average_rating
     454FROM "Event" e
     455JOIN "Event_Happening" eh ON e.event_id = eh.event_id
     456JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id
     457GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time;
     458
     459}}}
     460
     461=== `User_Order_History`
     462
     463Овој материјализиран поглед генерира финансиски профил и историја на нарачки за секој корисник, сумирајќи ги направените трошоци на ниво на главна нарачка. Тој нуди брз увид во точниот број на купени ставки, бројот на рефундирани билети како и вкупната сума на вратени пари по нарачка без оптоварување на трансакциските табели.
     464
     465{{{
     466
     467CREATE MATERIALIZED VIEW "User_Order_History" AS
     468SELECT u.user_id,
     469       u.username,
     470       o.order_id,
     471       o.order_time,
     472       o.order_amount,
     473       COALESCE(items.total_items_ordered, 0) AS total_items_ordered,
     474       COALESCE(items.total_items_refunded, 0) AS total_items_refunded,
     475       COALESCE(items.total_amount_refunded, 0.00) AS total_amount_refunded
     476FROM "User" u
     477JOIN "Regular_User" ru ON u.user_id = ru.user_id
     478JOIN "Ticket_Order" o ON ru.user_id = o.user_id
     479LEFT JOIN (
     480    SELECT
     481        toi.order_id,
     482        COUNT(toi.order_item_id) AS total_items_ordered,
     483        COUNT(tri.refund_item_id) AS total_items_refunded,
     484        SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded
     485    FROM "Ticket_Order_Item" toi
     486    LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id
     487    GROUP BY toi.order_id
     488) items ON o.order_id = items.order_id;
     489
     490}}}
     491
     492=== `Venue_Occupancy_Report`
     493
     494Овој комплексен аналитички поглед ја мери успешноста на продажбата преку споредба на бројот на продадени карти со максималниот капацитет на седишта во салата. Крајниот резултат дава прецизен процент на пополнетост за секој термин на настан, што е клучен бизнис индикатор за менаџерите и организаторите.
     495
     496{{{
     497
     498CREATE MATERIALIZED VIEW "Venue_Occupancy_Report" AS
     499SELECT e.event_id,
     500       e.name AS event_name,
     501       eh.event_happening_id,
     502       eh.event_time,
     503       v.name AS venue_name,
     504       v.number_of_seats AS total_venue_capacity,
     505       COALESCE(stats.sold_count, 0) AS tickets_sold,
     506       ROUND((COALESCE(stats.sold_count, 0)::NUMERIC / v.number_of_seats::NUMERIC) * 100, 2) AS occupancy_percentage
     507FROM "Event" e
     508JOIN "Event_Happening" eh ON e.event_id = eh.event_id
     509JOIN "Venue" v ON eh.venue_id = v.venue_id
     510LEFT JOIN (
     511    SELECT t.event_happening_id, COUNT(toi.order_item_id) AS sold_count
     512    FROM "Ticket_Order_Item" toi
     513    JOIN "Ticket" t ON toi.ticket_id = t.ticket_id
     514    GROUP BY t.event_happening_id
     515) stats ON eh.event_happening_id = stats.event_happening_id
     516GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time, v.name, v.number_of_seats, stats.sold_count;
     517
     518}}}