draft:číselníky

Toto je starší verze dokumentu!


Jak na číselníky

Číselníkem je seznam nějak souvisejících položek. Číselníky se mohou používat například jako seznam možných hodnot pro různé vlastnosti datových entit, což lze využít pro formuláře pro zadávání dat, aplikace vizualizující data apod. Ukázkou číselníku může být například Číselník důvodů k ukončení pracovní neschopnosti České správy sociálního zabezpečení, který obsahuje například následující položky:

  • aptus (norm. ukončení nemoci)
  • důchod starobní
  • mateřská dovolená
  • nástup do lázní
  • exitus

Použití tohoto seznamu si lze představit třeba v personálním systému nějaké organizace, kde se evidují pracovní neschopnosti zaměstnanců.

Tato podoba, tedy textový seznam, není příliš vhodná pro strojově čitelnou reprezentaci.

Největším problémem je totiž to, že jednotlivé položky jsou identifikovatelné pouze svým názvem. Záznamy, které by tyto položky využívaly, by jejich název okopírovaly. Pokud by pak došlo ke změně v názvu položky, rázem by přestaly být validní všechny záznamy tuto položku využívající.

Je tedy třeba zavést identifikaci položky nezávisle na jejím názvu. Pro každou položku se tedu zaznamená její kód:

Kód Název
0 aptus (norm. ukončení nemoci)
1 důchod starobní
3 mateřská dovolená
5 nástup do lázní
E exitus

Nyní se ostatní systémy mohou odkazovat na kód položky, a jejich záznamy zůstanou validní i když se název položky změní. Identifikace položek tímto způsobem je ale pouze lokální. Aby je ostatní systémy mohly vužítvat, potřebují k tomu vědět, o který číselník kterého poskytovatele dat se jedná, protože číselníků, ve kterých je použit kód E je na světě jistě mnoho.

Je zde tedy jasné potřeba identifikovat položky číselníků lépe, ideálně tak, aby byly identifikovány naprosto jednoznačně. Pro tento účel se používají identifikátory IRI - Internationalized Resource Identifier, které jsou založeny na doménových jménech jednotlivých poskytovatelů dat a zaručují jednoznačnou identifikaci. Číselník s položkami identifikovanými IRI pak může vypadat například takto:

Nyní je každá položka globálně jednoznačně identifikována svým IRI, a to napříč systémy, které tyto položky využívají.

Některé položky mohou mít kratší název, například pro zobrazení ve formuláři, a delší popis, který detailně vysvětluje význam dané položky, například:

IRI Kód Název Popis
https://data.cssz.cz/resource/ciselniky/ciselnik-duvodu-k-ukonceni-pracovni-neschopnosti/0 0 aptus Aptus - Normální ukončení nemoci

Dále je čím dál častější reprezentovat vícejazyčné položky číselníků, tedy název a popis položky jak česky, tak třeba anglicky:

IRI Kód Název česky Název anglicky Popis česky Popis anglicky
https://data.cssz.cz/resource/ciselniky/ciselnik-duvodu-k-ukonceni-pracovni-neschopnosti/1 1 důchod starobní old-age pension starobní důchod dle § 29 odst. 1 a 3 písm. a), § 74, § 76 a § 94 z. č. 155/1995 Sb. nebo příslušných ustanovení předcházejících předpisů, zahrnut i důchod SIN dle § 29 odst. 4 téhož zákona Old-age pension in accordance with Section 29(1) and (3)(a) and Sections 74, 76 and 94 of Act No. 155/1995 Coll. or relevant provisions of previous regulations, including pension SIN in accordance with Section 29(4)of the same Act

Zde začíná být patrný další problém, a to jak číselníky reprezentovat tak, aby každý uživatel poznal, co je kód, co je název a v jakém je jazyce. I za předpokladu tabulkové reprezentace je variant totiž příliš mnoho, a každý poskytovatel dat si zajisté vybere jinou. Zpravidla se jená o ruční práci, jelikož se číselník od číselníku liší:

  • Názvy sloupců
    • Diakritika
    • Mezery a bílé znaky
    • Speciální znaky
  • Pořadí sloupců
  • Kódování souboru
  • Formáty čísel
  • Formáty datumů
  • apod.

Je tedy opět potřeba standardizovat podobu samotných číselníků, nejen identifikaci jejich položek. Pro publikaci číselníků na Webu se používá W3C doporučení SKOS - Simple Knowledge Organization System, jehož použití všechny výše uvedené problémy řeší. Jako datový formát používá W3C doporučení RDF - Resource Description Framework, které má vestavěnou podpouru pro jednoznačnou identifikaci entit, jejich vlastností i přirozených jazyků, ve kterých jsou psány názvy a popisy. Položka číselníku popsaná pomocí doporučení SKOS pak vypadá takto:

