DATA Most
Architektura číselníků
Referenční tabulky (ref_*) — kompletní přehled, bezpečnost, obnova a práce s číselníky
v1.0 | 19. 2. 2026
Autor: Petr Rohan
Status: SPECIFIKACE
Modul: specs/15-ciselniky.md
database Princip: Vše v databázi, nic v kódu
Architektonické rozhodnutí — všechny enumerace a číselníky jako DB referenční tabulky
gavel Proč referenční tabulky?

ISPV (Informační systém o průměrném výdělku) je povinné statistické šetření ze zákona (zákon č. 89/1995 Sb.). Kódy vzdělání, klasifikace zaměstnání CZ-ISCO, okresy pracoviště LAU1 a statusy zaměstnání CZ-ICSE musí být udržované a aktualizovatelné bez deploymentu aplikace. Proto žádné hardcoded TypeScript enumy — vše v PostgreSQL jako ref_* tabulky s FK constrainty, timestampy a is_active flagem pro soft-deprecation.

CREATE TABLE ref_<name> (
    code         varchar(...)  PRIMARY KEY,   -- hodnota v hlavních tabulkách
    label_cs     text           NOT NULL,    -- český název
    label_en     text,                        -- anglický název
    pamica_value varchar(100),              -- XSD hodnota (pokud se liší)
    sort_order   integer       NOT NULL DEFAULT 0,
    is_active    boolean       NOT NULL DEFAULT true, -- false = zrušeno
    created_at   timestamptz   NOT NULL DEFAULT now(),
    updated_at   timestamptz   NOT NULL DEFAULT now()  -- auto-trigger
);
key code jako PK Hlavní tabulky ukládají přímo kód (varchar). Žádné zbytečné JOINy pro zobrazení — JOIN jen pro label.
link FK constrainty ON UPDATE CASCADE ON DELETE RESTRICT — kód nelze smazat, pokud ho používá záznam. Pouze deaktivovat.
visibility_off is_active flag Zrušené hodnoty (pojišťovny 217, 222...) se nezobrazují ve formulářích, ale historické záznamy zůstávají validní.
monitoring Celkový přehled
Souhrn číselníkové architektury v číslech
25
Referenčních tabulek
(24 + 1 cache)
16 672
Seedovaných záznamů
celkem
30+
FK constraintů
z hlavních tabulek
0
Hardcoded TypeScript
enumů
category Tři kategorie číselníků
Podle zdroje dat a mechanismu údržby
A XSD enumerace z Pamica empType.xsd
16 tabulek
~144 záznamů | Aktualizace: při nové verzi XSD
  • ref_sex3
  • ref_marital_status6
  • ref_education_level14
  • ref_health_insurance_company13
  • ref_employment_kind~25
  • ref_pension6
  • ref_tax_premium_type~40
  • ref_schedule_type7
  • ref_product_type7
  • ref_wage_type4
  • ref_payment_method2
  • ref_deduction_kind4
  • ref_identity_document_type4
  • ref_tax_identification_type4
  • ref_insurance_holder_spec3
  • ref_wage_kind2
B Excel číselníky z Pamica + ČSÚ
5 tabulek
~10 048 záznamů | Aktualizace: ročně (ČSÚ)
  • ref_isco7 966
  • ref_country~250
  • ref_nace1 741
  • ref_district78
  • ref_employment_status13
CZ-ISCO autocomplete: GIN trigram index + search_isco() RPC funkce pro fuzzy vyhledávání v 7 966 záznamech.
C Obory vzdělání API obory-vzdelani.cz
3 + cache
~6 480 záznamů | Aktualizace: TTL 30 dní (API)
  • ref_municipality6 402
  • ref_education_field66
  • ref_study_type12
  • ref_education_cache1/rok
