Changes between Initial Version and Version 1 of QueryOptimization


Ignore:
Timestamp:
05/29/26 18:20:46 (3 weeks ago)
Author:
231101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v1 v1  
     1== SQL Views во системот за библиотека ==
     2
     3Во овој дел се прикажани SQL погледите кои се користат во системот за управување со библиотека.
     4Секој поглед е креиран со цел да прикаже одредени податоци на поорганизиран начин и да ја олесни работата со книгите, членовите, позајмувањата, резервациите и финансиските информации.
     5
     6---
     7
     8=== 1. View: vw_books_in_library ===
     9
     10{{{#!sql
     11CREATE OR REPLACE VIEW vw_books_in_library AS
     12SELECT
     13b.book_id,
     14b.title,
     15COUNT(bc.copy_id) AS book_copy_count,
     16
     17```
     18CASE
     19    WHEN COUNT(CASE WHEN bc.available = 1 THEN 1 END) > 0
     20    THEN 'Available'
     21    ELSE 'Not Available'
     22END AS availability_status
     23```
     24
     25FROM book b
     26LEFT JOIN bookcopy bc
     27ON b.book_id = bc.book_id
     28GROUP 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
     44CREATE OR REPLACE VIEW vw_member_financial_summary AS
     45SELECT
     46m.member_id,
     47m.first_name,
     48m.last_name,
     49
     50```
     51COALESCE(fee_sum.total_fees, 0) AS total_fees,
     52COALESCE(fine_sum.total_fines, 0) AS total_fines,
     53
     54COALESCE(fee_sum.total_fees, 0) + COALESCE(fine_sum.total_fines, 0) AS total_due
     55```
     56
     57FROM Member m
     58
     59LEFT JOIN (
     60SELECT
     61mb.member_id,
     62SUM(f.amount) AS total_fees
     63FROM Fee f
     64JOIN Membership mb
     65ON mb.membership_id = f.membership_id
     66GROUP BY mb.member_id
     67) fee_sum
     68ON fee_sum.member_id = m.member_id
     69
     70LEFT JOIN (
     71SELECT
     72mb.member_id,
     73SUM(f.amount) AS total_fines
     74FROM Fine f
     75JOIN Borrowing b
     76ON b.borrowing_id = f.borrowing_id
     77JOIN Membership mb
     78ON mb.membership_id = b.membership_id
     79GROUP BY mb.member_id
     80) fine_sum
     81ON 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
     98CREATE OR REPLACE VIEW vw_most_popular_books_per_month AS
     99SELECT *
     100FROM (
     101SELECT
     102b.book_id,
     103b.title,
     104DATE_TRUNC('month', br.borrow_date) AS month,
     105COUNT(*) AS total_borrowings,
     106RANK() OVER (
     107PARTITION BY DATE_TRUNC('month', br.borrow_date)
     108ORDER BY COUNT(*) DESC
     109) AS rnk
     110FROM borrowing br
     111JOIN book b ON br.book_id = b.book_id
     112GROUP BY b.book_id, b.title, DATE_TRUNC('month', br.borrow_date)
     113) sub
     114WHERE 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
     130CREATE OR REPLACE VIEW vw_reservations AS
     131SELECT
     132r.reservation_id,
     133r.member_id,
     134m.first_name,
     135m.last_name,
     136r.book_id,
     137b.title,
     138r.requested_date,
     139r.expected_date,
     140r.status
     141FROM reservation r
     142JOIN member m ON r.member_id = m.member_id
     143JOIN 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
     159CREATE OR REPLACE VIEW vw_overdue_books AS
     160SELECT
     161m.member_id,
     162m.first_name,
     163m.last_name,
     164b.title AS book_title,
     165br.due_date,
     166
     167```
     168CURRENT_DATE - br.due_date AS days_overdue
     169```
     170
     171FROM borrowing br
     172
     173JOIN member m
     174ON m.member_id = br.membership_id
     175
     176JOIN book b
     177ON b.book_id = br.book_id
     178
     179WHERE
     180br.return_date IS NULL
     181AND 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
     198CREATE OR REPLACE VIEW vw_low_stock_books AS
     199SELECT
     200b.book_id,
     201b.title,
     202
     203```
     204COUNT(DISTINCT bc.copy_id) AS total_copies,
     205
     206COUNT(DISTINCT CASE
     207    WHEN br.return_date IS NULL THEN bc.copy_id
     208END) 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
     217FROM book b
     218
     219JOIN bookcopy bc
     220ON b.book_id = bc.book_id
     221
     222LEFT JOIN borrowing br
     223ON bc.copy_id = br.copy_id
     224
     225GROUP BY
     226b.book_id, b.title
     227
     228HAVING
     229(COUNT(DISTINCT bc.copy_id)
     230- COUNT(DISTINCT CASE
     231WHEN br.return_date IS NULL THEN bc.copy_id
     232END)
     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
     250CREATE OR REPLACE VIEW vw_member_borrowing_history AS
     251SELECT
     252m.member_id,
     253m.first_name,
     254m.last_name,
     255b.title,
     256br.borrow_date,
     257br.return_date,
     258br.due_date,
     259br.return_status
     260FROM borrowing br
     261JOIN member m ON m.member_id = br.membership_id
     262JOIN 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
     278CREATE OR REPLACE VIEW vw_book_catalog AS
     279SELECT
     280b.book_id,
     281b.title,
     282b.isbn,
     283p.name AS publisher,
     284
     285```
     286STRING_AGG(DISTINCT a.first_name || ' ' || a.last_name, ', ') AS authors,
     287
     288STRING_AGG(DISTINCT g.name, ', ') AS genres,
     289
     290STRING_AGG(DISTINCT l.name, ', ') AS languages
     291```
     292
     293FROM Book b
     294
     295LEFT JOIN Publisher p
     296ON b.publisher_id = p.publisher_id
     297
     298LEFT JOIN Author_Book ab
     299ON b.book_id = ab.book_id
     300
     301LEFT JOIN Author a
     302ON ab.author_id = a.author_id
     303
     304LEFT JOIN BookGenre bg
     305ON b.book_id = bg.book_id
     306
     307LEFT JOIN Genre g
     308ON bg.genre_id = g.genre_id
     309
     310LEFT JOIN BookLanguages bl
     311ON b.book_id = bl.book_id
     312
     313LEFT JOIN Language l
     314ON bl.language_id = l.language_id
     315
     316GROUP BY
     317b.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
     334CREATE OR REPLACE VIEW vw_damaged_books AS
     335SELECT
     336b.book_id,
     337b.title,
     338bc.copy_id
     339FROM book b
     340JOIN bookcopy bc ON b.book_id = bc.book_id
     341WHERE 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
     362EXPLAIN ANALYZE
     363SELECT * FROM vw_member_financial_summary;
     364}}}
     365
     366Дополнително, за подобрување на перформансите може да се користат индекси на колоните кои често се користат во `JOIN`, `WHERE` и `GROUP BY` услови.
     367
     368Пример:
     369
     370{{{#!sql
     371CREATE INDEX idx_borrowing_membership
     372ON borrowing(membership_id);
     373}}}
     374
     375'''Објаснување:'''
     376Овој индекс се користи за побрзо поврзување на табелата `borrowing` со други табели преку колоната `membership_id`.
     377Индексите помагаат да се намали времето на пребарување, особено кога табелите содржат голем број записи.
     378
     379---
     380
     381== Заклучок ==
     382
     383Креираните SQL views овозможуваат поедноставен и поорганизиран пристап до податоците во библиотечниот систем.
     384Тие ја поддржуваат главната бизнис логика на апликацијата, како што се следење на достапност на книги, резервации, задоцнети книги, финансиски обврски на членови, историја на позајмувања и анализа на популарност на книги.
     385Со користење на овие погледи, системот станува појасен, полесен за одржување и попрактичен за генерирање извештаи.