Changes between Version 24 and Version 25 of RelationalModel


Ignore:
Timestamp:
04/21/26 17:48:45 (11 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • RelationalModel

    v24 v25  
    1818'''1. Сегмент: Животен циклус на билет и Продажба (Ticket vs. Ticket_Purchase)'''
    1919
    20  * '''Како и зошто:''' Моделот прави јасна разделба помеѓу инвентарот на седишта (`Ticket`) и реализираната трансакција (`Ticket_Purchase`). Табелата `Ticket` ги содржи сите потенцијални места за еден настан, додека `Ticket_Purchase` е запис за купување кој содржи уникатен `qr_code`. Релацијата е дефинирана како '''1:N''' помеѓу билетот и купувањата.
    21  * '''Аргументација:''' Оваа структура овозможува '''повторна продажба на исто седиште'''. Кога еден билет ќе се рефундира, неговиот статус се враќа во „слободен“, а во `Ticket_Purchase` се дозволува нов запис за следниот купувач. Со тоа се чува целосна историја на сопственост врз едно седиште низ времето.
     20* '''Како и зошто:''' Моделот прави јасна разделба помеѓу инвентарот на седишта (''Ticket'') и реализираната трансакција (''Ticket_Purchase''). Табелата ''Ticket'' ги содржи сите потенцијални места за еден конкретен термин (''Event_Happening''), додека ''Ticket_Purchase'' е запис за купување кој содржи уникатен ''qr_code''. Врската е дефинирана како '''1:1''' помеѓу билетот и активното купување преку ''ticket_id''.
     21* '''Аргументација:''' Користењето на ''ticket_id'' како примарен референтен клуч овозможува молскавично пребарување. Кога еден билет ќе се рефундира, статусот ''is_available'' во табелата ''Ticket'' се враќа во '''true''', овозможувајќи седиштето веднаш да се појави на пазарот, додека во ''Ticket_Purchase'' и ''Ticket_Refund'' се чува траен историски запис за претходната трансакција.
    2222
    2323'''2. Сегмент: Динамично ценообразовање и фази (Event_Period)'''
    2424
    25  * '''Како и зошто:''' Наместо фиксна цена, воведовме табела `Event_Period` поврзана со случувањето на настанот (`Event_Happening`). Секој период има дефиниран процент на промена и насока (`increase_decrease`: 1 - покачување на цените за тој процент, 0 - намалување на цените за тој процент).
    26  * '''Аргументација:''' Ова овозможува системот автоматски да ги менаџира цените во зависност од временските периоди (пр. "Early Bird" попусти или "Last Minute" поскапувања).
     25* '''Како и зошто:''' Наместо фиксна цена, воведовме табела ''Event_Period'' поврзана со случувањето на настанот (''Event_Happening''). Секој период е дефиниран со ''start_date'' и ''end_date'', процент на промена и насока (''increase_decrease'': 1 - покачување, 0 - намалување).
     26* '''Аргументација:''' Ова овозможува системот автоматски да ги менаџира цените во зависност од времето на купување. Бидејќи релацијата оди преку едноставен ''period_id'', пресметката на финалната цена при купување е оптимизирана и не бара сложени пребарувања.
    2727
    28 '''3. Сегмент: Хиерархија и Интегритет на локации (Venue -> Section -> Seat)'''
     28'''3. Сегмент: Хиерархија и оптимизација на локации (Venue -> Section -> Seat)'''
    2929
    30  * '''Како и зошто:''' Локациите се моделирани хиерархиски преку '''Identifying''' релации. Секое седиште е дефинирано преку композитен клуч кој ги вклучува неговата секција и сала.
    31  * '''Аргументација:''' Ова ја рефлектира реалната физичка поставеност на објектите и спречува дуплирање на сектори или седишта. Со ова се гарантира дека секој билет е врзан за прецизна и уникатна физичка локација во салата.
     30* '''Како и зошто:''' Локациите се моделирани преку '''Non-Identifying''' релации со користење на вештачки клучеви (''BIGSERIAL''). Секое седиште има свое уникатно ''seat_id'', кое е директно поврзано со ''section_id'', а секцијата со ''venue_id''.
     31* '''Аргументација:''' Оваа структура е клучна за перформансите при работа со големи податоци (20+ милиони седишта). Наместо сложени композитни клучеви, се користи само еден '''BIGINT''' за поврзување. Ова драстично го намалува просторот што го заземаат индексите и ги забрзува '''JOIN''' операциите при пребарување на слободни места во салата.
    3232
    3333'''4. Сегмент: Специјализација на ентитети (Inheritance)'''
    3434
    35  * '''Како и зошто:''' Користена е специјализација на два нивоа:
    36   1. '''Изведувачи:''' `Performer` како основна табела, со `Musical_Performer` и `Acting_Performer` како подтипови.
    37   2. '''Настани:''' `Event` како основна табела, со `Concert` и `Play` како подтипови.
    38  * '''Аргументација:''' Ова овозможува базата да биде екстремно флексибилна. Музичките изведувачи имаат жанр и издавачка куќа, додека театарските имаат улоги и агенции, а сепак сите се менаџираат унифицирано преку главната табела на изведувачи. Истата логика овозможува системот за билети да работи идентично за концерти и за претстави.
     35* '''Како и зошто:''' Користена е специјализација (''Class Hierarchy'') на два нивоа преку споделени примарни клучеви:
     36# '''Изведувачи:''' ''Performer'' (основа) -> ''Musical_Performer'' и ''Acting_Performer'' (подтипови).
     37# '''Настани:''' ''Event'' (основа) -> ''Concert'' и ''Play'' (подтипови).
     38* '''Аргументација:''' Ова овозможува „чист“ дизајн каде заедничките атрибути (име, контакт, опис) се чуваат на едно место, додека специфичните податоци (сетлисти, жанрови, режисери) се во посебни табели. Ова го олеснува проширувањето на системот со нови типови на настани без менување на постојната логика за билети.
    3939
    4040'''5. Сегмент: Финансиска безбедност и рефундација (Ticket_Refund)'''
    4141
    42  * '''Како и зошто:''' Табелата за рефундација е поврзана со трансакцијата (`Ticket_Purchase`) преку `purchase_id`.
    43  * '''Аргументација:''' Со оваа логика физички се оневозможува за една иста трансакција (купување) да се вратат парите повеќе од еднаш. Ова е клучна заштита против финансиски манипулации или системски грешки, обезбедувајќи прецизно сметководствено следење на вратените средства.
     42* '''Како и зошто:''' Табелата за рефундација е поврзана со трансакцијата (''Ticket_Purchase'') преку ''purchase_id'', кој во оваа табела е поставен како '''UNIQUE'''.
     43* '''Аргументација:''' Со ова физички се оневозможува за една иста трансакција да се изврши рефундација повеќе од еднаш. Користењето на ''BIGSERIAL'' за ''refund_id'' овозможува прецизно сметководствено следење на сите вратени средства по хронолошки редослед, што е од витално значење за ревизија на финансиското работење на системот.