Changes between Version 2 and Version 3 of DatabaseProgramming


Ignore:
Timestamp:
05/26/26 15:05:23 (26 hours ago)
Author:
231511
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v2 v3  
    6326328. **Заклучок:** 
    633633`trg_researcher_access_project_match` обезбедува логичка конзистентност помеѓу истражувачките барања, предметите и конзерваторските проекти. Овој тригер спречува сериозни грешки во пристапот и ја зајакнува безбедноста и точноста на системот.
     634= Функции =
     635
     636
     637=== Функција 1: Ажурирање на наслов на археолошки предмет (update_object_title) ===
     638
     6391. **Намена:** 
     640Функцијата `update_object_title` е наменета за контролирано ажурирање на насловот на археолошки предмет во табелата `Objects`. Нејзината основна цел е да овозможи промена на називот на предметот, но само доколку новиот наслов е валиден и не е празен.
     641
     6422. **Случај на употреба:** 
     643Во системот за управување со културно-археолошко наследство, насловот на предметот претставува еден од најважните идентификациски податоци. При каталогизација или дополнителна научна обработка може да се утврди дека претходниот назив на предметот не е доволно прецизен, па е потребно негово ажурирање.
     644
     645На пример, предмет кој првично бил внесен како „Фрагмент“ подоцна може да биде прецизно идентификуван како „Керамички фрагмент од амфора“.
     646
     6473. **Причина за употреба на функција:** 
     648Избрана е функција наместо директен `UPDATE` затоа што е потребна дополнителна валидација пред да се изврши промената. Функцијата проверува дали новиот наслов е `NULL` или празен текст. Доколку е празен, операцијата се прекинува.
     649
     650Со ова се спречува внесување невалидни или бескорисни вредности во едно од клучните полиња на табелата `Objects`.
     651
     6524. **Имплементација:** 
     653
     654Функцијата прима два параметри:
     655
     656 * `obj_id` – идентификатор на предметот кој треба да се ажурира
     657 * `new_title` – новиот наслов на предметот
     658
     659Валидацијата се врши со:
     660
     661{{{
     662IF new_title IS NULL OR LENGTH(TRIM(new_title)) = 0 THEN
     663    RAISE EXCEPTION 'Насловот не смее да биде празен.';
     664END IF;
     665}}}
     666
     667Потоа се извршува ажурирање:
     668
     669{{{
     670UPDATE Objects
     671SET title = new_title
     672WHERE object_id = obj_id;
     673}}}
     674
     675Доколку не е пронајден предмет со дадениот ID, функцијата враќа грешка:
     676
     677{{{
     678RAISE EXCEPTION 'Објект со ID % не е пронајден.', obj_id;
     679}}}
     680
     6815. **Логика на работа:** 
     682Функцијата најпрво ја валидира новата вредност, потоа го ажурира предметот и на крај проверува дали навистина бил пронајден запис за ажурирање. На овој начин се покриваат две можни грешки:
     683
     684 * празен или невалиден наслов
     685 * непостоечки предмет
     686
     6876. **Бизнис логика:** 
     688Оваа функција ја имплементира потребата за точна и контролирана музејска евиденција. Во систем каде предметите се користат во изложби, публикации, конзерваторски проекти и истражувачки пристапи, насловот мора да биде валиден и јасен.
     689
     690Без оваа функција, би можело да се внесе празен назив, што би довело до проблеми во каталогизацијата, пребарувањето и прикажувањето на предметите во апликацијата.
     691
     6927. **Пример на употреба:**
     693
     694{{{
     695SELECT update_object_title(
     696    100,
     697    'Ажуриран археолошки предмет'
     698);
     699}}}
     700
     7018. **Заклучок:** 
     702`update_object_title` овозможува безбедно и контролирано ажурирање на насловите на археолошките предмети. Таа ја подобрува точноста на податоците и спречува внесување невалидни вредности во основниот каталог на предмети.
     703
     704
     705
     706=== Функција 2: Додавање нов археолошки локалитет (add_site) ===
     707
     7081. **Намена:** 
     709Функцијата `add_site` е наменета за внесување нов археолошки локалитет во табелата `Sites`. Нејзината цел е да овозможи стандардизиран внес на локалитет со сите основни географски, административни и описни информации.
     710
     7112. **Случај на употреба:** 
     712Кога археолозите или институциите откриваат или документираат нов локалитет, потребно е тој да биде внесен во системот со податоци за тип на локалитет, регион, година на откривање, заштитен статус, координати, општина и опис.
     713
     714Ова е основен чекор во системот, бидејќи предметите и фрагментите понатаму се поврзуваат со конкретен локалитет.
     715
     7163. **Причина за употреба на функција:** 
     717Избрана е функција за да се централизира внесувањето на локалитети и да се избегне директно пишување `INSERT` прашалници во апликацијата. Со тоа се добива појасен и поконтролиран начин на додавање нови археолошки локации.
     718
     719Дополнително, табелата `Sites` веќе содржи ограничувања за координати, странски клучеви и уникатност, а функцијата го користи тој модел за да внесе само структурирани податоци.
     720
     7214. **Имплементација:** 
     722
     723Функцијата прима:
     724
     725 * `p_name` – име на локалитет
     726 * `p_site_type_id` – тип на локалитет
     727 * `p_region_id` – регион
     728 * `p_year` – година на откривање
     729 * `p_protection_status_id` – заштитен статус
     730 * `p_latitude` – географска ширина
     731 * `p_longitude` – географска должина
     732 * `p_municipality_id` – општина
     733 * `p_description` – опис на локалитетот
     734
     735Функцијата внесува запис во `Sites`:
     736
     737{{{
     738INSERT INTO Sites(
     739    site_name,
     740    site_type_id,
     741    region_id,
     742    discovery_year,
     743    protection_status_id,
     744    latitude,
     745    longitude,
     746    municipality_id,
     747    description
     748)
     749VALUES (...);
     750}}}
     751
     7525. **Логика на работа:** 
     753Функцијата ги зема параметрите добиени од корисникот или апликацијата и ги внесува во табелата `Sites`. Дополнителните проверки за валидност на регионот, типот, статусот и координатите се обезбедуваат преку constraints дефинирани во самата табела.
     754
     7556. **Бизнис логика:** 
     756Оваа функција ја поддржува основната функционалност за евиденција на археолошки локалитети. Бидејќи секој предмет и фрагмент мора да има археолошки контекст, правилното внесување на локалитети е клучно за целиот систем.
     757
     758Локалитетот не е само географска точка, туку претставува основа за:
     759 * поврзување на предмети
     760 * поврзување на фрагменти
     761 * анализа по региони
     762 * следење на заштитени културни добра
     763 * планирање на идни истражувања
     764
     7657. **Пример на употреба:**
     766
     767{{{
     768SELECT add_site(
     769    'Градиште - Нов локалитет',
     770    1,
     771    1,
     772    2024,
     773    1,
     774    41.995000,
     775    21.431000,
     776    1,
     777    'Нов археолошки локалитет со остатоци од антички период.'
     778);
     779}}}
     780
     7818. **Заклучок:** 
     782`add_site` овозможува стандардизиран внес на археолошки локалитети и ја поддржува основната структура на системот. Со неа се обезбедува локалитетите да се внесуваат на контролиран начин и да бидат подготвени за поврзување со предмети, фрагменти и институционални анализи.
     783
     784
     785
     786=== Функција 3: Проверка дали предмет е достапен за работа (is_object_available) ===
     787
     7881. **Намена:** 
     789Функцијата `is_object_available` е наменета за проверка дали одреден археолошки предмет е достапен за конзерваторска или реставраторска работа.
     790
     7912. **Случај на употреба:** 
     792Во системот, предметите можат да имаат различни статуси. Некои предмети можат да бидат изложени, депонирани или веќе да се наоѓаат на конзервација. Пред да се внесе нов третман, потребно е да се провери дали предметот е во состојба која дозволува дополнителна обработка.
     793
     794Оваа функција директно се користи од процедурата `add_treatment`.
     795
     7963. **Причина за употреба на функција:** 
     797Избрана е функција затоа што проверката дали предметот е достапен може да се користи на повеќе места во системот. Наместо истата логика да се повторува во повеќе процедури или апликациски функции, таа е централизирана во една database функција.
     798
     7994. **Имплементација:** 
     800
     801Функцијата прима:
     802
     803 * `p_object_id` – идентификатор на предметот
     804
     805Најпрво го чита тековниот статус:
     806
     807{{{
     808SELECT current_status_id
     809INTO v_status
     810FROM Objects
     811WHERE object_id = p_object_id;
     812}}}
     813
     814Ако предметот не постои:
     815
     816{{{
     817IF NOT FOUND THEN
     818    RETURN FALSE;
     819END IF;
     820}}}
     821
     822Ако статусот е 3:
     823
     824{{{
     825IF v_status = 3 THEN
     826    RETURN FALSE;
     827END IF;
     828}}}
     829
     830Во спротивно враќа:
     831
     832{{{
     833RETURN TRUE;
     834}}}
     835
     8365. **Логика на работа:** 
     837Функцијата враќа `BOOLEAN` вредност:
     838
     839 * `TRUE` – предметот е достапен за работа
     840 * `FALSE` – предметот не постои или не е достапен
     841
     842Статусот `3` во системот се користи за предмети кои се „На конзервација“, односно веќе се во процес на обработка и не треба паралелно да се отвора нов третман.
     843
     8446. **Бизнис логика:** 
     845Оваа функција ја имплементира контролата на конзерваторскиот workflow. Во реален музејски контекст, не смее ист предмет неконтролирано да се обработува повеќепати или да се внесе третман врз предмет кој веќе е во активна конзервација.
     846
     847Со ова се спречува:
     848 * дуплирање третмани
     849 * паралелна обработка на ист предмет
     850 * неконзистентна документација
     851 * погрешно планирање на конзерваторски активности
     852
     8537. **Пример на употреба:**
     854
     855{{{
     856SELECT is_object_available(804822);
     857}}}
     858
     8598. **Заклучок:** 
     860`is_object_available` е клучна помошна функција за проверка на достапноста на предметите. Таа обезбедува правилна контрола на третманите и ја спречува апликацијата да дозволи невалидни конзерваторски операции.
     861
     862
     863
     864=== Функција 4: Додавање третман и автоматски лог на извршител (add_treatment) ===
     865
     8661. **Намена:** 
     867Функцијата `add_treatment` е наменета за додавање нов конзерваторски третман врз археолошки предмет и автоматско креирање почетен запис во `Treatment_Step_Log`.
     868
     8692. **Случај на употреба:** 
     870Кога конзерватор започнува третман врз предмет, не е доволно само да се внесе запис во `Treatments`. Потребно е и да се документира кој корисник ја започнал интервенцијата и да се креира почетен чекор во дневникот на третманот.
     871
     872Ова е важно за следење на одговорност, историја на интервенции и професионална документација.
     873
     8743. **Причина за употреба на функција:** 
     875Избрана е функција затоа што операцијата вклучува повеќе чекори:
     876
     877 * проверка дали предметот постои
     878 * внесување нов третман во `Treatments`
     879 * земање на новиот `treatment_id`
     880 * внесување почетен лог во `Treatment_Step_Log`
     881
     882Ова не може ефикасно и безбедно да се изведе со еден обичен `INSERT`.
     883
     8844. **Имплементација:** 
     885
     886Функцијата прима:
     887
     888 * `p_object_id`
     889 * `p_description`
     890 * `p_user_id`
     891
     892Прво проверува дали предметот постои:
     893
     894{{{
     895IF NOT EXISTS (
     896    SELECT 1 FROM Objects WHERE object_id = p_object_id
     897) THEN
     898    RAISE EXCEPTION 'Објектот не постои';
     899END IF;
     900}}}
     901
     902Потоа внесува третман:
     903
     904{{{
     905INSERT INTO Treatments(object_id, treatment_date, description)
     906VALUES (p_object_id, CURRENT_DATE, p_description)
     907RETURNING treatment_id INTO v_treatment_id;
     908}}}
     909
     910Потоа внесува почетен чекор:
     911
     912{{{
     913INSERT INTO Treatment_Step_Log(
     914    treatment_id,
     915    step_number,
     916    step_description,
     917    performed_by_user
     918)
     919VALUES (
     920    v_treatment_id,
     921    1,
     922    'Initial treatment',
     923    p_user_id
     924);
     925}}}
     926
     9275. **Логика на работа:** 
     928Функцијата работи како автоматизиран workflow за започнување третман. Откако ќе се внесе третманот, веднаш се креира и првиот чекор во дневникот на третманот.
     929
     930Со ова се обезбедува секој третман да има почетна документација и поврзан корисник.
     931
     9326. **Бизнис логика:** 
     933Во систем за културно наследство, секоја реставраторска интервенција мора да биде документирана. Не е доволно да се знае дека третман постои; мора да се знае и кој го започнал и кога.
     934
     935Оваа функција обезбедува:
     936 * трага на одговорност
     937 * почетна документација за третман
     938 * поврзување на третманот со корисник
     939 * намалување на човечки грешки при внесување
     940
     9417. **Пример на употреба:**
     942
     943{{{
     944SELECT add_treatment(
     945    804822,
     946    'Механичко чистење на површински наслој',
     947    10
     948);
     949}}}
     950
     9518. **Заклучок:** 
     952`add_treatment` е важна функција за автоматизирање на конзерваторскиот процес. Таа овозможува третманот и неговиот почетен лог да се креираат заедно, што ја подобрува точноста и комплетноста на документацијата.
     953
     954
     955
     956=== Функција 5: Проверка на истражувачки пристап (has_access) ===
     957
     9581. **Намена:** 
     959Функцијата `has_access` е наменета за проверка дали одреден корисник има одобрен пристап до конкретен археолошки предмет.
     960
     9612. **Случај на употреба:** 
     962Во системот, истражувачите не треба автоматски да имаат пристап до сите предмети. Пристапот се контролира преку табелата `Researcher_Access`, каде за секој корисник, предмет и институција се чува статусот на барањето.
     963
     964Оваа функција се користи кога апликацијата треба да одлучи дали да му дозволи на корисникот да гледа или обработува информации за конкретен предмет.
     965
     9663. **Причина за употреба на функција:** 
     967Избрана е функција затоа што проверката на пристап е логика која може често да се користи во апликацијата. Наместо секојпат да се пишува ист `SELECT EXISTS`, логиката е централизирана во една функција.
     968
     9694. **Имплементација:** 
     970
     971Функцијата прима:
     972
     973 * `p_user_id`
     974 * `p_object_id`
     975
     976Проверува дали постои запис во `Researcher_Access` со:
     977
     978 * ист корисник
     979 * ист предмет
     980 * статус `access_status_id = 6`
     981
     982{{{
     983RETURN EXISTS (
     984    SELECT 1
     985    FROM Researcher_Access
     986    WHERE user_id = p_user_id
     987      AND object_id = p_object_id
     988      AND access_status_id = 6
     989);
     990}}}
     991
     9925. **Логика на работа:** 
     993Функцијата враќа:
     994
     995 * `TRUE` ако корисникот има одобрен пристап
     996 * `FALSE` ако нема одобрен пристап
     997
     998Статусот `6` се користи за „Одобрено“.
     999
     10006. **Бизнис логика:** 
     1001Оваа функција ја имплементира контролата на пристап до чувствителни археолошки информации. Кај културното наследство, податоците за предметите може да бидат ограничени поради научна вредност, безбедност, институционална сопственост или заштитен статус.
     1002
     1003Со оваа функција системот може лесно да провери дали корисникот има право да работи со предметот.
     1004
     10057. **Пример на употреба:**
     1006
     1007{{{
     1008SELECT has_access(
     1009    10,
     1010    804822
     1011);
     1012}}}
     1013
     10148. **Заклучок:** 
     1015`has_access` претставува важна безбедносна функција која овозможува контролиран пристап до предметите. Таа ја централизира логиката за дозволи и ја поедноставува имплементацијата во апликацијата.
     1016
     1017
     1018
     1019=== Функција 6: Броење автори по публикација (count_authors) ===
     1020
     10211. **Намена:** 
     1022Функцијата `count_authors` е наменета за пресметување на бројот на автори поврзани со одредена научна публикација.
     1023
     10242. **Случај на употреба:** 
     1025Во системот, публикациите можат да имаат повеќе автори. Релацијата помеѓу публикации и автори е реализирана преку табелата `Publication_Authors`.
     1026
     1027При библиографски преглед, извештаи или валидација, може да биде потребно да се знае колку автори има една публикација.
     1028
     10293. **Причина за употреба на функција:** 
     1030Избрана е функција затоа што ова е едноставна, но често корисна агрегатна операција. Наместо апликацијата постојано да извршува `COUNT(*)` врз junction табелата, логиката се централизира во база.
     1031
     10324. **Имплементација:** 
     1033
     1034Функцијата прима:
     1035
     1036 * `p_publication_id`
     1037
     1038Потоа го брои бројот на записи:
     1039
     1040{{{
     1041SELECT COUNT(*)
     1042INTO v_count
     1043FROM Publication_Authors
     1044WHERE publication_id = p_publication_id;
     1045}}}
     1046
     1047и го враќа резултатот.
     1048
     10495. **Логика на работа:** 
     1050Функцијата пребарува колку автори се поврзани со дадена публикација преку `publication_id`.
     1051
     1052Резултатот е цел број (`INT`).
     1053
     10546. **Бизнис логика:** 
     1055Оваа функција ја поддржува научната и библиографската евиденција. Во археолошки контекст, публикациите често се резултат на тимска работа, па бројот на автори е важен за:
     1056
     1057 * библиографски извештаи
     1058 * проверка на авторство
     1059 * академска статистика
     1060 * прикажување детали за публикации
     1061
     10627. **Пример на употреба:**
     1063
     1064{{{
     1065SELECT count_authors(100);
     1066}}}
     1067
     10688. **Заклучок:** 
     1069`count_authors` овозможува едноставна и централизирана пресметка на бројот на автори за публикација. Таа ја поддржува научната евиденција и ја поедноставува работата со библиографски податоци.
     1070
     1071
     1072
     1073=== Функција 7: Автоматска проценка на важност на предмет (object_importance) ===
     1074
     10751. **Намена:** 
     1076Функцијата `object_importance` е наменета за автоматска пресметка на индикатор за важност на археолошки предмет.
     1077
     10782. **Случај на употреба:** 
     1079Во системот, некои предмети имаат поголема институционална или научна важност од други. Предмет кој има повеќе третмани и се појавува во повеќе научни публикации може да се смета за поважен, бидејќи е повеќе истражуван, документиран или конзерваторски значаен.
     1080
     10813. **Причина за употреба на функција:** 
     1082Избрана е функција затоа што важноста на предметот не е директно поле во табелата `Objects`, туку се пресметува врз основа на поврзани податоци од други табели:
     1083
     1084 * `Treatments`
     1085 * `Object_Publication`
     1086
     1087Функцијата овозможува оваа пресметка да се изврши динамички кога е потребно.
     1088
     10894. **Имплементација:** 
     1090
     1091Функцијата прима:
     1092
     1093 * `p_object_id`
     1094
     1095Прво го брои бројот на третмани:
     1096
     1097{{{
     1098SELECT COUNT(*) INTO v_treatments
     1099FROM Treatments
     1100WHERE object_id = p_object_id;
     1101}}}
     1102
     1103Потоа го брои бројот на публикации:
     1104
     1105{{{
     1106SELECT COUNT(*) INTO v_publications
     1107FROM Object_Publication
     1108WHERE object_id = p_object_id;
     1109}}}
     1110
     1111На крај враќа пресметана вредност:
     1112
     1113{{{
     1114RETURN (v_treatments * 2) + (v_publications * 3);
     1115}}}
     1116
     11175. **Логика на работа:** 
     1118Функцијата користи тежинска формула:
     1119
     1120 * секој третман носи 2 поени
     1121 * секоја публикација носи 3 поени
     1122
     1123Публикациите имаат поголема тежина бидејќи укажуваат на научна обработка и истражувачка вредност на предметот.
     1124
     11256. **Бизнис логика:** 
     1126Оваа функција ја имплементира потребата од приоритизација на предмети. Во музејски и археолошки системи, институциите често треба да одлучат кои предмети се поважни за:
     1127
     1128 * понатамошна конзервација
     1129 * дигитализација
     1130 * изложување
     1131 * научна обработка
     1132 * институционални извештаи
     1133
     1134Со оваа функција може автоматски да се пресмета релативна важност на предметот според неговата историја на третмани и публикации.
     1135
     11367. **Пример на употреба:**
     1137
     1138{{{
     1139SELECT object_importance(804822);
     1140}}}
     1141
     11428. **Заклучок:** 
     1143`object_importance` обезбедува едноставен механизам за проценка на значајноста на археолошките предмети. Таа помага при анализа и приоритизација на културното наследство врз основа на реални податоци од системот.
     1144
     1145
     1146
     1147=== Функција 8: Приказ на основни детали за предмет (find_object_details) ===
     1148
     11491. **Намена:** 
     1150Функцијата `find_object_details` е наменета за враќање основни информации за конкретен археолошки предмет.
     1151
     11522. **Случај на употреба:** 
     1153Кога корисникот пребарува предмет во системот, често е потребно брзо да се прикажат основните детали: насловот на предметот, кој го пронашол и на кој локалитет е пронајден.
     1154
     1155Оваа функција овозможува таков краток и структуриран приказ.
     1156
     11573. **Причина за употреба на функција:** 
     1158Избрана е функција затоа што ги обединува податоците од повеќе табели во еден повик:
     1159
     1160 * `Objects`
     1161 * `Users`
     1162 * `Sites`
     1163
     1164Наместо апликацијата секојпат да пишува `JOIN` прашалник, функцијата обезбедува повторно употреблива логика.
     1165
     11664. **Имплементација:** 
     1167
     1168Функцијата прима:
     1169
     1170 * `p_object_id`
     1171
     1172Враќа табела со следните полиња:
     1173
     1174 * `object_id`
     1175 * `title`
     1176 * `found_by`
     1177 * `site_name`
     1178
     1179Имплементацијата користи:
     1180
     1181{{{
     1182LEFT JOIN Users u ON o.found_by_user_id = u.user_id
     1183JOIN Sites s ON o.site_id = s.site_id
     1184}}}
     1185
     1186`LEFT JOIN` со `Users` е важен затоа што предметот може да нема внесен корисник кој го пронашол, но сепак треба да се прикаже.
     1187
     11885. **Логика на работа:** 
     1189Функцијата пребарува предмет според неговиот `object_id` и враќа комбиниран резултат со информации од поврзаните табели.
     1190
     11916. **Бизнис логика:** 
     1192Оваа функција ја поддржува основната навигација и пребарување во системот. Во контекст на културно наследство, секој предмет мора да биде разгледуван заедно со неговиот археолошки контекст.
     1193
     1194Затоа е важно за предметот веднаш да се знае:
     1195
     1196 * кој е предметот
     1197 * каде е пронајден
     1198 * кој го евидентирал или пронашол
     1199
     12007. **Пример на употреба:**
     1201
     1202{{{
     1203SELECT *
     1204FROM find_object_details(804822);
     1205}}}
     1206
     12078. **Заклучок:** 
     1208`find_object_details` овозможува брз и јасен приказ на основни информации за археолошки предмет. Таа ја поедноставува апликациската логика и овозможува подобро поврзување на предметите со нивниот локалитет и корисничка евиденција.