| | 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 | |