Changes between Initial Version and Version 1 of AdvancedDatabaseDevelopment


Ignore:
Timestamp:
09/25/26 04:35:22 (6 days ago)
Author:
223306
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment

    v1 v1  
     1= Advanced Database Development =
     2
     3Во оваа фаза се имплементирани напредни механизми на ниво на базата на податоци за одржување на конзистентноста на податоците и за обезбедување дополнителни аналитички информации во системот !BiblioPremium.
     4
     5Имплементацијата вклучува тригер функција, тригер и поглед (VIEW).
     6
     7== Автоматска проверка и намалување на залихата при завршување на нарачка ==
     8
     9=== Data requirements description ===
     10
     11При завршување на нарачка потребно е системот автоматски да провери дали има доволно примероци на залиха за сите книги што се наоѓаат во нарачката.
     12
     13Нарачката не смее да премине во статус ''ZAVRSENA'' доколку за некоја од книгите нема доволно примероци на залиха.
     14
     15Доколку има доволно залиха за сите ставки, количината на залиха на секоја книга автоматски се намалува за количината што е нарачана.
     16
     17Ова правило се имплементира на ниво на базата на податоци со тригер, со што проверката важи независно од тоа од каде е направена промената на статусот на нарачката.
     18
     19=== Trigger function ===
     20
     21Креирана е функцијата ''project.proveri_i_namali_zaliha()''.
     22
     23{{{
     24CREATE OR REPLACE FUNCTION project.proveri_i_namali_zaliha()
     25RETURNS TRIGGER
     26LANGUAGE plpgsql
     27AS $$
     28DECLARE
     29    stavka RECORD;
     30BEGIN
     31    IF OLD.status <> 'ZAVRSENA'
     32       AND NEW.status = 'ZAVRSENA' THEN
     33
     34        FOR stavka IN
     35            SELECT
     36                s.kniga_id,
     37                s.kolicina,
     38                k.naslov,
     39                k.kolicina_na_zaliha
     40            FROM project.sodrzi s
     41            JOIN project.knigi k
     42                ON s.kniga_id = k.kniga_id
     43            WHERE s.naracka_id = NEW.naracka_id
     44        LOOP
     45            IF stavka.kolicina_na_zaliha < stavka.kolicina THEN
     46                RAISE EXCEPTION
     47                    'Нема доволно залиха за книгата "%". Достапно: %, потребно: %',
     48                    stavka.naslov,
     49                    stavka.kolicina_na_zaliha,
     50                    stavka.kolicina;
     51            END IF;
     52        END LOOP;
     53
     54        UPDATE project.knigi k
     55        SET kolicina_na_zaliha =
     56            k.kolicina_na_zaliha - s.kolicina
     57        FROM project.sodrzi s
     58        WHERE s.naracka_id = NEW.naracka_id
     59          AND k.kniga_id = s.kniga_id;
     60
     61    END IF;
     62
     63    RETURN NEW;
     64END;
     65$$;
     66}}}
     67
     68Функцијата прво ги проверува сите ставки од нарачката. Доколку барем една книга нема доволно залиха, се генерира исклучок и промената не се извршува.
     69
     70Само доколку сите ставки ја поминат проверката, се извршува намалување на залихата.
     71
     72=== Trigger ===
     73
     74Тригерот се активира пред промена на атрибутот ''status'' во релацијата ''naracki''.
     75
     76{{{
     77CREATE TRIGGER trg_proveri_i_namali_zaliha
     78BEFORE UPDATE OF status
     79ON project.naracki
     80FOR EACH ROW
     81EXECUTE FUNCTION project.proveri_i_namali_zaliha();
     82}}}
     83
     84Тригерот ја повикува функцијата при промена на статусот на нарачката. Самата функција ја извршува проверката и намалувањето само кога статусот преминува од статус различен од ''ZAVRSENA'' во ''ZAVRSENA''.
     85
     86=== Тестирање со доволна залиха ===
     87
     88За тестирање беше употребена нарачка која се наоѓаше во статус ''VO_OBRABOTKA''.
     89
     90Статусот беше променет со:
     91
     92{{{
     93UPDATE project.naracki
     94SET status = 'ZAVRSENA'
     95WHERE naracka_id = 4;
     96}}}
     97
     98Нарачката содржеше еден примерок од книгата ''Think and Grow Rich''. Пред завршувањето на нарачката книгата имаше 11 примероци на залиха.
     99
     100По успешно завршување на нарачката, залихата автоматски беше намалена на 10 примероци.
     101
     102Со ова е потврдено дека тригерот правилно ја намалува залихата при успешно завршување на нарачката.
     103
     104=== Тестирање со недоволна залиха ===
     105
     106За проверка на ограничувањето беше поставена залиха 0 за книгата ''Atomic Habits'':
     107
     108{{{
     109UPDATE project.knigi
     110SET kolicina_na_zaliha = 0
     111WHERE kniga_id = 1;
     112}}}
     113
     114Потоа беше направен обид нарачката со идентификатор 5, која содржи еден примерок од оваа книга, да се постави во статус ''ZAVRSENA'':
     115
     116{{{
     117UPDATE project.naracki
     118SET status = 'ZAVRSENA'
     119WHERE naracka_id = 5;
     120}}}
     121
     122Базата на податоци ја одби операцијата и ја прикажа пораката:
     123
     124{{{
     125Нема доволно залиха за книгата "Atomic Habits". Достапно: 0, потребно: 1.
     126}}}
     127
     128Со ова е потврдено дека нарачка не може да биде означена како завршена доколку нема доволно залиха.
     129
     130По тестирањето, залихата на книгата беше вратена на претходната вредност:
     131
     132{{{
     133UPDATE project.knigi
     134SET kolicina_na_zaliha = 14
     135WHERE kniga_id = 1;
     136}}}
     137
     138== Аналитички поглед за продажба по книга ==
     139
     140=== Data requirements description ===
     141
     142За потребите на администраторот и аналитичките извештаи потребно е на едно место да бидат достапни основните информации за продажбата на секоја книга.
     143
     144Погледот треба да овозможи приказ на:
     145
     146- идентификатор и наслов на книгата;
     147- моментална количина на залиха;
     148- вкупен број на продадени примероци;
     149- вкупен приход;
     150- број на реализирани нарачки.
     151
     152За таа цел е креиран погледот ''project.v_prodazba_po_kniga''.
     153
     154=== View ===
     155
     156{{{
     157CREATE OR REPLACE VIEW project.v_prodazba_po_kniga AS
     158SELECT
     159    k.kniga_id,
     160    k.naslov,
     161    k.kolicina_na_zaliha,
     162    COALESCE(SUM(s.kolicina), 0) AS vkupno_prodadeni,
     163    COALESCE(
     164        SUM(s.kolicina * s.edinechna_cena),
     165        0
     166    ) AS vkupen_prihod,
     167    COUNT(DISTINCT n.naracka_id) AS broj_naracki
     168FROM project.knigi k
     169LEFT JOIN project.sodrzi s
     170    ON k.kniga_id = s.kniga_id
     171LEFT JOIN project.naracki n
     172    ON s.naracka_id = n.naracka_id
     173    AND n.status = 'ZAVRSENA'
     174WHERE n.naracka_id IS NOT NULL
     175   OR s.naracka_id IS NULL
     176GROUP BY
     177    k.kniga_id,
     178    k.naslov,
     179    k.kolicina_na_zaliha;
     180}}}
     181
     182Погледот ги обединува податоците од релациите ''knigi'', ''sodrzi'' и ''naracki'' и овозможува полесно добивање информации за продажбата.
     183
     184За книгите без продажба се добиваат вредности 0 за бројот на продадени примероци и приходот.
     185
     186=== Тестирање на погледот ===
     187
     188Погледот беше тестиран со:
     189
     190{{{
     191SELECT *
     192FROM project.v_prodazba_po_kniga
     193ORDER BY vkupen_prihod DESC;
     194}}}
     195
     196Тестирањето успешно ги прикажа книгите подредени според остварениот приход.
     197
     198На пример, во моменталните тест податоци ''Atomic Habits'' има најголем вкупен приход, а книгите за кои нема реализирана продажба се прикажуваат со вредност 0.
     199
     200== Заклучок ==
     201
     202Со имплементацијата на тригерот се обезбедува дополнителна конзистентност на податоците при обработката на нарачките. Базата автоматски спречува завршување на нарачка кога нема доволно залиха и автоматски ја намалува залихата кога нарачката успешно ќе се заврши.
     203
     204Со погледот ''v_prodazba_po_kniga'' се обезбедува повторно употреблив извор на агрегирани информации за продажбата и залихите, кој може да се користи за административни и аналитички потреби во !BiblioPremium.
     205
     206Овие механизми претставуваат дополнителна логика имплементирана директно во базата на податоци, над основните ограничувања и референцијалниот интегритет дефинирани во претходните фази.