Sloupec (databáze)
Sloupec je v relačních databázích vertikální část databázové tabulky. Seznam sloupců jsou hlavní (ne však jedinou) složkou definice tabulky v databázi. Každý sloupec je v tabulce jednoznačně definován svým identifikátorem, datovým typem, rozsahem a dalšími atributy.
Definice sloupce
editovatDefinice sloupců v tabulce může být v každém systému řízení báze dat trochu odlišná, přesto u nejpoužívanějších databázových systémů lze najít několik věcí společných.
Identifikátor
editovatTéž jméno či název sloupce. To je používáno k výběrovým dotazům (SQL konstrukci SELECT…). Databázoví návrháři se jak použití diakritiky, tak např. mezer, pomlček a dalších znaků vyhýbají, přestože téměř všechny současné databázové systémy užití diakritiky v názvech sloupců povolují. Aby v takovém případě dokázal parsovač SQL rozpoznat, co je ještě identifikátor sloupce a co aritmetický výraz, jsou sloupce s diakritikou (nebo jejich aliasy) escapovány.
- Příklad pro MS SQL:
SELECT [telefon do zaměstnání] FROM [zaměstnanci];
- Příklad pro MySQL:
SELECT `telefon do zaměstnání` FROM `zaměstnanci`;
Je doporučeno, aby názvy sloupců byly výstižné a nezavádějící a přitom pokud možno krátké. U víceslovných názvů se pro oddělení jednotlivých dílčích slov používá buď podtržítko (např. Telefon_do_zamestnani
) nebo jedna z konstrukcí camelCase (telefonDoZamestnani
) či PascalCase (TelefonDoZamestnani
).
U primárního klíče se silně doporučuje označení id (popř. podle konvence Id nebo ID), u cizích klíčů se doporučuje, aby „ID“ bylo součástí jejich identifikátoru (a to buď na začátku nebo na konci).
Typ
editovatTyp sloupce určuje, jak bude sloupec interpretovat svůj obsah. Názvy typů se mohou výrazně lišit podle použitého databázového stroje – většina databází má nicméně zavedený systém pojmenování základních typů. Část názvu tvoří skupina typů, a to pro uchování:
- textových řetězců a binárních dat,
- celých nebo racionálních čísel,
- dat/časů
- speciálních typů.
Současně s tím se vžila konvence předpon, napovídající, jaký bude mít sloupec tohoto typu rozsah:
- tiny – 28,
- small – 216,
- medium – 224,
- (bez přípony) – 232,
- big – 264.
Řetězcové typy
editovatTyto typy jsou schopny uložit běžný text nebo binární data. Lze je dělit podle následujících čtyřech aspektů:
- textové versus binární – některé databázové systémy mohou mít při manipulaci s textovými sloupci tendenci ořezat bílé místo na začátku a na konci, nebo automaticky text převádět podle implicitní znakové sady, popřípadě tyto operace mít nastaveny pro hledání či jiná pravidla. Pokud je nezbytné, aby byla data zpracovávána bez těchto úprav (např. uložení hesel, kódů, klíčů, i binárních souborů), volí se binární řetězcové typy.
- uložené přímo v řádku versus ve speciálním souboru – na rozdíl od ostatních datových typů mohou textové a binární typy zabírat proměnlivé a především i docela velké množství dat, jejichž uložení přímo v záznamech každého řádku může být nepraktické (a též nevhodné pro procházení záznamy, které je v SŘBD optimalizováno především na rychlost). Jednotlivé SŘBD proto oddělují řetězcové typy, které vzhledem k jejich maximální délce (řádově stovky až pár tisíc znaků) mohou být uloženy přímo v řádku, a typy, jejichž hodnoty je lepší uložit do souborů extra pro ně. Hodnoty v těchto souborech poté zpravidla indexují granulují po určité velikosti (třeba 512 nebo 4096 bajtů) a tyto jednotlivé atomární bloky indexují a stránkují (podobně jako stránkování operační paměti). To, jakým způsobem si databázový systém ukládání dlouhých řetězcových hodnot řeší, nicméně je věcí ryze jeho – designér databáze natož uživatel databázové aplikace se tím nemusí zabývat. Například MySQL volí kombinovaný přístup — je-li řetězec kratší nebo roven 256 bajtů, uloží jej do řádku, delší řetězce pak do ad hoc souboru, čímž současně optimalizuje přístup k takto uloženým hodnotám na rychlost.
- se statickou versus dynamickou velikostí – některá řetězcová pole v sobě mohou uchovávat hodnoty pouze do určité ne příliš velké délky (typickým příkladem jsou všemožné kódy, poté telefonní čísla, rodná čísla nebo hesla). Může mít proto smysl zvolit pro ně statickou velikost. Ta pak bude pro každý záznam alokována, ať už ji hodnota naplní ze 100, 50 či 0 %. Pokud se v řádku nevyskytují jiné řetězcové sloupce s dynamickou velikostí, pak bude mít řádek statickou (fixní) velikost, což může výrazně zvýšit rychlost, s kterou SŘBD prochází a vyhledává jednotlivé záznamy (u záznamů s dynamickou velikostí musí projít záznam po záznamu a zjistit jeho velikost, aby jej v případě neshody mohl přeskočit na další záznam; u záznamů se statickou velikostí SŘBD ví, že n-tý záznam začíná na pozici n*<velikost jednoho záznamu>. Toto lze s výhodou zkombinovat s vyhledáváním podle indexů, které jsou řešeny aproximací nějakou z numerických metod a rapidně menší počet přístupů k jednotlivým záznamům během hledání a spolu s tím vyšší rychlost a menší zátěž pro databázový server).
- ascii versus national – toto rozdělení mají pouze některé databázové enginy, které mohou dát uživateli možnost ukládat jedno- nebo vícebajtové znaky (typicky národní znaky (odtud název national), méně používané matematické symboly, grafické znaky a další) – prakticky odpovídá kódování Unicode. Takové typy se většinou označují s předponou n (nchar, nvarchar, ntext, v kontrastu s char, varchar, text). Vícebajtové znaky mají i o trochu větší režii pro SŘBD, protože ty musejí hlídat konzistenci mezi rozšířeným znakem a jeho druhým (popř. dalšími) bajty, které za ním následují; správně implementovat funkce pro operaci s řetězci (protože počet znaků nemusí odpovídat počtu bajtů jako u řetězců s jednobajtovým kódováním), a tak dále. Jiným (a obecnějším) přístupem je nezávislé nastavení znakové sady a COLLATION (viz dále).
Jednotlivé typy pro binární a textové řetězce:
- textové
- char – textový typ pevně stanovené šířky (počtu znaků), které zabírá nezávisle na tom, je-li vyplněna nebo ne (v takovém případě je v datovém souboru databáze doplněna na tuto šířku). Výhodou je rychlejší manipulace a přepisování hodnot, nevýhodou je toto nadbytečné místo.
- varchar (zkratka z variant char nebo char varying) – na rozdíl od typu char se ukládané hodnoty nedoplňují na zadanou šířku, ale v datovém souboru se uloží délka a za ní data; délka je tedy pohyblivá (odtud označení variant). Výhodou je úspornější uložení bez zbytečného, nevyužitého místa, nevýhodou je problematičtější přeukládání kratšího řetězce delším (kdy databázový stroj musí realokovat dostupné místo v datovém souboru). V takových případech vznikají bloky nevyužitého místa, které se nicméně dají „optimalizovat“ nebo opravit příkazy OPTIMIZE TABLE nebo REPAIR TABLE. Typ varchar může být u některých starších databázových strojů omezen na 255 (28-1) bajtů, u novějších toto omezení většinou není. V MySQL platí omezení 65536 bajtů na celou databázovou řádku, do které se počítají všechny typy kromě blob a text, proto je nutno při návrhu tabulek s více textovými sloupc s tímto omezením počítat a případně zvolit, hodnoty kterých sloupců se budou ukládat do ad hoc souborů.
- text (původně clob, řidčeji smalltext, u starších databází memo) – textový typ, který se na rozdíl od typů char a varchar ukládá do oddělených souborů (závisí na implementaci). Typ text je omezen na 65536 bajtů.
- tinytext – jako text s omezením na 256 bajtů
- mediumtext – jako text s omezením na 16777216 bajtů
- longtext – jako text s omezením (podle implementace) na 2 nebo 4 GB
- nchar, nvarchar, ntext – řetězcový typ používaný např. v MSSQL a Oracle (kde n je akronym pro national) pro uložení znaků Unicode; MySQL toto řeší přes znakové sady a tzv. collation, které lze nastavit každému textovému sloupci
- binární
- binary – binárně citlivá obdoba typu char (tj. pevná šířka pro uložení dat)
- varbinary – binárně citlivá obdoba typu varchar (tj. proměnlivá šířka při ukládání dat)
- blob – binárně citlivá obdoba text; v MSSQL se též vyskytuje typ image a v Oracle typ LONG RAW a v PostgreSQL bytea se srovnatelnou funkcionalitou
- tinyblob – binárně citlivá obdoba tinytext
- mediumblob – binárně citlivá obdoba mediumtext
- longblob – binárně citlivá obdoba longtext
Číselné typy
editovat- celočíselné
- tinyint – celé číslo, rozsah –128 až +127 (8 bitů)
- smallint – rozsah –32 768 až 32767 (16 bitů)
- mediumint – rozsah –8 388 608 až 8 388 607 (24 bitů)
- int (též integer) – rozsah –2 147 483 648 až 2 147 483 647 (32 bitů)
- bigint – rozsah –9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 (64 bitů)
- s desetinnou čárkou
- float (někdy též real) – plovoucí desetinná čárka podle IEEE 754, rozsah 32 (u real též 48) bitů
- double (v PostgreSQL double precision) – jako float ale s dvojitou přesností, rozsah (64 bitů)
- decimal (někde též numeric) – pevná desetinná čárka, vhodné pro ukládání měny nebo racionálních čísel s omezeným rozsahem a přesností
- money (s variantou smallmoney) – datový typ s pevnou desetinnou čárkou, používaný v MSSQL speciálně pro ukládání měny
Booleovské typy
editovat- bit, bool nebo boolean – dokáže uložit pouze jeden bit informace; je použit jen v některých databázích, např. Microsoft Access a MSSQL. Prakticky odpovídá typu enum s hodnotami false a true (resp. 0 a 1).
Datum a čas
editovatDatabázové systémy věnují též pozornost uchovávat datum a čas, pro něž vyhrazují několik datových typů ale i funkcí pro manipulaci s nimi nebo konverzi mezi nimi. Hodnoty data a času se uzavírají v MySQL do (jednoduchých nebo zdvojených) uvozovek stejně jako řetězce, u MSSQL a MS Access do mřířek (#); a jsou uloženy buď jako tzv. časový otisk (time stamp) nebo ve formě čitelné pro člověka (většinou ve formátu: rok, měsíc, den, hodina, minuta, sekunda, a to bez znaků, které je oddělují – např. sekunda před rokem 2000 by byla uložena jako 19991231235959). Nevýhodou data uloženého ve formě čitelné pro člověka tkví v jeho nesourodosti (existenci „mezer“, které neodpovídají platnému datu a času – 13.–99. měsíc, 24.–99. hodina, 60.–99. minuta či sekunda), což komplikuje např. přičítání nebo odečítání dvou časů od sebe. Formát time stamp tyto neduhy nemá, na druhou stranu se pro jeho prezentaci do formy srozumitelné pro člověka musí pokaždé spustit poměrně netriviální procedura, který z tohoto čísla separuje rok, měsíc, den, popř. i hodiny, minuty a sekundy. Oba případy umožňují takto uložené hodnoty porovnávat, protože významnější jednotky (roky před měsíci, měsíce před dny, …) se nacházejí na významnějších pozicích takto uloženého čísla.
- date – pouze pro datum bez času, rozsah je většinou od roku 0000 do roku 9999.
- datetime (s variantou smalldatetime) – datum včetně času (přesnost na sekundy)
- timestamp – formát odpovídající UNIX_TIMESTAMP (počet sekund od „věku Unixu“, 1. 1. 1970)
- time – pouze pro uložení denní doby
- year – pouze pro uložení roku
- interval – pro uložení časového intervalu (tedy většinou rozdílu dvou dat), v PostgreSQL
MySQL od verze 4.1 podporuje i časové zóny.
Výčty a sady
editovat- enum – odpovídá konstrukci
enum
v jazyku C (pro uložení jedné pojmenovaných hodnot, nelze uložit jinou hodnotu než tu z daného seznamu). Jednotlivé hodnoty se v SQL příkazech uvádějí v uvozovkách jako řetězce, ale do databáze se ukládají pouze jako index z definovaných hodnot. Jejich počet je omezen (podle implementace) buďto na 256 nebo 65536 hodnot. - set – pro uložení více příznaků (atributů, „flagů“) současně (kdy nastavení nebo smazání jednoho neovlivní ostatní). Příznaky jsou definovány spolu s typem (obdobně jako u enum), většinou lze uložit maximálně 32 nebo 64 různých hodnot (podle implementace) – do 32- resp. 64bitového slova. Hodnoty odpovídají jednotlivým bitům, které se interně dají nastavit na logickou 0 nebo 1 ve stejném duchu jako slovně pojmenované příznaky daného setu.
Příklad v MySQL:
CREATE TABLE mobilni_telefony(
tvar enum('klasicky','vecko','vysunovaci'),
frekvence set('800MHz','900MHz','1800MHz','1900MHz')
);
INSERT INTO mobilni_telefony VALUES ('vysunovaci', '900MHz,1800MHz,1900MHz');
SELECT * FROM mobilni_telefony WHERE FIND_IN_SET('1800MHz',frekvence);
Příklad vytvoří jednoduchou tabulku s oběma typy výčtových sloupců, vloží do nich první záznam s testovacími hodnotami a nakonec zkusí vyhledat záznamy obsahující určitou hodnotu v sadě. Všimněte si zápisu pro ukládání typu set.
Výčtové typy, přestože vystupují jako textové, jsou uloženy binárně. U daného záznamu bude tedy 'vysunovaci' odpovídat hodnotě 3 (třetí definovaná v pořadí) a kombinace '900MHz,1800MHz,1900MHz' pak binární hodnotě (1110)B (jsou zvoleny 2., 3. a 4. hodnota, což odpovídá 2., 3. a 4. bitu – ve výsledku tedy hodnotě 14).
Geometrické typy
editovatNěkteré databáze mají též datové typy speciálně pro uložení informací o geometrických útvarech. V poslední době podpora těchto typů (a s nimi souvisejícími konverzními funkcemi) přibyla spolu s potřebou podporovat OpenGIS.
- point – souřadnice plochy
- line (v MySQL LINESTRING) – definice úsečky
- box – definice pravoúhelníku
- circle – definice kružnice
- polygon – definice mnohoúhelníku (polygonu)
- lseg – segment úsečky (line segment)
- path – otevřená nebo uzavřená oblast plochy
Tyto typy mohou mít též předponu MULTI (MULTIPOINT, MULTIPOLYGON, …) – v tom případě jsou schopny pojmout vícero bodů, linií, polygonů, atd.
Jiné typy
editovat- uniqueidentifier, SERIAL, bigserial – speciální číselný typ, který při vložení (inkrementací, sekvencí) automaticky nastaví svoji hodnotu tak, aby byla v tabulce unikátní.
- cidr, macaddr – speciální typ PostgreSQL pro uložení IP resp. MAC adresy
- XMLType – typ Oracle pro uložení dat ve formátu XML
Tento výčet je typický pro relační databáze. Objektové databáze mají možnost definovat i záznamy, které se z těchto typů mohou skládat.
Rozsah
editovatU typů může být omezen rozsah (maximální rozsah je dán přímo typem, podle implementace daného databázového systému). V SQL se rozsah udává hned za datovým typem, uzavřený v oblých závorkách.
- u celočíselných typů je dán počtem desetinných míst (v desítkové soustavě)
- u typů s desetinnou čárkou se udávají dvě čísla, oddělená čárkou: první je celkový počet míst (včetně znaku pro unární minus), druhé je počet míst za desetinnou čárkou (bráno z tohoto celkového počtu). Např. hodnota (3,1) umožňuje hodnoty od –9.9 do 99.9.
- u řetězcových typů vyjadřuje maximální počet bajtů (nikoli znaků), které do sloupce lze uložit
- u typů enum a set nemluvíme o rozsahu ale o výčtu (povolených) hodnot.
Výčet hodnot
editovatU typů enum a set musí následovat výčet hodnot, které sloupce tohoto typu mohou nabývat (nebo, v kombinaci s příznakem NULL, mohou nabývat hodnotu NULL). Hodnoty z výčtu jsou uváděny jako řetězce (uzavřené v apostrofech nebo uvozovkách), oddělené čárkou. Pro enum je přiřazování hodnoty totožné např. s řetězcovými sloupci, u set se pro přiřazení dalšího příznaku (bez vymazání ostatních), nebo zjištění, zdali jistý příznak obsahuje, musí použít speciálních funkcí/konstrukcí, např. FIND_IN_SET u MySQL.
Výchozí hodnota
editovatVětšinou lze u sloupce definovat jeho výchozí (též implicitní, výchozí) hodnotu, a to vložením klíčového slova DEFAULT, za nímž tato hodnota následuje. Výchozí hodnota se vloží v případě tzv. neúplného INSERTu, tedy v případě, že v tomto SQL příkazu nejsou specifikovány všechny sloupce tabulky, do které se vkládá, a to právě u těch sloupců, které nebyly specifikovány. Výchozí hodnota může (nebo – podle nastavení – naopak nesmí) být hodnota NULL. Některé databázové stroje pro některé typy neumožňují nastavení výchozí hodnoty (např. MySQL pro typy text nebo blob).
NULL
editovatSloupce s tímto příznakem mají povoleno nabývat hodnotu NULL (která obecně vyjadřuje neznámou hodnotu). Toto pravidlo se v definici tabulkového sloupce uvede vložením klauzule NULL nebo NOT NULL. Pokud je NULL současně nastavena jako výchozí hodnota, znemožní to u daného sloupce, aby mohl být tento sloupec vynechán v neúplném INSERTu.
Pro celočíselné typy
editovatZpůsoby ukládání
editovatNěkteré databázové stroje nabízejí dva typy ukládání dat u celočíselných typů. A to buď binárně („čitelně pro počítač“), a nebo textově („čitelně pro člověka“). U těch, které to umožňují, je implicitní typ ukládání textové, ale dá se změnit klíčovým slovem BINARY na binární.
Příklad: číslo 2009 by bylo bez příznaku BINARY uloženo jako "2009" (tj. 32 30 30 39 hexadecimálně), a s příznakem BINARY jako 00 00 07 D9 hexadecimálně (0x07D9 = 2009). U řetězcových typů příznak BINARY znamená binárně přesné/citlivé porovnávání (některé databáze pro některé collations porovnávají bez ohledu na velikost písmen; u sloupce s příznakem BINARY je toto vyloučeno).
UNSIGNED
editovatCeločíselné typy jsou (obdobně jako např. v jazyku C) implicitně znaménkové (tedy jejich číselný rozsah je rozdělen na polovinu a sahá jak do kladných tak do záporných čísel), nicméně, lze vypnout a rozsah do kladných čísel tím zdvojznásobit, a to klíčovým slovem UNSIGNED – se samotnou hodnotou uloženou interně v databázi se neděje nic, pouze, jsou-li čísla uložena textově, není povoleno, aby začínaly unárním minusem, jsou-li uložena binárně, interpretují se jako bezznaménková. Nejnižší hodnota, kterou lze uložit, je nula.
- UNSIGNED TINYINT – rozsah 0 až 255.
- UNSIGNED SMALLINT – rozsah 0 až 65 535.
- UNSIGNED INT – rozsah 0 až 4 294 967 295.
- UNSIGNED BIGINT – rozsah 0 až 18 446 744 073 709 551 615.
Ostatní vlastnosti celočíselných typů
editovat- ZEROFILL – čísla interně doplňuje zleva nulami na zadaný rozsah (pouze u ukládání v textové podobě – v té binární se nulami doplňuje vždy)
- AUTO_INCREMENT – v této podobě je použit u MySQL, jiné databázové systémy mají obdobný atribut, např. příznak „Automatické číslo“ u databází Microsoft Access nebo řešení pomocí sekvence u PostgreSQL. Znamená, že hodnota takto označeného sloupce se při každém vložení nového záznamu inkrementuje (tj. zvýší o jedničku; u některých jiných databázových systémů je řešen jako posloupnost (pseudo)náhodných čísel, kdy se s každým novým řádkem vygeneruje jiná náhodná hodnota). Bývá používán výhradně s primárním klíčem.
Pro textové typy
editovatZnaková sada
editovatZnakovou sadu (v kombinaci s collation) dovoluje nastavit jen MySQL, ostatní systémy mají zpracování práci se znakovými sadami implementovány jinak, např. zvláštním typem (nchar) nastavením nad celou databází nebo jednotlivými tabulkami.
COLLATION
editovatCollation (anglicky shromažďování, český ekvivalent se nevžil) – definuje sadu pravidel pro vyhledávání a porovnávání dat podle daných zvyklostí a abecedy daného jazyka jako je:
- řazení písmen
- citlivost velkých/malých písmen (zda hraje roli nebo ne)
- zařazení písmen s diakritikou do „běžné“ abecedy (užitečné zejména při řazení)
- tolerance (zejména při hledání) znaků bez diakritiky vůči těm diakritickým (např. Ä vs. A)
- ekvivalence rozepsané a ztažené formy písmen s akcentem (např. Mueller vs. Müller)
- ekvivalence atypických znaků (např. ss vs. ß)
- ekvivalence slitků/ligatur (např. AE vs Æ)
- zařazení písmen tvořených dvěma znaky (např. české Ch bude mezi písmeny H a I)
- a další
Ostatní vlastnosti textových typů
editovat- typ MIME – pro typy blob – jakého MIME typu je uložený obsah (většinou, jedná-li se o obsah souboru); pouze u MySQL
Ostatní prvky definice sloupce
editovat- komentář – prostor, který je uložen pouze v definici tabulky (tj. neukládá se s každým řádkem), kam designér tabulky může uložit poznámku nebo vysvětlení k danému sloupci. Může být též použito jako nápovědný text ve formuláři k odpovídajícímu vstupnímu políčku.
- vstupní maska – u některých databází (MSSQL, Access) nabízí vstupní masku pro zadávání do formuláře; maska např. umí napovědět strukturu zadávané hodnoty, počet míst apod., zamezit vložení nesprávného znaku (např. písmeno místo číslice či naopak), zobrazit dodatečné formátování (např. lomítko u rodného čísla, přestože se toto lomítko neuloží), apod.
- povolený rozsah, vstupní podmínka, hláška pro vložení chybné hodnoty, … – prostředky, kterými databázový stroj (bez asistence externí databázové aplikace) může umět sám kontrolovat správnost dat při (interaktivním) vkládání.
Pole
editovatMožnost definovat sloupec jako pole nepatří mezi běžné vlastnosti dostupných databázových systémů, nicméně některé tuto možnost umožňují. Patří mezi ně mj. PostgreSQL, který podporuje i vícerozměrná pole.[1]