Changes between Version 11 and Version 12 of RelationalModel
- Timestamp:
- 05/29/26 11:32:15 (3 weeks ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
RelationalModel
v11 v12 6 6 7 7 == Descriptive documentation and argumentation == 8 I Сегмент на моделот: Билети, нарачки и трансакции (Ticketing, Orders, and Transactions) 8 = I Сегмент: Билети, нарачки и трансакции = 9 9 10 Вклучени ентитети: Order, Order_Item, Ticket, Ticket_Type, Payment, Promo_code.10 '''Вклучени ентитети:''' Order_cart, Ticket, Ticket_type, Price_tier, Payment, Payment_method, Payment_status, Discount, Refund_request. 11 11 12 Како е моделиран: Процесот на трансакција е високо нормализиран. Order делува како заглавие (содржи вкупна цена, ID на корисник, временски печат), кое се поврзува со повеќе записи Order_Item. Ticket_Type (кој ја дефинира цената, капацитетот, името како „ВИП“ или „Генерален влез“) е одвоен од поединечниот ентитет Ticket. 12 '''Како е моделиран:''' 13 Процесот на купување е моделиран околу `order_cart`, кој ја претставува нарачката/кошничката на корисникот. Наместо посебна `Order_Item` табела, поединечните купени или резервирани билети се чуваат директно во `Ticket`, каде секој билет е поврзан со конкретен `order_cart`, `ticket_type` и по потреба `seat`. 13 14 14 Зошто е моделиран на овој начин: 15 `Ticket_type` го дефинира типот на билет, на пример VIP, Regular или Student, додека `Price_tier` овозможува различни ценовни нивоа за истиот тип билет. `Payment` е одвоена табела за плаќањата, со посебни табели за `Payment_method` и `Payment_status`. Попустите се моделирани преку `Discount`, а рефундациите преку `Refund_request`. 15 16 16 1. Функционалност на кошничка (Cart): Одвојувањето на Order и Order_Item му овозможува на еден корисник да купи повеќе различни видови билети (на пр. 2 ВИП карти и 1 партер карта) во еден процес на наплата. 17 '''Зошто е моделиран на овој начин:''' 17 18 18 2. Единствени идентификатори: Одвојувањето на Ticket од Ticket_Type е од клучно значење. Иако 500 луѓе можат да купат „Генерален влез“ (Ticket_Type), на секој поединец му треба единствен ред Ticket со посебен QR код или баркод за чекирање на влезот. 19 * '''Еден ред Ticket = еден реален билет:''' 20 Ова е важно затоа што секој билет може да има свој статус, баркод, седиште, време на заклучување, скенирање и историја. Не е доволно само да се каже дека некој купил „3 VIP билети“ - системот мора да знае кои се тие три конкретни билети. 19 21 20 3. Финансиска ревизија: Чувањето на Payment и Promo_code како посебни ентитети поврзани со нарачката овозможува стабилно финансиско известување, следејќи точно кои маркетинг кампањи поттикнале продажба и одвојувајќи ја логиката на порталот за плаќање од логиката за продажба на билети. 22 * '''Order_cart како трансакциски центар:''' 23 Нарачката ги групира билетите, попустот, корисникот, статусот и вкупната цена. Така полесно се следи дали нарачката е отворена, платена, истечена, откажана или рефундирана. 21 24 22 II Сегмент на моделот: Категоризација и структурирање на настани 25 * '''Payment е издвоен од Order_cart:''' 26 Ова овозможува почиста финансиска логика. Нарачката кажува што се купува, а `Payment` кажува како, кога и колку е платено. Затоа може да се следат методи на плаќање, статуси на плаќање и рефундации без да се мешаат со логиката за билетите. 23 27 24 Вклучени ентитети: Event, Category, Event_Category (Junction Table), Location, Location_type. 28 * '''Discount наместо Promo_code:''' 29 Во најновиот модел нема `Promo_code` како посебен ентитет. Наместо тоа, попустот е моделиран преку `Discount`, кој се поврзува со `order_cart`. 25 30 26 Како е моделиран: Постои врска „многу-кон-многу“ (many-to-many) воспоставена помеѓу Event и Category користејќи ја спојната табела Event_Category. Location е издвоена во сопствена посебна табела, поврзана со настанот преку надворешен клуч и дополнително категоризирана според Location_type. 31 = II Сегмент: Категоризација и структурирање на настани = 27 32 28 Зошто е моделиран на овој начин: 33 '''Вклучени ентитети:''' Event, Category, Event_category, Event_status, Location, Location_type, Section, Seat. 29 34 30 1. Флексибилно означување (Tagging): Настан како „Самит на SaaS основачи“ можеби ќе треба да се означи под повеќе категории: „Технологија“, „Бизнис“ и „Вмрежување“. Спојната табела спречува дуплирање на податоците и им овозможува на корисниците да ја филтрираат платформата според повеќе интереси кои се вкрстуваат. 35 '''Како е моделиран:''' 36 `Event` е главниот ентитет за настанот. Тој е поврзан со `Category` преку junction табелата `Event_category`, бидејќи еден настан може да има повеќе категории, а една категорија може да припаѓа на повеќе настани. 31 37 32 2. Менаџирање со локации: Со нормализирање на Location, повеќе настани можат да бидат поврзани со истото место без да се препишуваат адресата, капацитетот и координатите секој пат. Ова обезбедува конзистентност на податоците и ѝ овозможува на платформата да има „Страници за локации“ кои ги прикажуваат сите претстојни настани на одредена локација.38 Локацијата е нормализирана преку `Location`, а нејзиниот тип преку `Location_type`. Дополнително, физичката структура на локацијата е претставена преку `Section` и `Seat`. 33 39 34 III Сегмент на моделот: Кориснички улоги и контрола на пристап 40 '''Зошто е моделиран на овој начин:''' 35 41 36 Вклучени ентитети: User, Organizer, Subscription_organizer, Role / Staff_role. 42 * '''Флексибилни категории:''' 43 Настан може истовремено да биде „Technology“, „Business“ и „Networking“. Со `Event_category` не се дуплираат категории и лесно може да се филтрираат настани според повеќе интереси. 37 44 38 Како е моделиран: Има централна табела User за автентикација, која се разгранува во специфични улоги зависни од контекстот, како Organizer или Staff, во зависност од нивната врска со одреден настан или претплата. 45 * '''Локацијата не се повторува:''' 46 Ако повеќе настани се одржуваат на исто место, адресата, капацитетот и типот на локација не треба да се внесуваат повторно. Тоа ја намалува редундантноста и ја подобрува конзистентноста. 39 47 40 Зошто е моделиран на овој начин: 48 * '''Section и Seat се важни за билетирање:''' 49 Бидејќи билетот може да биде поврзан со конкретно седиште, моделот може да поддржи концертни сали, театри, конференциски простории или стадиони каде што капацитетот не е само бројка, туку реална структура. 41 50 42 1. Контрола на пристап базирана на улоги (RBAC): Еден корисник може да биде главен Organizer за сопствен настан, но едноставно редовен посетител на друга конференција. Со тоа што „is_organizer“ не е хардкодиран како едноставен булеан (boolean) во централната табела User, шемата поддржува multi-tenant authorization каде дозволите се строго поврзани со специфични ID-а на настани. 51 = III Сегмент: Корисници, организатори и претплати = 43 52 44 IV Сегмент на моделот: Операции на настани (Распоред и персонал) 53 '''Вклучени ентитети:''' User_app, Organizer, Subscription_organizer, Subscription_type, Staff, Staff_role. 45 54 46 Вклучени ентитети: Event_Schedule, Shift, Staff, Staff_role. 55 '''Како е моделиран:''' 56 `User_app` е централната табела за корисниците. Организаторите се моделирани посебно преку `Organizer`, а врската меѓу корисник и организатор се прави преку `Subscription_organizer`. Видот на претплата е издвоен во `Subscription_type`. 47 57 48 Како е моделиран: Наместо да се третира настанот како еден единствен блок од време, тој е разложен на Event_Schedule_Sеssion (сесии, работилници, итн.). Менаџирањето со персонал се менаџира преку систем на смени (Shift), каде што поединечни членови на персоналот Staff (на кои им е доделена улога Staff_role) се мапирани на специфични времиња/локации.58 Персоналот е посебно моделиран преку `Staff`, со улоги во `Staff_role`. 49 59 50 Зошто е моделиран на овој начин: 60 '''Зошто е моделиран на овој начин:''' 51 61 52 1. Детална логистика: Големите конференции не се едноставни. Оваа структура му овозможува на системот да изгради план за посетителите (кој зборува кога и каде) и распоред за операциите (кој чувар е на која врата во 14:00 часот). Ова го решава проблемот со комплексноста на повеќедневни настани со повеќе траки. 62 * '''User_app не е преоптоварена со сите можни улоги:''' 63 Корисникот може да биде обичен посетител, да следи организатор, да купува билети, да остава reviews, или да биде дел од staff логиката. Затоа не е добро сите овие работи да се стават како boolean полиња во `User_app`. 53 64 54 V Сегмент на моделот: Спонзорства и настани 65 * '''Organizer е посебен дел од моделот:''' 66 Организаторот има свои податоци како company_name, contact_phone и website_url. Тоа не е исто како обичен кориснички профил. 55 67 56 Вклучени ентитети: Sponsor, Sponsor_tier. 68 * '''Subscription_organizer ја моделира релацијата корисник - организатор:''' 69 Ова овозможува еден корисник да следи повеќе организатори, а еден организатор да има повеќе претплатници. 57 70 58 Како е моделиран: Спонзорите се следат како посебни ентитети поврзани со конкретни настани, категоризирани според ниво на спонзорство Sponsor_tier (на пр., златно, сребрено, бронзено). Изложувачите исто така имаат посветени табели што ги мапираат со настанот. 71 = IV Сегмент: Распоред, сесии и операции на настани = 59 72 60 Зошто е моделиран на овој начин: 61 1. Професорот ни сугерираше да ги раздвоиме во неколку junction tables, за да може даден спонзор да е различен тип (gold, silver...) на различни настани. 73 '''Вклучени ентитети:''' Event_schedule, Event_schedule_session, Session_type, Shift, Staff, Staff_role, Exhibitor, Exhibitor_event_schedule_session. 74 75 '''Како е моделиран:''' 76 Настанот не се третира како еден обичен временски блок. `Event_schedule` го претставува распоредот, а `Event_schedule_session` ги претставува конкретните сесии, презентации, работилници или активности во рамки на тој распоред. `Session_type` го дефинира типот на сесијата. 77 78 Персоналот се организира преку `Shift`, каде се чува кој staff член работи во кој период. Изложувачите се поврзуваат со конкретни сесии преку `Exhibitor_event_schedule_session`. 79 80 '''Зошто е моделиран на овој начин:''' 81 82 * '''Голем настан има повеќе делови:''' 83 Конференција може да има opening talk, workshops, networking session и closing panel. Затоа `Event_schedule_session` е неопходна табела. 84 85 * '''Оперативната логика е одвоена од програмската логика:''' 86 Сесиите кажуваат што се случува на настанот, додека `Shift` кажува кој работи и кога. Тоа се две различни работи и затоа се моделирани посебно. 87 88 * '''Изложувачите можат да бидат врзани за конкретни сесии:''' 89 Не мора секој exhibitor да биде релевантен за целиот настан. Некој може да биде присутен само на одредена сесија или дел од програмата. 90 91 = V Сегмент: Спонзорства и изложувачи = 92 93 '''Вклучени ентитети:''' Sponsor, Sponsor_event, Sponsor_type, Sponsor_type_sponsor, Exhibitor, Exhibitor_event_schedule_session. 94 95 '''Како е моделиран:''' 96 Спонзорите се чуваат во `Sponsor`. Врската меѓу спонзор и настан е во `Sponsor_event`. Типовите на спонзорство, како Gold, Silver или Bronze, се во `Sponsor_type`, а нивната доделба се прави преку `Sponsor_type_sponsor`. 97 98 Изложувачите се моделирани посебно преку `Exhibitor` и се поврзуваат со конкретни сесии преку `Exhibitor_event_schedule_session`. 99 100 '''Зошто е моделиран на овој начин:''' 101 102 * '''Спонзор може да има различна улога на различни настани:''' 103 Истиот спонзор може да биде Gold sponsor на еден настан, но Silver sponsor на друг. Затоа не е добро типот на спонзорство да стои само во `Sponsor`. 104 105 * '''Junction табелите ја решаваат many-to-many логиката:''' 106 Еден настан може да има повеќе спонзори, а еден спонзор може да учествува на повеќе настани. Истото важи и за типови на спонзорства. 107 108 * '''Изложувачите не се исто што и спонзорите:''' 109 Спонзор плаќа или поддржува настан. Изложувач има физичко или програмско присуство, најчесто поврзано со конкретна сесија или простор.
