7 | | 1. Менаџирање на дестинации и тагови |
8 | | 2. Менаџирање на корисници и нивни активности (рецензии, преференци) |
9 | | 3. Менаџирање на патувања (пакети, активности, резервации) |
10 | | 4. Менаџирање на настани, временски услови |
11 | | |
| 8 | * Менаџирање на дестинации и тагови |
| 9 | * Менаџирање на корисници и нивни активности (рецензии, преференци, телефони) |
| 10 | * Менаџирање на патувања (пакети, активности, резервации) |
| 11 | * Менаџирање на настани и временски услови |
| 12 | * Менаџирање на метеоролошки податоци |
15 | | R = { idDest, imeLokacija, opisLokacija, tipoviMesta, preporachanaSezona, prosechnaTemp, geoLokacija, drzhava, popularnost, ime, opis, idTag, tagOznaka } |
| 16 | R = { id_destination, location_name, location_desc, types_of_places, recommended_season, average_temp, latitude, longitude, country, popularity, important_location_name, important_location_description, id_tag, tag_name } |
36 | | • R1 = { idDest, imeLokacija, opisLokacija, tipoviMesta, preporachanaSezona, prosechnaTemp, geoLokacija, drzhava, popularnost, ime, opis } |
37 | | • R2 = { idTag, tagOznaka } |
38 | | • R3 = { idDest, idTag } → релација DESTINACII_HAS_TAGOVI |
| 32 | R1 = { id_destination, location_name, location_desc, average_temp, latitude, longitude, country, popularity } |
| 33 | |
| 34 | R2 = { id_tag, tag_name } |
| 35 | |
| 36 | R3 = { id_destination, id_tag } → destination_has_tags |
| 37 | |
| 38 | R4 = { id_destination, place_type } → destination_place_type |
| 39 | |
| 40 | R5 = { id_destination, season } → destination_season |
| 41 | |
| 42 | R6 = { id_location, id_destination, name, description } → important_location |
44 | | R = { idKorisnik, ime, prezime, ePoshta, telBr, datumRagjanje, tip, idDest, idRecenzija, idRezervacija, korisnichkoIme, kvalitet, zabeleshka, datumRecenzija, brGlasovi, idPreferenca, tipPreferenca, prioritet } |
| 48 | R = { id_user, first_name, last_name, email, phone_number, birth_date, is_premium, id_review, id_reservation, username, quality, comment, review_date, vote_count, id_preference, type_preference, priority } |
56 | | |
57 | | 1НФ: Атомарни вредности - задоволена |
58 | | |
59 | | 2НФ: Одделени се податоците за рецензии и преференци за да се избегнат парцијални зависности - не (рецензии и преференци не зависат од цел клуч) |
60 | | |
61 | | 3НФ: Нема транзитивни врски (на пример, ePoshta не одредува korisnichkoIme) - не (можна транзитивност korisnichkoIme ↔ ePoshta) |
| 61 | Нормализација: |
| 62 | * 1НФ: Атомарни вредности (phone_number, type_preference распарсани). |
| 63 | * 2НФ: Рецензии, преференци и телефони се одвоени во посебни табли за да нема делумни FD. |
| 64 | * 3НФ: Нема транзитивни зависимости; username се елиминира и се користи reservation → user. |
65 | | • R4 = { idKorisnik, ime, prezime, ePoshta, telBr, datumRagjanje, tip } |
66 | | • R5 = { idKorisnik, idDest, idRecenzija, idRezervacija, korisnichkoIme, kvalitet, zabeleshka, datumRecenzija, brGlasovi } |
67 | | • R6 = { idPreferenca, idKorisnik, tipPreferenca, prioritet } |
| 68 | R7 = { id_user, first_name, last_name, email, birth_date, is_premium } |
| 69 | |
| 70 | R8 = { id_user, phone_number } → user_phone |
| 71 | |
| 72 | R9 = { id_review, id_user, id_destination, quality, comment, review_date, vote_count } → review |
| 73 | |
| 74 | R10 = { id_preference, id_user, priority } |
| 75 | |
| 76 | R11 = { id_preference, type_preference } → preference_type |
73 | | R = { idPaket, imePaket, cena, pochetok, kraj, idDest, idAktivnost, imeAktivnost, informacii, kategorija, iznos, idRezervacija, idKorisnik, vremenskaTochka, status, vkupnaCena, idMeteo } |
| 82 | R = { id_package, package_name, price, start_date, end_date, id_destination, id_activity, activity_name, information, category, amount, id_reservation, id_user, time_point, premium_discount_applied, discount_amount, total_price } |
77 | | • idPaket → основни податоци за патниот пакет |
78 | | • idAktivnost → опис на активноста |
79 | | • idRezervacija → информации за резервацијата |
80 | | • idAktivnost, idPaket → активности во конкретен пакет |
| 86 | * id_package → основни податоци за пакет |
| 87 | * id_activity → опис на активноста |
| 88 | * id_reservation → информации за резервацијата |
| 89 | * id_activity, id_package → активности во пакет |
87 | | 1НФ: Атомарни вредности - задоволена |
88 | | |
89 | | 2НФ: Резервации и активности се одвоени, бидејќи не зависат од целиот составен клуч - не (многу информации зависат од дел од клучот) |
90 | | |
91 | | 3НФ: Нема транзитивни зависимости (на пример, idMeteo е надворешен клуч, но сите метео атрибути се одвоени) - не (пр. idMeteo има свои податоци, што се мешаат) |
| 96 | Нормализација: |
| 97 | * 1НФ: Атомарни вредности. |
| 98 | * 2НФ: Резервации и активности се одвоени. |
| 99 | * 3НФ: Нема транзитивни зависимости; PK е секогаш јасен. |
95 | | • R7 = { idPaket, imePaket, cena, pochetok, kraj, idDest, vkupnaCena, idMeteo } |
96 | | • R8 = { idAktivnost, imeAktivnost, informacii, kategorija, iznos, idDest } |
97 | | • R9 = { idPaket, idAktivnost } |
98 | | • R10 = { idRezervacija, idKorisnik, idPaket, vremenskaTochka, status } |
99 | | • R11 = { idRezervacija, idAktivnost } |
| 103 | R12 = { id_package, package_name, price, start_date, end_date, id_destination } |
| 104 | |
| 105 | R13 = { id_activity, activity_name, information, amount, id_destination } |
| 106 | |
| 107 | R14 = { id_package, id_activity } → package_activity |
| 108 | |
| 109 | R15 = { id_reservation, id_user, id_package, time_point, premium_discount_applied, discount_amount, total_price } |
| 110 | |
| 111 | R16 = { id_reservation, id_activity } → activity_reservation |
105 | | R = { idNastan, naziv, vidovi, pochetenDatum, kraenDatum, detali, idDest, idMeteo, momentTemp, sostojbaVreme, predupreduvanja, vlazhnost, veter, mesec, datum } |
| 117 | R = { id_event, event_name, event_type, start_date, end_date, details, id_destination, id_meteo, current_temp, weather_condition, warnings, humidity, wind, month } |
125 | | • R12 = { idNastan, naziv, vidovi, pochetenDatum, kraenDatum, detali, idDest, idMeteo } |
126 | | • R13 = { idMeteo, momentTemp, sostojbaVreme, predupreduvanja, vlazhnost, veter, mesec, datum, idDest } |
| 135 | R17 = { id_event, event_name, start_date, end_date, details, id_destination } |
| 136 | |
| 137 | R18 = { id_event, event_type } → event_type |
| 138 | |
| 139 | R19 = { id_meteo, id_destination, current_temp, humidity, wind, month } → meteorological_condition |
| 140 | |
| 141 | R20 = { id_meteo, condition_value } → meteo_condition_value |
| 142 | |
| 143 | R21 = { id_meteo, warning_text } → meteo_warning_value |
134 | | 2NF |
135 | | Секој non-prime атрибут целосно зависи од примарниот клуч, така што нема парцијални функционални зависности. Пример: Во R5 (рецензии), PK=(idKorisnik, idDest, idRecenzija), а сите други атрибути зависат од нив комбинација, не од дел од нив. |
| 154 | Придобивки од нормализација: |
| 155 | *Елиминација на вишоци и дупликации |
| 156 | * Отстранување на аномалии при внесување, бришење или ажурирање |
| 157 | * Подобра логичка организација на податоците |
| 158 | * Јасна поделба според функционалност (модули) |
| 159 | * Можност за идно проширување на моделот без пречки |
137 | | |
138 | | 3NF |
139 | | Сите non-prime атрибути зависат директно од PK, нема транзитивни зависимости (ниедно A → B → C). Пример: idMeteo → метео параметри, и idMeteo е дел од PK во R13, па нема транзитивност. |
140 | | |
141 | | |
142 | | * Lossless & Dependency‑preserving decomposition - Декомпозициите се lossless, бидејќи за сите R → R1, R2, пресекот вклучува PK, а PK → R1 или R2 е Functional dependency во F+. Исто така, декомпозицијата е dependency‑preserving бидејќи сите оригинални функционални зависимости се реализирани во новите релации без потреба за join. |
143 | | |
144 | | |
145 | | |
146 | | Примената на функционска декомпозиција и нормализација до третата нормална форма (3НФ) резултира со оптимизирана структура на базата која ги исполнува следниве цели: |
147 | | • Елиминација на вишоци и дупликации |
148 | | • Отстранување на аномалии при внесување, бришење или ажурирање |
149 | | • Подобра логичка организација на податоците |
150 | | • Јасна поделба според функционалност (модули) |
151 | | • Можност за идно проширување на моделот без пречки |
152 | | На овој начин, дизајнот на базата не само што ги задоволува тековните барања на апликацијата TravelSage, туку и обезбедува стабилна основа за нејзина понатамошна еволуција. |
153 | | |
154 | | |
155 | | Целиот процес го дизајнирав така што ќе овозможи јасна логичка структура во иднина. Од моја перспектива, ова е особено важно за апликации како TravelSage што може да прераснат во посложени системи. |
| 161 | На овој начин, дизајнот на базата ги исполнува тековните барања на апликацијата TravelSage и обезбедува стабилна основа за идно проширување и еволуција. |