Changes between Version 2 and Version 3 of DatabaseCreation


Ignore:
Timestamp:
06/15/26 03:34:10 (6 days ago)
Author:
231102
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseCreation

    v2 v3  
    33=== Опис ===
    44
    5 Во оваа фаза релациониот модел дефиниран во претходните фази (види [attachment:AboutProject.txt AboutProject] и [attachment:RelationalModel.txt RelationalModel]) е имплементиран како физичка база на податоци.
    6 Базата е креирана во '''PostgreSQL''' преку '''DDL''' скрипта која ја дефинира структурата (табели, ограничувања, индекси, погледи и програмски објекти), додека податоците се внесуваат преку посебна '''DML''' скрипта.
     5Во оваа фаза релациониот модел е имплементиран како физичка база на податоци во '''PostgreSQL'''. Чекорот се состои од две активности:
    76
    8 Системот претставува централизиран информациски систем за високообразовни институции, организиран во седум функционални модули, секој означен со специфичен префикс на табелите. Структурата ја следи замислата за единствена точка на вистината (Single Source of Truth):
     7 1. '''Креирање на структурата (DDL)''' — табели, ограничувања, индекси, погледи и програмски рутини.
     8 2. '''Внес на податоци (DML)''' — пополнување на базата со податоци за тестирање на функционалноста.
    99
    10  * '''Општи и основни податоци''' (без префикс) — лица, корисници и географски шифрарници
    11  * '''Организациска структура и инфраструктура''' (префикс '''or_''')
    12  * '''Човечки ресурси и кадар''' (префикс '''vr_''')
    13  * '''Студентски прашања и академски менаџмент''' (префикс '''sm_''')
    14  * '''Финансии, сметководство и плати''' (префикс '''fin_''')
    15  * '''Управување со документи''' (префикс '''dok_''')
    16  * '''Надворешни ентитети''' (префикс '''ent_''')
     10Поделбата на сектори/модули е опишана во [attachment:RelationalModel.txt RelationalModel] и не се повторува овде.
    1711
    18 '''Забелешка за консолидација:''' DDL скриптата и податоците беа изработувани паралелно на повеќе работни машини во рамки на тимот. Овој документ служи како консолидиран преглед на финалната структура и на постапката за внес на податоци.
     12=== DDL — креирање на структурата ===
    1913
    20 === Технологија и конвенции ===
     14DDL скриптата (`idontknow_script.sql`) е напишана за PostgreSQL и креира:
    2115
    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_*` и сл. чуваат енумерации (код + име) и се пополнуваат прво.
     16 * '''119 табели''' — секоја со суроген примарен клуч `id` (од секвенца преку `nextval`) и `unique` ограничувања таму каде е потребно
     17 * '''11 индекси''' — секундарни B-tree индекси за чести пребарувања (на пр. `idx_korisnici_username`, `idx_studenti_indeks`)
     18 * '''9 погледи (`vw_`)''' — `vw_aktivni_upisani_kursevi`, `vw_ispitni_prijavi`, `vw_istorija_naplati`, `vw_otvoreni_finansiski_obvrski`, `vw_pregled_plati_period`, `vw_raspredelba_nastaven_kadar`, `vw_studentski_oceni`, `vw_vraboteni_karieren_pat`, `vw_vraboteni_prekrsoci_kvalifikacii`
     19 * '''3 функции (`fn_`)''' — `fn_otvoren_dolg`, `fn_prosek_student`, `fn_slobodni_mesta`
     20 * '''3 процедури (`pr_`)''' — `pr_generiraj_obvrski_za_semestar`, `pr_registriraj_naplata`, `pr_zapisi_student_na_kurs`
     21 * '''3 trigger функции (`trgf_`)''' — `trgf_azuriraj_otvorena_suma`, `trgf_kapacitet_kurs`, `trgf_validna_ocena`
    2822
    29 === Содржина на DDL скриптата ===
     23Користени типови на податоци: `int4`, `varchar`, `numeric(14,2)` за парични износи, `timestamp(6)`, `date`, `bool`, `text`.
    3024
    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`.)''
     25'''Опфат на DDL скриптата (важно):'''
     26 * Нема `FOREIGN KEY` ограничувања — релациите се изведени преку колоните `*_id`, без наметнат референцијален интегритет на ниво на база.
     27 * Секвенците (`*_id_seq`) се користат преку `nextval(...)`, но нивните `CREATE SEQUENCE` дефиниции не се дел од скриптата.
     28 * Дефинирани се trigger функциите (`trgf_`), но нема `CREATE TRIGGER` врзувања за табелите.
     29 * Скриптата не содржи `INSERT` — внесот на податоци е целосно одвоен во DML скриптата.
    15430
    15531=== Внес на податоци (DML) ===
    15632
    157 Внесот на податоци (DML) се изведува по DDL скриптата. Бидејќи скриптата не наметнува foreign key ограничувања, податоците технички може да се внесат по кој било редослед, но за зачувување на референцијалниот интегритет и конзистентни идентификатори се препорачува следниов редослед:
     33По креирањето на структурата, базата се пополнува со податоци преку DML скрипта. Бидејќи структурата нема foreign key ограничувања, редоследот на внес е одговорност на скриптата; за конзистентни идентификатори податоците се внесуваат по слоеви на зависност:
    15834
    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`, финансиски обврски и наплати, плати (период → влезови → ставки → компоненти), документи
     35 1. '''Шифрарници''' (без зависности) — типови, статуси, валути, држави, академски степени, `tip_atribut`
     36 2. '''Основни ентитети''' — `gradovi` → `lice` → `korisnici`, организациски единици, банкарски/трансакциски сметки
     37 3. '''Оперативни податоци''' — работни позиции и ангажмани, предмети, акредитации, смерови, академски години и семестри, студенти
     38 4. '''Трансакциски/тест податоци''' — уписи, оценки, испити, финансиски обврски, наплати и плати
    16739
    168 DML скриптата содржи тест податоци со кои се проверува функционалноста на системот, погледите и програмските рутини.
    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`) и за тестирање. Не е дел од продукцискиот модел.
     40'''Забелешка:''' Табелата `tmp_salary_truth` е помошна (привремена) табела без примарен клуч, со индекс `idx_truth_mapping`. Во неа се чуваат очекуваните вредности за платите (`true_bruto`, `true_odbivki`, `true_danok`) и служи за валидација на пресметката во потсистемот за плати при тестирањето. Не е дел од продукцискиот модел.
    17141
    17242=== Скрипти ===