<https://data.cssz.cz/resource/ciselniky/ciselnik-duvodu-k-ukonceni-pracovni-neschopnosti/1> a <http://www.w3.org/2004/02/skos/core#Concept> ;
  <http://www.w3.org/2004/02/skos/core#inScheme> <https://data.cssz.cz/resource/ciselniky/ciselnik-duvodu-k-ukonceni-pracovni-neschopnosti/ConceptScheme> ;
  <http://www.w3.org/2004/02/skos/core#notation> "1" ;
  <http://www.w3.org/2004/02/skos/core#prefLabel> "důchod starobní"@cs, "old-age pension"@en ;
  <http://www.w3.org/2004/02/skos/core#note> "starobní důchod dle § 29 odst. 1 a 3 písm. a), § 74, § 76 a § 94 z. č. 155/1995 Sb. nebo příslušných ustanovení předcházejících předpisů, zahrnut i důchod SIN dle § 29 odst. 4 téhož zákona"@cs, "Old-age pension in accordance with Section 29(1) and (3)(a) and Sections 74, 76 and 94 of Act No. 155/1995 Coll. or relevant provisions of previous regulations, including pension SIN in accordance with Section 29(4)of the same Act"@en .

Vlastnost http://www.w3.org/2004/02/skos/core#inScheme přiřazuje danou položku do daného číselníku, který je zde identifikován jako https://data.cssz.cz/resource/ciselniky/ciselnik-duvodu-k-ukonceni-pracovni-neschopnosti/ConceptScheme.

Reprezentace číselníků v RDF dle SKOS má ještě další výhodu. Při správné implementaci při přístupu k URI položky či číselníku, tj. jeho použití jako URL - Uniform Resource Locator, dostane zájemce, ať už člověk či aplikace, přímo reprezentaci této položky, což je v případě jiných reprezentací nemyslitelné.

Je-li číselník reprezentován pomocí SKOS, lze z něj vytvořit i odvozené, zjednodušené reprezentace, které ovšem budou postrádat výhody popsané výše.

Reprezentace v CSV tabulce:

kod_polozky,nazev_polozky,popis_polozky
0,aptus (norm. ukončení nemoci),normální ukončení nemoci
1,důchod starobní,důchod starobní
3,mateřská dovolená,mateřská dovolená
5,nástup do lázní,nástup do lázní
E,exitus,exitus

Reprezentace v JSON souboru:

[
 {
   "kod_polozky": "0",
   "nazev_polozky": "aptus (norm. ukončení nemoci)",
   "popis_polozky": "normální ukončení nemoci"
 },
 {
   "kod_polozky": "1",
   "nazev_polozky": "důchod starobní",
   "popis_polozky": "důchod starobní"
 },
 {
   "kod_polozky": "3",
   "nazev_polozky": "mateřská dovolená",
   "popis_polozky": "mateřská dovolená"
 },
 {
   "kod_polozky": "5",
   "nazev_polozky": "nástup do lázní",
   "popis_polozky": "nástup do lázní"
 },
 {
   "kod_polozky": "E",
   "nazev_polozky": "exitus",
   "popis_polozky": "exitus"
 }
]

Jiná reprezentace v JSON souboru:

{
   "0": {
      "nazev_polozky": "aptus (norm. ukončení nemoci)",
      "popis_polozky": "normální ukončení nemoci"
   },
   "1": {
      "nazev_polozky": "důchod starobní",
      "popis_polozky": "důchod starobní"
   },
   "3": {
      "nazev_polozky": "mateřská dovolená",
      "popis_polozky": "mateřská dovolená"
   },
   "5": {
      "nazev_polozky": "nástup do lázní",
      "popis_polozky": "nástup do lázní"
   },
   "E": {
      "nazev_polozky": "exitus",
      "popis_polozky": "exitus"
   }
}

Reprezentace v XML:

<?xml version="1.0" encoding="UTF-8"?>
<polozky>
  <polozka>
    <kod>0</kod>
    <nazev>aptus (norm. ukončení nemoci)</nazev>
    <popis>normální ukončení nemoci</popis>
  </polozka>
  <polozka>
    <kod>1</kod>
    <nazev>důchod starobní</nazev>
    <popis>důchod starobní</popis>
  </polozka>
  <polozka>
    <kod>3</kod>
    <nazev>mateřská dovolená</nazev>
    <popis>mateřská dovolená</popis>
  </polozka>
  <polozka>
    <kod>5</kod>
    <nazev>nástup do lázní</nazev>
    <popis>nástup do lázní</popis>
  </polozka>
  <polozka>
    <kod>E</kod>
    <nazev>exitus</nazev>
    <popis>exitus</popis>
  </polozka>
</polozky>
  • draft/číselníky.1529927053.txt.gz
  • Poslední úprava: 2020/06/03 09:36
  • (upraveno mimo DokuWiki)