Kaskádní výběr: Místo studia → Rok → Typ školy → Obec → Škola → Obor → kód BASO
A XSD enumerace — 16 tabulek
Zdrojová data z Pamica empType.xsd | Seedováno při deploymentu | Aktualizace při nové verzi XSD
# Tabulka Záznamů PK typ FK z hlavní tabulky Extra sloupce
1ref_sex3varchar(10)employees.sex
2ref_marital_status6varchar(20)employees.marital_status
3ref_education_level14varchar(2)employees.ispv_educationISPV povinné
4ref_health_insurance_company13integeremployee_health_insurances.insurance_companyabbreviation, cancelled_date
5ref_employment_kind~25varchar(5)employments.kindcategory (PP/DPC/DPP)
6ref_pension6varchar(2)employees.ossz_pension
7ref_deduction_kind4varchar(15)employee_wage_deductions.deduction_kind
8ref_identity_document_type4varchar(20)employees.fg_identity_doc_type
9ref_tax_identification_type4varchar(30)employees.fg_ins_tax_id_type
10ref_insurance_holder_spec3varchar(10)employees.fg_ce_insurance_holder
11ref_wage_kind2varchar(12)employment_wage_elements.kind
12ref_schedule_type7varchar(35)employments.schedule_type
13ref_product_type7varchar(30)employee_life_insurances.product
14ref_tax_premium_type~40varchar(60)employee_tax_items.typecategory (discount/benefit/…)
15ref_wage_type4varchar(20)employments.type
16ref_payment_method2varchar(10)employees.supplement_payment_method
B Externí číselníky z Excelu — 5 tabulek
Zdrojová data z Pamica Excel exportů a ČSÚ | Seedováno při deploymentu | Aktualizace ročně nebo při změně
# Tabulka Záznamů Zdrojový soubor FK z hlavní tabulky Extra sloupce
17 ref_isco 7 966 Podklady/pamBB4F.xlsx employments.ispv_isco_class level, parent_code, search_vector + GIN trigram
18 ref_country ~250 Podklady/pam653C.xlsx 9 FK (citizenship, fg_*, addresses) alpha_3, numeric_code, is_eu
19 ref_district 78 Podklady/pam898D.xlsx employments.ispv_work_place region_code, region_name
20 ref_nace 1 741 Podklady/pam93B4.xlsx organizations (budoucí) level, parent_code, section, search_vector
21 ref_employment_status 13 Podklady/pamBA24.xlsx employments.ispv_employment_status
info
CZ-ISCO autocomplete (7 966 záznamů)
Uživatel píše „účetní" do vyhledávacího pole — systém nabídne odpovídající povolání díky GIN trigram indexu (pg_trgm) a RPC funkci search_isco(query, max_results). Odezva pod 100 ms bez aplikačního cachování.
C Obory vzdělání — 3 tabulky + cache
Zdrojová data z API obory-vzdelani.cz + lokální JSON cache | Dynamická data s TTL 30 dní
# Tabulka Záznamů Zdrojový soubor / API Účel
22ref_education_field66data/obory-vzdelani/seznam-oboru-baso.jsonBASO kategorie oborů
23ref_study_type12data/obory-vzdelani/inicializacni-data.jsonTypy studia (SSB, SSS, VOS, VS…)
24ref_municipality6 402data/obory-vzdelani/seznam-obci.jsonObce ČR pro kaskádní výběr
ref_education_cache1/rokschools-and-fields.json (JSONB)Cache kaskádních dat, TTL 30 dní
account_tree Kaskádní výběr oboru vzdělání
Místo studia
ČR / Zahraničí
arrow_forward Rok ukončení
1945–2026
arrow_forward Typ školy
12 typů
arrow_forward Obec
6 402 obcí
arrow_forward Škola
dynamicky
arrow_forward Obor → kód
BASO
share FK mapa — hlavní tabulky → ref_* tabulky
30+ foreign key constraintů propojujících datové tabulky s referenčními číselníky
person employees
sex ref_sex marital_status ref_marital_status ispv_education ref_education_level citizenship ref_country ispv_citizenship ref_country ossz_pension ref_pension supplement_payment_method ref_payment_method fg_identity_doc_type ref_identity_document_type fg_country_of_issue ref_country fg_place_of_work ref_country fg_country_of_birth ref_country fg_local_country ref_country fg_ins_country ref_country fg_ins_addr_country ref_country fg_ins_tax_id_type ref_tax_identification_type fg_ce_insurance_holder ref_insurance_holder_spec
home employee_addresses
country ref_country
health_and_safety employee_health_insurances
insurance_company ref_health_insurance_company
shield employee_life_insurances
product ref_product_type
receipt_long employee_tax_items
type ref_tax_premium_type
money_off employee_wage_deductions
deduction_kind ref_deduction_kind addr_country ref_country
work employments
kind ref_employment_kind type ref_wage_type schedule_type ref_schedule_type ispv_employment_status ref_employment_status ispv_work_place ref_district ispv_isco_class ref_isco
payments employment_wage_elements
kind ref_wage_kind advance_payment_method ref_payment_method
A = XSD enumerace B = Excel číselníky
update Frekvence obnovy a údržba
Jak často a jakým mechanismem se jednotlivé číselníky aktualizují
Číselník Frekvence Mechanismus Kdo zodpovídá Poznámka
XSD enumerace (16 tabulek) Při nové verzi Pamica Admin UI nebo migrace Platform admin Pamica XSD se mění velmi zřídka (1× za roky)
ref_isco Ročně Admin import (Excel) Platform admin Aktualizace ČSÚ klasifikace zaměstnání
ref_country Vzácně Admin import Platform admin Změna ISO 3166-1 (nový stát, přejmenování)
ref_district Vzácně Admin import Platform admin Změna LAU1 kódů (reorganizace okresů)
ref_nace Ročně Admin import (Excel) Platform admin Aktualizace ČSÚ ekonomických činností
ref_employment_status Při změně ČSÚ Admin import Platform admin CZ-ICSE kódy (13 hodnot)
Obory vzdělání (3 tabulky) TTL 30 dní Background job (API) Automaticky API obory-vzdelani.cz, JSON fallback
ref_health_insurance_company Legislativní změna Admin UI (is_active flag) Platform admin Zrušení/založení pojišťovny — jen přepnutí flagu
tips_and_updates
Jak aktualizovat číselník?
1. Malá změna (přidání/deaktivace hodnoty): Admin UI — INSERT nový záznam nebo UPDATE is_active = false.
2. Větší aktualizace (nová verze CZ-ISCO od ČSÚ): Platform admin importuje nový Excel — Python skript převede na SQL, aplikuje se migrace.
3. Automatická obnova (obory vzdělání): Background edge function kontroluje TTL cache a stahuje nová data z API.
security Bezpečnost a compliance
Legislativní požadavky, ochrana dat, přístupová práva a audit
gavel
ISPV je povinné ze zákona — zákon č. 89/1995 Sb. o státní statistické službě. Zaměstnavatelé s 10+ zaměstnanci musí vykazovat data o průměrném výdělku včetně kódů vzdělání, CZ-ISCO klasifikace, LAU1 pracoviště a CZ-ICSE statusu. Nesprávné nebo chybějící kódy = nesplnění zákonné povinnosti.
verified_user
GDPR — žádná osobní data
Referenční tabulky (ref_*) obsahují pouze kódy a labely (např. „A = Bez vzdělání", „CZ = Česká republika"). Žádné osobní údaje zaměstnanců — žádné zvláštní GDPR opatření pro tyto tabulky.
admin_panel_settings
Přístupová práva (RLS)
Čtení: všichni autentizovaní uživatelé (formuláře potřebují číselníky).
Zápis: pouze platform admin (is_platform_admin = true).
Žádný tenant nemůže modifikovat globální číselníky.
history
Audit log
Každá změna v ref_* tabulkách je logována v audit_logs (kdo, kdy, stará/nová hodnota). Zpětná dohledatelnost pro kontroly.
block
FK RESTRICT — ochrana integrity
ON DELETE RESTRICT — pokud je kód používán záznamem zaměstnance, nelze ho smazat z číselníku. Pouze deaktivovat (is_active = false).
visibility_off
Soft-delete (is_active)
Zrušené pojišťovny (217, 222, 227, 228) mají is_active = false. Ve formulářích se nezobrazují, ale historické záznamy zaměstnanců zůstávají validní.
schedule
Timestampy
Každá tabulka: created_at + updated_at (auto-trigger). Lze kdykoliv zjistit, kdy byl číselník naposledy aktualizován a zda je aktuální.
# Migrace Co dělá Závislosti
1001_ref_extensions_and_functionspg_trgm extension + set_updated_at() trigger
2002_ref_tables_ddlCREATE všech 25 ref_* tabulek (DDL, bez dat)migrace 1
3003_ref_seed_xsd_enumsINSERT ~144 záznamů do 16 XSD tabulekmigrace 2
4004_ref_seed_excel_dataINSERT ~10 048 záznamů do 5 Excel tabulekmigrace 2 + parsování Excelů
5005_ref_seed_obory_vzdelaniINSERT ~6 480 záznamů do 3 tabulek oborůmigrace 2 + parsování JSON
6006_ref_foreign_keysALTER TABLE — 30+ FK constraintůmigrace 2–5 + hlavní tabulky
7007_ref_rls_policiesRLS: read authenticated, write platform adminmigrace 2
8008_ref_search_functionsRPC search_isco() pro autocompletemigrace 4