| | 1 | == SQL Views во системот за библиотека == |
| | 2 | |
| | 3 | Во овој дел се прикажани SQL погледите кои се користат во системот за управување со библиотека. |
| | 4 | Секој поглед е креиран со цел да прикаже одредени податоци на поорганизиран начин и да ја олесни работата со книгите, членовите, позајмувањата, резервациите и финансиските информации. |
| | 5 | |
| | 6 | --- |
| | 7 | |
| | 8 | === 1. View: vw_books_in_library === |
| | 9 | |
| | 10 | {{{#!sql |
| | 11 | CREATE OR REPLACE VIEW vw_books_in_library AS |
| | 12 | SELECT |
| | 13 | b.book_id, |
| | 14 | b.title, |
| | 15 | COUNT(bc.copy_id) AS book_copy_count, |
| | 16 | |
| | 17 | ``` |
| | 18 | CASE |
| | 19 | WHEN COUNT(CASE WHEN bc.available = 1 THEN 1 END) > 0 |
| | 20 | THEN 'Available' |
| | 21 | ELSE 'Not Available' |
| | 22 | END AS availability_status |
| | 23 | ``` |
| | 24 | |
| | 25 | FROM book b |
| | 26 | LEFT JOIN bookcopy bc |
| | 27 | ON b.book_id = bc.book_id |
| | 28 | GROUP BY b.book_id, b.title; |
| | 29 | }}} |
| | 30 | |
| | 31 | '''Опис:''' |
| | 32 | Овој поглед прикажува информации за книгите во библиотеката, бројот на копии за секоја книга и статусот на достапност. |
| | 33 | Со помош на `COUNT` се пресметува колку копии постојат за секоја книга, а со `CASE` се одредува дали книгата е достапна или не. |
| | 34 | |
| | 35 | '''Употреба / бизнис логика:''' |
| | 36 | Овој view ја имплементира логиката за преглед на достапност на книги во библиотеката. |
| | 37 | Се користи кога библиотекарот или корисникот треба брзо да провери дали одредена книга има достапни копии за позајмување. |
| | 38 | |
| | 39 | --- |
| | 40 | |
| | 41 | === 2. View: vw_member_financial_summary === |
| | 42 | |
| | 43 | {{{#!sql |
| | 44 | CREATE OR REPLACE VIEW vw_member_financial_summary AS |
| | 45 | SELECT |
| | 46 | m.member_id, |
| | 47 | m.first_name, |
| | 48 | m.last_name, |
| | 49 | |
| | 50 | ``` |
| | 51 | COALESCE(fee_sum.total_fees, 0) AS total_fees, |
| | 52 | COALESCE(fine_sum.total_fines, 0) AS total_fines, |
| | 53 | |
| | 54 | COALESCE(fee_sum.total_fees, 0) + COALESCE(fine_sum.total_fines, 0) AS total_due |
| | 55 | ``` |
| | 56 | |
| | 57 | FROM Member m |
| | 58 | |
| | 59 | LEFT JOIN ( |
| | 60 | SELECT |
| | 61 | mb.member_id, |
| | 62 | SUM(f.amount) AS total_fees |
| | 63 | FROM Fee f |
| | 64 | JOIN Membership mb |
| | 65 | ON mb.membership_id = f.membership_id |
| | 66 | GROUP BY mb.member_id |
| | 67 | ) fee_sum |
| | 68 | ON fee_sum.member_id = m.member_id |
| | 69 | |
| | 70 | LEFT JOIN ( |
| | 71 | SELECT |
| | 72 | mb.member_id, |
| | 73 | SUM(f.amount) AS total_fines |
| | 74 | FROM Fine f |
| | 75 | JOIN Borrowing b |
| | 76 | ON b.borrowing_id = f.borrowing_id |
| | 77 | JOIN Membership mb |
| | 78 | ON mb.membership_id = b.membership_id |
| | 79 | GROUP BY mb.member_id |
| | 80 | ) fine_sum |
| | 81 | ON fine_sum.member_id = m.member_id; |
| | 82 | }}} |
| | 83 | |
| | 84 | '''Опис:''' |
| | 85 | Овој поглед прикажува финансиски преглед за секој член на библиотеката. |
| | 86 | Се пресметуваат вкупните членарини, вкупните казни и вкупниот долг на членот. |
| | 87 | Функцијата `COALESCE` се користи за да се прикаже вредност 0 кога членот нема членарини или казни. |
| | 88 | |
| | 89 | '''Употреба / бизнис логика:''' |
| | 90 | Овој view ја имплементира бизнис логиката за финансиска состојба на членови. |
| | 91 | Се користи за проверка колку вкупно треба да плати одреден член, земајќи ги предвид и членарините и казните. |
| | 92 | |
| | 93 | --- |
| | 94 | |
| | 95 | === 3. View: vw_most_popular_books_per_month === |
| | 96 | |
| | 97 | {{{#!sql |
| | 98 | CREATE OR REPLACE VIEW vw_most_popular_books_per_month AS |
| | 99 | SELECT * |
| | 100 | FROM ( |
| | 101 | SELECT |
| | 102 | b.book_id, |
| | 103 | b.title, |
| | 104 | DATE_TRUNC('month', br.borrow_date) AS month, |
| | 105 | COUNT(*) AS total_borrowings, |
| | 106 | RANK() OVER ( |
| | 107 | PARTITION BY DATE_TRUNC('month', br.borrow_date) |
| | 108 | ORDER BY COUNT(*) DESC |
| | 109 | ) AS rnk |
| | 110 | FROM borrowing br |
| | 111 | JOIN book b ON br.book_id = b.book_id |
| | 112 | GROUP BY b.book_id, b.title, DATE_TRUNC('month', br.borrow_date) |
| | 113 | ) sub |
| | 114 | WHERE rnk = 1; |
| | 115 | }}} |
| | 116 | |
| | 117 | '''Опис:''' |
| | 118 | Овој поглед ги прикажува најпопуларните книги по месец, односно книгите кои биле најмногу позајмувани во секој месец. |
| | 119 | Со `DATE_TRUNC('month', br.borrow_date)` позајмувањата се групираат по месец, а со `RANK()` се рангираат книгите според бројот на позајмувања. |
| | 120 | |
| | 121 | '''Употреба / бизнис логика:''' |
| | 122 | Овој view ја имплементира логиката за анализа на популарност на книги. |
| | 123 | Се користи за извештаи кои покажуваат кои книги биле најбарани во одредени месеци, што може да помогне при набавка на нови копии или планирање на библиотечниот фонд. |
| | 124 | |
| | 125 | --- |
| | 126 | |
| | 127 | === 4. View: vw_reservations === |
| | 128 | |
| | 129 | {{{#!sql |
| | 130 | CREATE OR REPLACE VIEW vw_reservations AS |
| | 131 | SELECT |
| | 132 | r.reservation_id, |
| | 133 | r.member_id, |
| | 134 | m.first_name, |
| | 135 | m.last_name, |
| | 136 | r.book_id, |
| | 137 | b.title, |
| | 138 | r.requested_date, |
| | 139 | r.expected_date, |
| | 140 | r.status |
| | 141 | FROM reservation r |
| | 142 | JOIN member m ON r.member_id = m.member_id |
| | 143 | JOIN book b ON r.book_id = b.book_id; |
| | 144 | }}} |
| | 145 | |
| | 146 | '''Опис:''' |
| | 147 | Овој поглед прикажува информации за резервациите направени од членовите. |
| | 148 | Се прикажуваат податоци за членот, книгата, датумот на барање, очекуваниот датум и статусот на резервацијата. |
| | 149 | |
| | 150 | '''Употреба / бизнис логика:''' |
| | 151 | Овој view ја имплементира логиката за следење на резервации во библиотеката. |
| | 152 | Се користи за библиотекарот да има јасен преглед кои книги се резервирани, од кои членови и во каков статус се резервациите. |
| | 153 | |
| | 154 | --- |
| | 155 | |
| | 156 | === 5. View: vw_overdue_books === |
| | 157 | |
| | 158 | {{{#!sql |
| | 159 | CREATE OR REPLACE VIEW vw_overdue_books AS |
| | 160 | SELECT |
| | 161 | m.member_id, |
| | 162 | m.first_name, |
| | 163 | m.last_name, |
| | 164 | b.title AS book_title, |
| | 165 | br.due_date, |
| | 166 | |
| | 167 | ``` |
| | 168 | CURRENT_DATE - br.due_date AS days_overdue |
| | 169 | ``` |
| | 170 | |
| | 171 | FROM borrowing br |
| | 172 | |
| | 173 | JOIN member m |
| | 174 | ON m.member_id = br.membership_id |
| | 175 | |
| | 176 | JOIN book b |
| | 177 | ON b.book_id = br.book_id |
| | 178 | |
| | 179 | WHERE |
| | 180 | br.return_date IS NULL |
| | 181 | AND br.due_date < CURRENT_DATE; |
| | 182 | }}} |
| | 183 | |
| | 184 | '''Опис:''' |
| | 185 | Овој поглед ги прикажува книгите кои се позајмени, но не се вратени навреме. |
| | 186 | Се прикажува членот кој ја има позајмено книгата, насловот на книгата, рокот за враќање и бројот на денови на доцнење. |
| | 187 | Условот `br.return_date IS NULL` значи дека книгата сè уште не е вратена. |
| | 188 | |
| | 189 | '''Употреба / бизнис логика:''' |
| | 190 | Овој view ја имплементира логиката за следење на задоцнети книги. |
| | 191 | Се користи за библиотекарот да може лесно да провери кои членови доцнат со враќање на книги и колку дена е поминат рокот. |
| | 192 | |
| | 193 | --- |
| | 194 | |
| | 195 | === 6. View: vw_low_stock_books === |
| | 196 | |
| | 197 | {{{#!sql |
| | 198 | CREATE OR REPLACE VIEW vw_low_stock_books AS |
| | 199 | SELECT |
| | 200 | b.book_id, |
| | 201 | b.title, |
| | 202 | |
| | 203 | ``` |
| | 204 | COUNT(DISTINCT bc.copy_id) AS total_copies, |
| | 205 | |
| | 206 | COUNT(DISTINCT CASE |
| | 207 | WHEN br.return_date IS NULL THEN bc.copy_id |
| | 208 | END) AS borrowed_copies, |
| | 209 | |
| | 210 | (COUNT(DISTINCT bc.copy_id) |
| | 211 | - COUNT(DISTINCT CASE |
| | 212 | WHEN br.return_date IS NULL THEN bc.copy_id |
| | 213 | END) |
| | 214 | ) AS available_copies |
| | 215 | ``` |
| | 216 | |
| | 217 | FROM book b |
| | 218 | |
| | 219 | JOIN bookcopy bc |
| | 220 | ON b.book_id = bc.book_id |
| | 221 | |
| | 222 | LEFT JOIN borrowing br |
| | 223 | ON bc.copy_id = br.copy_id |
| | 224 | |
| | 225 | GROUP BY |
| | 226 | b.book_id, b.title |
| | 227 | |
| | 228 | HAVING |
| | 229 | (COUNT(DISTINCT bc.copy_id) |
| | 230 | - COUNT(DISTINCT CASE |
| | 231 | WHEN br.return_date IS NULL THEN bc.copy_id |
| | 232 | END) |
| | 233 | ) <= 1; |
| | 234 | }}} |
| | 235 | |
| | 236 | '''Опис:''' |
| | 237 | Овој поглед ги прикажува книгите кои имаат мал број достапни копии. |
| | 238 | Се пресметува вкупниот број копии, бројот на позајмени копии и бројот на достапни копии. |
| | 239 | Со `HAVING` условот се прикажуваат само книгите кај кои бројот на достапни копии е помал или еднаков на 1. |
| | 240 | |
| | 241 | '''Употреба / бизнис логика:''' |
| | 242 | Овој view ја имплементира логиката за следење на книги со мала достапност. |
| | 243 | Се користи за библиотеката да може навреме да утврди за кои книги треба да се набават дополнителни копии. |
| | 244 | |
| | 245 | --- |
| | 246 | |
| | 247 | === 7. View: vw_member_borrowing_history === |
| | 248 | |
| | 249 | {{{#!sql |
| | 250 | CREATE OR REPLACE VIEW vw_member_borrowing_history AS |
| | 251 | SELECT |
| | 252 | m.member_id, |
| | 253 | m.first_name, |
| | 254 | m.last_name, |
| | 255 | b.title, |
| | 256 | br.borrow_date, |
| | 257 | br.return_date, |
| | 258 | br.due_date, |
| | 259 | br.return_status |
| | 260 | FROM borrowing br |
| | 261 | JOIN member m ON m.member_id = br.membership_id |
| | 262 | JOIN book b ON br.book_id = b.book_id; |
| | 263 | }}} |
| | 264 | |
| | 265 | '''Опис:''' |
| | 266 | Овој поглед ја прикажува историјата на позајмувања за членовите. |
| | 267 | За секој запис се прикажува членот, книгата, датумот на позајмување, датумот на враќање, рокот за враќање и статусот на враќање. |
| | 268 | |
| | 269 | '''Употреба / бизнис логика:''' |
| | 270 | Овој view ја имплементира логиката за преглед на позајмени книги по член. |
| | 271 | Се користи кога библиотекарот сака да ја провери историјата на позајмувања на одреден корисник. |
| | 272 | |
| | 273 | --- |
| | 274 | |
| | 275 | === 8. View: vw_book_catalog === |
| | 276 | |
| | 277 | {{{#!sql |
| | 278 | CREATE OR REPLACE VIEW vw_book_catalog AS |
| | 279 | SELECT |
| | 280 | b.book_id, |
| | 281 | b.title, |
| | 282 | b.isbn, |
| | 283 | p.name AS publisher, |
| | 284 | |
| | 285 | ``` |
| | 286 | STRING_AGG(DISTINCT a.first_name || ' ' || a.last_name, ', ') AS authors, |
| | 287 | |
| | 288 | STRING_AGG(DISTINCT g.name, ', ') AS genres, |
| | 289 | |
| | 290 | STRING_AGG(DISTINCT l.name, ', ') AS languages |
| | 291 | ``` |
| | 292 | |
| | 293 | FROM Book b |
| | 294 | |
| | 295 | LEFT JOIN Publisher p |
| | 296 | ON b.publisher_id = p.publisher_id |
| | 297 | |
| | 298 | LEFT JOIN Author_Book ab |
| | 299 | ON b.book_id = ab.book_id |
| | 300 | |
| | 301 | LEFT JOIN Author a |
| | 302 | ON ab.author_id = a.author_id |
| | 303 | |
| | 304 | LEFT JOIN BookGenre bg |
| | 305 | ON b.book_id = bg.book_id |
| | 306 | |
| | 307 | LEFT JOIN Genre g |
| | 308 | ON bg.genre_id = g.genre_id |
| | 309 | |
| | 310 | LEFT JOIN BookLanguages bl |
| | 311 | ON b.book_id = bl.book_id |
| | 312 | |
| | 313 | LEFT JOIN Language l |
| | 314 | ON bl.language_id = l.language_id |
| | 315 | |
| | 316 | GROUP BY |
| | 317 | b.book_id, b.title, b.isbn, p.name; |
| | 318 | }}} |
| | 319 | |
| | 320 | '''Опис:''' |
| | 321 | Овој поглед претставува каталог на книги во библиотеката. |
| | 322 | За секоја книга се прикажуваат основните информации како наслов, ISBN, издавач, автори, жанрови и јазици. |
| | 323 | Функцијата `STRING_AGG` се користи за повеќе автори, жанрови или јазици да се прикажат во една колона, одделени со запирка. |
| | 324 | |
| | 325 | '''Употреба / бизнис логика:''' |
| | 326 | Овој view ја имплементира логиката за приказ на комплетен каталог на книги. |
| | 327 | Се користи за пребарување и прикажување на детални информации за книгите во библиотечниот систем. |
| | 328 | |
| | 329 | --- |
| | 330 | |
| | 331 | === 9. View: vw_damaged_books === |
| | 332 | |
| | 333 | {{{#!sql |
| | 334 | CREATE OR REPLACE VIEW vw_damaged_books AS |
| | 335 | SELECT |
| | 336 | b.book_id, |
| | 337 | b.title, |
| | 338 | bc.copy_id |
| | 339 | FROM book b |
| | 340 | JOIN bookcopy bc ON b.book_id = bc.book_id |
| | 341 | WHERE bc.status_id = 2; |
| | 342 | }}} |
| | 343 | |
| | 344 | '''Опис:''' |
| | 345 | Овој поглед ги прикажува оштетените книги во библиотеката. |
| | 346 | Се прикажуваат идентификаторот на книгата, насловот и конкретната копија која е означена како оштетена. |
| | 347 | Условот `bc.status_id = 2` се користи за филтрирање на копии со статус оштетена книга. |
| | 348 | |
| | 349 | '''Употреба / бизнис логика:''' |
| | 350 | Овој view ја имплементира логиката за следење на оштетени примероци од книги. |
| | 351 | Се користи за библиотекарот да има преглед кои копии не се во добра состојба и треба да се поправат, заменат или отстранат од употреба. |
| | 352 | |
| | 353 | --- |
| | 354 | |
| | 355 | == Тестирање и оптимизација == |
| | 356 | |
| | 357 | За проверка на перформансите на погледите се користи командата `EXPLAIN ANALYZE`, со која се добива времето на извршување и начинот на кој базата го извршува пребарувањето. |
| | 358 | |
| | 359 | Пример: |
| | 360 | |
| | 361 | {{{#!sql |
| | 362 | EXPLAIN ANALYZE |
| | 363 | SELECT * FROM vw_member_financial_summary; |
| | 364 | }}} |
| | 365 | |
| | 366 | Дополнително, за подобрување на перформансите може да се користат индекси на колоните кои често се користат во `JOIN`, `WHERE` и `GROUP BY` услови. |
| | 367 | |
| | 368 | Пример: |
| | 369 | |
| | 370 | {{{#!sql |
| | 371 | CREATE INDEX idx_borrowing_membership |
| | 372 | ON borrowing(membership_id); |
| | 373 | }}} |
| | 374 | |
| | 375 | '''Објаснување:''' |
| | 376 | Овој индекс се користи за побрзо поврзување на табелата `borrowing` со други табели преку колоната `membership_id`. |
| | 377 | Индексите помагаат да се намали времето на пребарување, особено кога табелите содржат голем број записи. |
| | 378 | |
| | 379 | --- |
| | 380 | |
| | 381 | == Заклучок == |
| | 382 | |
| | 383 | Креираните SQL views овозможуваат поедноставен и поорганизиран пристап до податоците во библиотечниот систем. |
| | 384 | Тие ја поддржуваат главната бизнис логика на апликацијата, како што се следење на достапност на книги, резервации, задоцнети книги, финансиски обврски на членови, историја на позајмувања и анализа на популарност на книги. |
| | 385 | Со користење на овие погледи, системот станува појасен, полесен за одржување и попрактичен за генерирање извештаи. |