Changes between Initial Version and Version 1 of DatabaseCreation


Ignore:
Timestamp:
06/15/26 03:28:28 (7 days ago)
Author:
231102
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseCreation

    v1 v1  
     1== Database Creation ==
     2
     3=== Опис ===
     4
     5Во оваа фаза релациониот модел дефиниран во претходните фази (види [attachment:AboutProject.txt AboutProject] и [attachment:RelationalModel.txt RelationalModel]) е имплементиран како физичка база на податоци.
     6Базата е креирана во '''PostgreSQL''' преку '''DDL''' скрипта која ја дефинира структурата (табели, ограничувања, индекси, погледи и програмски објекти), додека податоците се внесуваат преку посебна '''DML''' скрипта.
     7
     8Системот претставува централизиран информациски систем за високообразовни институции, организиран во седум функционални модули, секој означен со специфичен префикс на табелите. Структурата ја следи замислата за единствена точка на вистината (Single Source of Truth):
     9
     10 * '''Општи и основни податоци''' (без префикс) — лица, корисници и географски шифрарници
     11 * '''Организациска структура и инфраструктура''' (префикс '''or_''')
     12 * '''Човечки ресурси и кадар''' (префикс '''vr_''')
     13 * '''Студентски прашања и академски менаџмент''' (префикс '''sm_''')
     14 * '''Финансии, сметководство и плати''' (префикс '''fin_''')
     15 * '''Управување со документи''' (префикс '''dok_''')
     16 * '''Надворешни ентитети''' (префикс '''ent_''')
     17
     18'''Забелешка за консолидација:''' DDL скриптата и податоците беа изработувани паралелно на повеќе работни машини во рамки на тимот. Овој документ служи како консолидиран преглед на финалната структура и на постапката за внес на податоци.
     19
     20=== Технологија и конвенции ===
     21
     22 * '''РСУБП:''' PostgreSQL.
     23 * '''Модуларност:''' секоја табела припаѓа на модул означен со префикс (or_, vr_, sm_, fin_, dok_, ent_); табелите без префикс се заеднички и се референцирани од сите модули.
     24 * '''Примарни клучеви:''' секоја табела има суроген клуч `id int4` со вредност од секвенца (`nextval('<table>_id_seq')`).
     25 * '''Типови на податоци:''' `int4`, `varchar(255)` (и `varchar(2)`/`varchar(3)` за кодови), `numeric(14,2)` за пари, `numeric(5,2)`/`numeric(12,2)` за количини и норми, `timestamp(6)`, `date`, `bool`, `text`.
     26 * '''EAV модел:''' за динамични атрибути (по тип на организациска единица, студент, начин на наплата, документ темплејт) се користи Entity-Attribute-Value пристап преку парови табели `*_atributi` / `*_atributi_vrednosti`, со заеднички шифрарник `tip_atribut`.
     27 * '''Шифрарници:''' табелите со суфикс `_tip_*`, `_status_*` и сл. чуваат енумерации (код + име) и се пополнуваат прво.
     28
     29=== Содржина на DDL скриптата ===
     30
     31Скриптата `idontknow_script.sql` дефинира:
     32
     33 * '''119 табели''' — со примарни клучеви и `unique` ограничувања таму каде е потребно (на пр. кодови, кратенки, индекси).
     34 * '''11 индекси''' — секундарни (B-tree) индекси за чести пребарувања (на пр. `idx_korisnici_username`, `idx_studenti_indeks`, индекси по `user_id` за финансиските табели).
     35 * '''9 погледи (views)''' — означени со префикс `vw_`.
     36 * '''9 програмски рутини''' — 3 функции (`fn_`), 3 процедури (`pr_`) и 3 trigger функции (`trgf_`).
     37
     38'''Забелешка за опфатот на скриптата (важно при обнова на системот):'''
     39
     40 * Скриптата '''не содржи foreign key ограничувања''' — релациите помеѓу табелите се изведени преку колоните `*_id`, но референцијалниот интегритет не е наметнат на ниво на база.
     41 * Секвенците (`*_id_seq`) се референцирани преку `nextval(...)`, но '''нивните `CREATE SEQUENCE` дефиниции не се дел од оваа скрипта''' (се креираат посебно или од ORM-от).
     42 * Дефинирани се trigger '''функциите''' (`trgf_`), но '''нема `CREATE TRIGGER` врзувања''' во скриптата — врзувањето на функциите за табелите се прави одделно.
     43 * Скриптата '''не содржи `INSERT`''' наредби — внесот на податоци е целосно одвоен во DML скриптата (види подолу).
     44
     45=== Модули и табели ===
     46
     47==== 1. Општи и основни податоци (без префикс) ====
     48Основа на системот, референцирана од сите модули.
     49 * `lice` — централен регистар на сите физички лица (студенти, кадар, надворешни соработници), спречува дуплирање
     50 * `korisnici` — кориснички сметки за најава, врзани за `lice`
     51 * `drzavi`, `gradovi` — географски шифрарници
     52 * `tip_atribut` — заеднички шифрарник на типови атрибути за сите EAV модули
     53
     54==== 2. Организациска структура и инфраструктура (or_) ====
     55 * `or_organizaciona_edinica` — рекурзивна хиерархија на институцијата (`oe_id` покажува кон истата табела)
     56 * `or_tipovi_organizaciona_edinica`, `or_tipovi_organizaciona_edinica_atributi` — типови ОЕ и нивни EAV дефиниции
     57 * `or_organizaciona_edinica_atributi_vrednosti` — EAV вредности по ОЕ
     58 * `or_organizaciona_edinica_smetki` — врска ОЕ ↔ трансакциски сметки
     59 * `or_mapa_objekt`, `or_tip_mapa_objekt` — просторни објекти (просторните податоци се чуваат во `spatial_tekst` од тип `text`)
     60 * `or_mapa_objekt_organizacija`, `or_tip_objekt_organizacija` — мапирање на згради/простории кон ОЕ
     61
     62==== 3. Човечки ресурси и кадар (vr_) ====
     63 * `vr_vraboten_angazman` — централен ангажман: лице ↔ ОЕ ↔ позиција ↔ тип ангажман ↔ FTE (можни повеќе паралелни ангажмани)
     64 * `vr_rabota_pozicija` — работни позиции
     65 * `vr_pozicija_preduslov_grupa`, `vr_pozicija_preduslov` — логички предуслови за позиција (AND/OR)
     66 * `vr_lice_kvalifikacija` — квалификации/дипломи на лице
     67 * `vr_vid_kvalifikacija`, `vr_pole_kvalifikacija`, `vr_akademski_stepen` — шифрарници за квалификации
     68 * `vr_akademsko_zvanje`, `vr_vraboten_akademsko_zvanje` — академски звања и нивна историја
     69 * `vr_vraboten_funkcija`, `vr_tip_funkcija` — мандатни функции (Декан, Продекан)
     70 * `vr_vraboten_organizaciona_uloga`, `vr_tip_organizaciona_uloga` — организациски улоги
     71 * `vr_vraboten_kompensacija` — основна (бруто/нето) плата по ангажман
     72 * `vr_status_vrabotenje`, `vr_tip_angazman`, `vr_tip_uloga_nastaven_kadar` — шифрарници
     73
     74==== 4. Студентски прашања и академски менаџмент (sm_) ====
     75 * `sm_akademska_godina`, `sm_akademski_semestar`, `sm_tip_akademski_semestar`, `sm_period_akademski_semestar` — приспособливо академско време (семестри/триместри/квартали)
     76 * `sm_akademski_semestar_smer_kvota`, `sm_tip_kvota` — квоти и наплата по семестар/смер
     77 * `sm_predmet` — апстрактен предмет
     78 * `sm_akreditacija`, `sm_akreditacija_fond`, `sm_tip_akreditacija`, `sm_status_akreditacija` — законска рамка на предметот (кредити, фонд часови)
     79 * `sm_akreditacija_predmet_grupa_preduslov`, `sm_akreditacija_predmet_preduslov` — предуслови за слушање предмет
     80 * `sm_akreditacisko_telo`, `sm_akreditacija_telo_clen`, `sm_tip_akreditacisko_telo`, `sm_tip_uloga_akreditacija_telo` — акредитациски тела и членови
     81 * `sm_smer`, `sm_smer_verzija`, `sm_tip_smer` — студиски програми (верзионирани)
     82 * `sm_smer_verzija_semestar`, `sm_smer_verzija_semestar_kurs` — структура на смер по семестри
     83 * `sm_smer_upis_grupa_preduslov`, `sm_smer_upis_preduslov` — предуслови за упис
     84 * `sm_smer_diplomiranje_grupa_preduslov`, `sm_smer_diplomiranje_preduslov` — предуслови за дипломирање
     85 * `sm_studenti`, `sm_studenti_smerovi` — студенти и нивни смерови
     86 * `sm_organizaciona_edinica_upis_pravilo`, `sm_upis_pravilo_brojac` — автоматско генерирање на индекс
     87 * `sm_organizaciona_edinica_student_atributi`, `sm_organizaciona_edinica_student_atributi_vrednosti` — EAV за студентски мета-податоци
     88 * `sm_kurs_realizacija`, `sm_kurs_realizacija_paralelka` — инстанцирање на акредитација во семестар и поделба на паралелки
     89 * `sm_kurs_realizacija_nastaven_kadar`, `sm_paralelka_nastaven_kadar` — алокација на наставен кадар
     90 * `sm_student_semestar_upis`, `sm_student_upisan_kurs` — упис на семестар и курсеви
     91 * `sm_ispitna_sesija`, `sm_student_ispit_prijava` — испитни сесии и пријави
     92 * `sm_sistem_ocenuvanje`, `sm_sistem_ocenuvanje_vrednost` — приспособлив систем на оценување (A–F, бодови, броен)
     93 * `sm_student_ocena_zapis` — траен запис на оценка
     94 * `sm_organizaciona_edinica_dostignuvanja`, `sm_tip_dostignuvanje`, `sm_student_dostignuvanje` — достигнувања (пракса, волонтерска работа, дипломски)
     95 * `sm_organizaciona_edinica_diplomirani` — евиденција на дипломирани
     96 * `sm_student_paralelka_raspredelba` — распределба на студент по паралелка
     97
     98==== 5. Финансии, сметководство и плати (fin_) ====
     99 * `fin_finansiska_obvrska`, `fin_finansiska_obvrska_stavka` — студентски обврски (оригинална/отворена сума, рати, ставки)
     100 * `fin_status_finansiska_obvrska` — статус на обврска (Izdadena, Delumno platena, Platena)
     101 * `fin_korisnik_vid_naplati`, `fin_korisnik_vid_naplati_attributi`, `fin_korisnik_naplata_atributi_vrednosti`, `fin_korisnici_naplati` — EAV за начини на наплата (Stripe, PayPal, картичка, трансфер)
     102 * `fin_naplati`, `fin_naplata_alokacija` — влезни плаќања и нивна алокација кон обврски
     103 * `fin_isplatna_obvrska`, `fin_tip_isplatna_obvrska`, `fin_status_isplatna_obvrska` — излезни обврски (стипендии, рефундации, хонорари)
     104 * `fin_korisnici_isplata`, `fin_isplati`, `fin_isplata_alokacija` — исплати преку трансакциски сметки
     105 * `fin_transakciski_smetki`, `fin_banki` — банкарски сметки (IBAN/SWIFT)
     106 * `fin_vid_valuta` — валути (ISO код, симбол)
     107 * `fin_tip_naplati_organizaciona_edinica`, `fin_tip_naplati_cenovnik` — ценовници
     108 * `fin_status_transakcija` — статус на трансакција (ACCEPTED итн.)
     109 * `fin_finansiski_dokument`, `fin_finansiski_dokument_tip`, `fin_finansiski_dokument_vrska` — финансиски документи
     110 * '''Потсистем за плати:''' `fin_plata_period`, `fin_status_plata_period`, `fin_plata_vlez`, `fin_tip_platna_komponenta`, `fin_plata_stavka_vraboten` (исплатно ливче), `fin_plata_komponenta` (атомарни ставки на пресметката)
     111
     112==== 6. Управување со документи (dok_) ====
     113 * `dok_dokument_templejti`, `dok_tip_dokumenti_organizaciona_edinica` — HTML/URL обрасци за официјални документи
     114 * `dok_dokument_templejt_atributi` — EAV дефиниции на полиња во образец
     115 * `dok_generiran_dokument`, `dok_generiran_dokument_vrednosti` — генерирани документи и пополнети вредности
     116 * `dok_dokument_potpis` — евиденција на авторизација/потпис (кој ангажман и функција го одобрил)
     117
     118==== 7. Надворешни ентитети (ent_) ====
     119 * `ent_entiteti` — надворешни компании, добавувачи, агенции, партнерски институции
     120 * `ent_entiteti_smetki` — мапирање на нивните трансакциски сметки кон `fin_transakciski_smetki`
     121
     122==== Помошни/привремени табели ====
     123 * `tmp_salary_truth` — '''видете ја Забелешката во делот за внес на податоци'''
     124
     125=== Програмски објекти ===
     126
     127==== Погледи (views) ====
     128 * `vw_aktivni_upisani_kursevi` — капацитет, број запишани и слободни места по реализација на курс
     129 * `vw_ispitni_prijavi` — преглед на пријавите за испит (сесија, индекс, предмет, статус)
     130 * `vw_istorija_naplati` — историја на наплати (сума, валута, статус, референца, ОЕ)
     131 * `vw_otvoreni_finansiski_obvrski` — отворени обврски по корисник (вкупно отворено, број, најстаро доспевање)
     132 * `vw_pregled_plati_period` — преглед на плати по период (бруто/нето/даноци, број вработени, просечна нето)
     133 * `vw_raspredelba_nastaven_kadar` — оптовареност на наставен кадар (часови, курсеви, паралелки по семестар)
     134 * `vw_studentski_oceni` — просек, освоени кредити, положени/паднати по студент
     135 * `vw_vraboteni_karieren_pat` — кариерен пат (академско звање и тековна функција)
     136 * `vw_vraboteni_prekrsoci_kvalifikacii` — вработени што не ги исполнуваат предусловите за позицијата
     137
     138==== Функции (fn_) ====
     139 * `fn_otvoren_dolg(user_id, vid_valuta_id)` → `numeric` — вкупен отворен долг на корисник во дадена валута
     140 * `fn_prosek_student(student_id, sistem_ocenuvanje_id)` → `numeric` — пондериран просек по кредити
     141 * `fn_slobodni_mesta(kurs_realizacija_id)` → `integer` — преостанати слободни места на реализација
     142
     143==== Процедури (pr_) ====
     144 * `pr_generiraj_obvrski_za_semestar(akademski_semestar_id)` — масовно генерирање обврски за школарина за сите запишани студенти (со пакетен `COMMIT`)
     145 * `pr_registriraj_naplata(user_id, suma, valuta, oe_id, referenca, korisnik_naplata_id)` — регистрира наплата и ја алоцира по отворени обврски (по доспевање)
     146 * `pr_zapisi_student_na_kurs(student_id, kurs_realizacija_id)` — запишува студент на курс со проверка на долг и капацитет
     147
     148==== Trigger функции (trgf_) ====
     149 * `trgf_azuriraj_otvorena_suma` — при алокација ја намалува отворената сума на обврската и го ажурира статусот (Platena/Delumno platena), со заштита од преалокација
     150 * `trgf_kapacitet_kurs` — спречува упис над капацитетот на курсот (сериализирано со `FOR UPDATE`)
     151 * `trgf_validna_ocena` — дозволува оценка само за активен упис, поени 0–100, и датум што не е во иднина
     152
     153''(Овие функции мора да се врзат за соодветните табели преку `CREATE TRIGGER`, што не е дел од `idontknow_script.sql`.)''
     154
     155=== Внес на податоци (DML) ===
     156
     157Внесот на податоци (DML) се изведува по DDL скриптата. Бидејќи скриптата не наметнува foreign key ограничувања, податоците технички може да се внесат по кој било редослед, но за зачувување на референцијалниот интегритет и конзистентни идентификатори се препорачува следниов редослед:
     158
     159 1. '''Базични шифрарници''' (без зависности) — `tip_atribut`, `drzavi`, `fin_vid_valuta`, `vr_akademski_stepen`, `vr_pole_kvalifikacija`, сите `*_tip_*`, `*_status_*` табели, `sm_period_akademski_semestar`, `fin_finansiski_dokument_tip`, `fin_tip_platna_komponenta`
     160 2. '''Географија и идентитети''' — `gradovi` → `lice` → `korisnici`
     161 3. '''Организациска структура''' — `or_mapa_objekt` → `or_organizaciona_edinica` (рекурзивно: прво коренот) → EAV дефиниции и вредности
     162 4. '''Банкарски и финансиски сметки''' — `fin_banki`, `fin_transakciski_smetki`, `ent_entiteti`, `ent_entiteti_smetki`, `or_organizaciona_edinica_smetki`
     163 5. '''Човечки ресурси''' — `vr_rabota_pozicija`, предуслови, `vr_vraboten_angazman`, звања/функции, `vr_lice_kvalifikacija`, `vr_vraboten_kompensacija`
     164 6. '''Студиска структура''' — `sm_predmet`, `sm_akreditacisko_telo`, `sm_akreditacija` (+ предуслови), `sm_smer` → `sm_smer_verzija` → семестри, `sm_akademska_godina` → `sm_akademski_semestar`, `sm_sistem_ocenuvanje(_vrednost)`
     165 7. '''Студенти и реализации''' — `sm_studenti`, `sm_studenti_smerovi`, `sm_kurs_realizacija` (+ паралелки, кадар), `sm_student_semestar_upis`, `sm_student_upisan_kurs`
     166 8. '''Трансакциски/тест податоци''' — испитни сесии и пријави, `sm_student_ocena_zapis`, финансиски обврски и наплати, плати (период → влезови → ставки → компоненти), документи
     167
     168DML скриптата содржи тест податоци со кои се проверува функционалноста на системот, погледите и програмските рутини.
     169
     170'''Забелешка:''' Табелата `tmp_salary_truth` е помошна (привремена) табела — нема примарен клуч ниту секвенца, само индекс `idx_truth_mapping` по (`plata_period_id`, `vraboten_id`). Во неа се чуваат очекуваните („вистинските") вредности за платите (`true_bruto`, `true_odbivki`, `true_danok`), кои служат за валидација на точноста на пресметката во потсистемот за плати (`fin_plata_komponenta` / `fin_plata_stavka_vraboten`) и за тестирање. Не е дел од продукцискиот модел.
     171
     172=== Скрипти ===
     173
     174|| '''Тип''' || '''Опис''' || '''Линк''' ||
     175|| DDL || Структура на базата (табели, индекси, погледи, функции, процедури, trigger функции) || [attachment:idontknow_script.sql DDL скрипта] ||
     176|| DML || Податоци за пополнување и тестирање на базата || [attachment:idontknow_dml.sql DML скрипта] ||