| 153 | |
| 154 | = Комуникација преку домени = |
| 155 | |
| 156 | == Објаснување == |
| 157 | Комуникацијата преку различни домени е овозможена со заеднички идентификатори (foreign keys) и мост-табели што ги поврзуваат ентитетите низ домените. |
| 158 | Ова се изведува со **JOIN** во SQL прашања, кои овозможуваат податоци од повеќе домени да се комбинираат во еден резултат. |
| 159 | |
| 160 | == Примери на cross-domain прашања == |
| 161 | |
| 162 | === A) „Кои часови ги резервирал корисникот X, со информации за тренинг и инструктор?“ === |
| 163 | ```sql |
| 164 | SELECT c.class_id, c.date, c.start_time, c.location, |
| 165 | t.training_name, |
| 166 | i.first_name || ' ' || i.last_name AS instructor |
| 167 | FROM "User_Booked_Class" ubc |
| 168 | JOIN "Class" c ON c.class_id = ubc.class_id |
| 169 | LEFT JOIN "Class_Includes_Training" cit ON cit.class_id = c.class_id |
| 170 | LEFT JOIN "Training" t ON t.training_id = cit.training_id |
| 171 | LEFT JOIN "Instructor" i ON i.instructor_id = c.instructor_id |
| 172 | WHERE ubc.user_id = $1 |
| 173 | ORDER BY c.date, c.start_time; |
| 174 | === B) „Кои часови ги отклучуваат пакетите што сум ги купил?“ === |
| 175 | |
| 176 | SELECT DISTINCT c.class_id, c.date, c.start_time, c.location, t.training_name |
| 177 | FROM "User_Purchased_Package" upp |
| 178 | JOIN "Package_Includes_Class" pic ON pic.package_id = upp.package_id |
| 179 | JOIN "Class" c ON c.class_id = pic.class_id |
| 180 | LEFT JOIN "Class_Includes_Training" cit ON cit.class_id = c.class_id |
| 181 | LEFT JOIN "Training" t ON t.training_id = cit.training_id |
| 182 | WHERE upp.user_id = $1 |
| 183 | ORDER BY c.date, c.start_time; |
| 184 | |
| 185 | |
| 186 | === C) „Кои учесници на настани исто така резервирале клас за тренинг ‘Vinyasa’?“ === |
| 187 | |
| 188 | SELECT DISTINCT u.user_id, u.username, e.event_name, e.date |
| 189 | FROM "User_Event" ue |
| 190 | JOIN "Event" e ON e.event_id = ue.event_id |
| 191 | JOIN "User_Booked_Class" ubc ON ubc.user_id = ue.user_id |
| 192 | JOIN "Class_Includes_Training" cit ON cit.class_id = ubc.class_id |
| 193 | JOIN "Training" t ON t.training_id = cit.training_id |
| 194 | JOIN "User" u ON u.user_id = ue.user_id |
| 195 | WHERE t.training_name = 'Vinyasa' |
| 196 | ORDER BY e.date; |
| 197 | |
| 198 | |
| 199 | === D) „Корисници кои купиле мерч по купување на било кој пакет“ === |
| 200 | |
| 201 | SELECT u.user_id, u.email, COUNT(DISTINCT upm.merch_id) merch_count |
| 202 | FROM "User" u |
| 203 | JOIN "User_Purchased_Package" upp ON upp.user_id = u.user_id |
| 204 | JOIN "User_Purchased_Merch" upm ON upm.user_id = u.user_id |
| 205 | GROUP BY u.user_id, u.email |
| 206 | ORDER BY merch_count DESC; |
| 207 | |
| 208 | |
| 209 | == Имплементација во Express == |
| 210 | Во Express backend-от, овие SQL прашања стануваат controller actions кои се извршуваат и враќаат JSON. |
| 211 | Надворешните клучеви и индексите овозможуваат овие JOIN-и да бидат брзи и конзистентни. |
| 212 | |