Zpravy

Jaké typy sloupců existují?

Poznámka: Několik částí této specifikace bylo aktualizováno jinými specifikacemi. Seznam specifikací a sekcí, které nahrazují, naleznete v části „Cascading Style Sheets (CSS) – The Official Definition“ v nejnovějším snímku CSS.

Pracovní skupina CSS také vyvíjí verzi 2 CSS úrovně 2 (CSS 2.2).

17.1 Úvod do tabulek

Tato kapitola definuje model zpracování pro tabulky v CSS. Součástí tohoto modelu zpracování je rozvržení. Pro rozvržení tato kapitola představuje dva algoritmy; první, algoritmus pevného rozvržení tabulky, je dobře definován, ale druhý, algoritmus automatického rozvržení tabulky, není touto specifikací plně definován.

U algoritmu automatického rozvržení tabulek dosáhly některé široce nasazené implementace relativně úzké interoperability.

Rozvržení tabulky lze použít k reprezentaci tabulkových vztahů mezi daty. Autoři tyto vztahy specifikují v jazyce dokumentu a mohou je specifikovat představení pomocí CSS 2.1.

Ve vizuálním médiu lze k dosažení konkrétních rozvržení použít také tabulky CSS. V tomto případě by autoři neměli používat prvky související s tabulkami v jazyce dokumentu, ale měli by aplikovat CSS na příslušné strukturální prvky, aby dosáhli požadovaného rozvržení.

Autoři mohou určit vizuální formátování tabulky jako obdélníkovou mřížku buněk. Řádky a sloupce buněk lze organizovat do skupin řádků a skupin sloupců. Řádky, sloupce, skupiny řádků, skupiny sloupců a buňky mohou mít kolem sebe nakreslené ohraničení (v CSS 2.1 existují dva modely ohraničení). Autoři mohou zarovnat data svisle nebo vodorovně v rámci buňky a zarovnat data ve všech buňkách řádku nebo sloupce.

Zde je jednoduchá tabulka se třemi řádky a třemi sloupci popsaná v HTML 4:

Záhlaví 1 Buňka 1 Buňka 2 Záhlaví 2 Buňka 3 Buňka 4 Záhlaví 3 Buňka 5 Buňka 6
Jedná se o jednoduchý stůl 3x3

Tento kód vytvoří jednu tabulku (prvek TABLE), tři řádky (prvky TR), tři buňky záhlaví (prvky TH) a šest datových buněk (prvky TD). Všimněte si, že tři sloupce tohoto příkladu jsou specifikovány implicitně: v tabulce je tolik sloupců, kolik vyžadují buňky záhlaví a dat.

Následující pravidlo CSS vycentruje text vodorovně v buňkách záhlaví a zobrazí text v buňkách záhlaví s tučnou tloušťkou písma:

Následující pravidla zarovnají text buněk záhlaví na jejich účaří a svisle vycentrují text v každé datové buňce:

Další pravidla určují, že horní řádek bude ohraničen 3px plným modrým rámečkem a každý z ostatních řádků bude ohraničený 1px plným černým rámečkem:

Všimněte si však, že okraje kolem řádků se překrývají tam, kde se řádky setkávají. Jakou barvu (černá nebo modrá) a tloušťku (1 pixel nebo 3 pixely) bude mít hranice mezi řádky 1 a 2? Diskutujeme o tom v části o řešení konfliktů na hranicích.

Následující pravidlo umístí popisek tabulky nad tabulku:

Předchozí příklad ukazuje, jak CSS pracuje s prvky HTML 4; v HTML 4 je sémantika různých prvků tabulky (TABLE, CAPTION, THEAD, TBODY, TFOOT, COL, COLGROUP, TH a TD) dobře definovaná. V jiných jazycích dokumentů (jako jsou aplikace XML) nemusí být předdefinované prvky tabulky. Proto CSS 2.1 umožňuje autorům „mapovat“ prvky jazyka dokumentu na prvky tabulky prostřednictvím vlastnosti „display“. Například podle následujícího pravidla se prvek FOO chová jako prvek HTML TABLE a prvek BAR jako prvek CAPTION:

Přečtěte si více
Včely jsou zázrak přírody

V následující části diskutujeme o různých prvcích tabulky. V této specifikaci termín odkazuje na jakýkoli prvek zapojený do vytváření tabulky. An je taková, která vytváří řádek, skupinu řádků, sloupec, skupinu sloupců nebo buňku.

17.2 Model tabulky CSS

Tabulkový model CSS je založen na tabulkovém modelu HTML4, ve kterém struktura tabulky úzce souvisí s vizuálním rozložením tabulky. V tomto modelu se tabulka skládá z volitelného titulku a libovolného počtu řádků buněk. O tabulkovém modelu se říká, že je „řádkový primární“, protože autoři určují řádky, nikoli sloupce, explicitně v jazyce dokumentu. Sloupce jsou odvozeny, jakmile jsou specifikovány všechny řádky – první buňka každého řádku patří do prvního sloupce, druhá do druhého sloupce atd.). Řádky a sloupce mohou být strukturálně seskupeny a toto seskupení se odráží v prezentaci (např. kolem skupiny řádků může být nakresleno ohraničení).

Model tabulky se tedy skládá z tabulek, titulků, řádků, skupin řádků (včetně skupin záhlaví a zápatí), sloupců, skupin sloupců a buněk.

Model CSS nevyžaduje, aby jazyk dokumentu obsahoval prvky, které odpovídají každé z těchto komponent. U jazyků dokumentů (jako jsou aplikace XML), které nemají předdefinované prvky tabulky, musí autoři namapovat prvky jazyka dokumentu na prvky tabulky; to se provádí pomocí vlastnosti ‚display‘. Následující hodnoty „zobrazení“ přiřazují pravidla formátování tabulky libovolnému prvku: tabulka (V HTML: TABLE) Určuje, že prvek definuje tabulku na úrovni bloku: je to obdélníkový blok, který se účastní kontextu formátování bloku. inline-tabulka (V HTML: TABLE) Určuje, že prvek definuje tabulku na úrovni řádku: je to obdélníkový blok, který se podílí na kontextu inline formátování. tabulka-řádek (V HTML: TR) Určuje, že prvek je řádek buněk. tabulka-řádek-skupina (V HTML: TBODY) Určuje, že prvek seskupuje jeden nebo více řádků. table-header-group (V HTML: THEAD) Podobně jako ‚table-row-group‘, ale pro vizuální formátování je skupina řádků vždy zobrazena před všemi ostatními řádky a skupinami řádků a za všemi horními titulky. Agenti tisku mohou opakovat řádky záhlaví na každé stránce rozložené tabulkou. Pokud tabulka obsahuje více prvků s ‚display: table-header-group‘, pouze první se vykreslí jako záhlaví; s ostatními se zachází, jako by měly „zobrazení: skupina-řádek-tabulka-skupina“. table-footer-group (V HTML: TFOOT) Podobně jako ‚table-row-group‘, ale pro vizuální formátování je skupina řádků vždy zobrazena za všemi ostatními řádky a skupinami řádků a před všemi spodními titulky. Agenti tisku mohou opakovat řádky zápatí na každé stránce rozložené tabulkou. Pokud tabulka obsahuje více prvků s ‚display: table-footer-group‘, pouze první se vykreslí jako zápatí; s ostatními se zachází, jako by měly „zobrazení: skupina-řádek-tabulka-skupina“. sloupec tabulky (V HTML: COL) Určuje, že prvek popisuje sloupec buněk. tabulka-sloupec-skupina (V HTML: COLGROUP) Určuje, že prvek seskupuje jeden nebo více sloupců. buňka tabulky (V HTML: TD, TH) Určuje, že prvek představuje buňku tabulky. popis tabulky (V HTML: CAPTION) Určuje popisek pro tabulku. Všechny prvky s ‚display: table-caption‘ musí být vykresleny, jak je popsáno v sekci 17.4.

Přečtěte si více
Jaké odrůdy rajčat je nejlepší pěstovat na balkoně?

Nahrazené prvky s těmito hodnotami „zobrazení“ jsou během rozvržení považovány za jejich dané typy zobrazení. Například obrázek, který je nastaven na „zobrazit: buňku tabulky“, vyplní dostupný prostor buňky a jeho rozměry mohou přispívat k algoritmům pro velikost tabulky, jako je tomu u běžné buňky.

Prvky s ‚display‘ nastaveným na ‚table-column‘ nebo ‚table-column-group‘ se nevykreslují (přesně jako kdyby měly ‚display: none‘), ale jsou užitečné, protože mohou mít atributy, které vyvolávají styl pro sloupce, které představují.

Výchozí šablona stylů pro HTML4 v dodatku ilustruje použití těchto hodnot pro HTML4:

Uživatelští agenti mohou tyto hodnoty vlastností „zobrazit“ pro prvky tabulky HTML ignorovat, protože tabulky HTML lze vykreslovat pomocí jiných algoritmů určených pro zpětně kompatibilní vykreslování. To však nemá za cíl odrazovat od používání výrazu „zobrazit: tabulka“ na jiných prvcích HTML, než jsou tabulky.

17.2.1 Anonymní objekty tabulky

Pro účely těchto pravidel jsou definovány následující pojmy: skupina řádků A ‚skupina-řádků-tabulky‘, ‚skupina-záhlaví-tabulky‘ nebo ‚skupina-zápatí-tabulky‘ vlastní podřízená tabulka A ‚řádek-tabulky‘ rámeček, rámeček skupiny řádků, rámeček „tabulka-sloupec“, rámeček „skupina sloupců tabulky“ nebo rámeček „titulku tabulky“. správný rodič řádku tabulky A rámeček „tabulka“ nebo „vložená tabulka“ nebo rámeček skupiny řádků interní rámeček tabulky Rámeček ‚buňka tabulky‘, rámeček ‚řádek tabulky‘, rámeček skupiny řádků, rámeček ‚sloupec tabulky‘ nebo ‚ table-column-group‘ box. tabulkový kontejner Pole ‚řádek tabulky‘ nebo správný nadřazený řádek tabulky po sobě Dva sourozenecké boxy jsou po sobě jdoucí, pokud nemají žádné zasahující sourozence kromě, volitelně, anonymního řádku obsahujícího pouze mezery. Posloupnost sourozeneckých políček je po sobě jdoucí, pokud každé políčko v posloupnosti následuje za tím, který je před ním v posloupnosti.

Pro účely těchto pravidel jsou out-of-flow prvky reprezentovány jako inline prvky s nulovou šířkou a výškou. Podle toho se volí bloky, které obsahují.

  1. Odstraňte nepodstatná políčka:
    1. Se všemi podřízenými boxy nadřazeného „sloupce tabulky“ se zachází, jako by měly „zobrazit: žádné“.
    2. Pokud potomek C nadřazené skupiny ‚tabulka-sloupec-skupina‘ není polem ‚sloupec tabulky‘, pak se s ním zachází, jako by měl ‚zobrazit: žádný‘.
    3. Pokud je potomkem C tabulkového kontejneru P anonymní vložený rámeček, který obsahuje pouze prázdné místo, a jeho bezprostředně předcházející a následující sourozenci, pokud existují, jsou správnými potomky tabulky P a jsou buď „titulem tabulky“ nebo interními rámečky tabulky, pak se s ním zachází, jako by měl „zobrazit: žádný“. Box D je správným potomkem tabulky A, pokud D může být potomkem A, aniž by způsobil generování jakýchkoli zasahujících polí „tabulky“ nebo „vložené tabulky“.
    4. Pokud je rámeček B anonymní vložený řádek obsahující pouze prázdné místo a nachází se mezi dvěma bezprostředními sourozenci, z nichž každý je buď interním rámečkem tabulky, nebo rámečkem „titulku tabulky“, pak se s B zachází, jako by měl „zobrazit: žádný“.
    1. Pokud potomek C pole ‚tabulka‘ nebo ‚vložená tabulka‘ není správným potomkem tabulky, pak vygenerujte anonymní rámeček ‚řádek tabulky‘ kolem C a všech po sobě jdoucích sourozenců C, kteří nejsou správnými potomky tabulky.
    2. Pokud potomek C skupinového rámečku řádků není rámeček ‚řádek tabulky‘, vygenerujte anonymní rámeček ‚řádek tabulky‘ kolem C a všech po sobě jdoucích sourozenců C, kteří nejsou rámečky ‚řádek tabulky‘.
    3. Pokud potomek C pole ‚řádek tabulky‘ není ‚buňka tabulky‘, vygenerujte anonymní rámeček ‚buňka tabulky‘ kolem C a všech po sobě jdoucích sourozenců C, kteří nejsou rámečky ‚buňka tabulky‘.
    1. Pro každý rámeček „buňka tabulky“ C v posloupnosti po sobě jdoucích vnitřních sourozenců tabulky a „titulek tabulky“, pokud rodič C není „řádek tabulky“, vygenerujte anonymní rámeček „řádek tabulky“ kolem C a všichni po sobě jdoucí sourozenci C, kteří jsou boxy „tabulkové buňky“.
    2. Pro každého správného potomka tabulky C v posloupnosti po sobě jdoucích správných potomků tabulky, je-li C chybně zpřehledněn, vygenerujte anonymní ‚tabulku‘ nebo ‚inline-tabulku‘ rámeček T kolem C a všech po sobě jdoucích sourozenců C, kteří jsou správnými potomky tabulky. (Pokud je rodič C ‚inline‘ box, pak T musí být ‚inline-table‘ box; jinak to musí být ‚table‘ box.)
      • ‚řádek-tabulky‘ je nesprávně orientovaný, pokud jeho nadřazeným prvkem není ani pole skupiny řádků, ani pole „tabulka“ nebo „vložená tabulka“.
      • Pole „sloupec-tabulka“ je nesprávně orientované, pokud jeho nadřazeným prvkem není ani pole „skupina sloupců tabulky“, ani pole „tabulka“ nebo „vložená tabulka“.
      • Rámeček skupiny řádků, rámeček ‚tabulka-sloupec-skupina‘ nebo rámeček ‚titulku-tabulky‘ je nesprávně umístěn, pokud jeho nadřazeným prvkem není rámeček ‚tabulka‘ ani rámeček ‚vložená tabulka‘.

    V tomto příkladu XML se předpokládá, že prvek ‚table‘ obsahuje prvek HBOX:

    George 4287 1998  

    protože přidružená šablona stylů je:

    Komplexní průvodce generovanými sloupci v MySQL

    Přidal Sergey Moiseenko v sobotu 3. prosince. 2022

    Generované sloupce v MySQL jsou umístěny jako výkonný, snadno použitelný a pokročilý nástroj, který vám umožňuje přidávat automaticky generovaná data do vašich tabulek. Zde se naučíme vše, co potřebujete vědět, abyste s nimi mohli pracovat.

    Vygenerované sloupce umožňují ukládat automaticky generovaná data do tabulky bez použití klauzulí INSERT a UPDATE. Tato užitečná funkce je součástí MySQL od verze 5.7 a poskytuje alternativu ke spouštěčům pro generování dat. Vygenerované sloupce vám navíc mohou pomoci napsat jednodušší a efektivnější dotaz.

    Co je vygenerovaný sloupec v MySQL?

    Vygenerovaný sloupec je podobný běžnému sloupci, ale jeho hodnoty nelze ručně změnit. Důvodem je, že základní výraz definuje, jak je hodnota generována na základě jiných hodnot, které jsou převzaty z jiných sloupců ve stejném řádku. Vygenerovaný sloupec tedy funguje v rámci tabulky a jeho definice nemůže obsahovat příkazy JOIN.

    Jinými slovy, vygenerovaný sloupec si můžete představit jako zobrazení, které je omezeno na sloupce. Všimněte si, že generované sloupce se liší od spouštěčů SQL a můžete je definovat pouze pomocí příkazů CREATE TABLE nebo ALTER TABLE s použitím následující syntaxe:

    generovat_název_sloupce typ_sloupce [GENERATED ALWAYS] AS (výraz_generace) 
    [VIRTUÁLNÍ | ULOŽENO] [NOT NULL | NULL]
    [JEDINEČNÝ [KLÍČ]] [[PRIMÁRNÍ] KLÍČ][KOMENTÁŘ 'řetězec']

    Klauzule AS (generated column expression) určuje, že sloupec, který přidáváte nebo aktualizujete, je generovaný sloupec. generation_expression definuje výraz, který MySQL použije k výpočtu hodnot sloupce, a nemůže odkazovat na jiný vygenerovaný sloupec ani na nic jiného než na sloupce v aktuální tabulce. Všimněte si také, že generovací výraz může obsahovat pouze neměnné funkce. Nemůžete například použít funkci ve vygenerovaném sloupci, který vrací aktuální datum, protože jde o měnitelnou funkci.

    AS můžete také předřadit klíčová slova GENERATED ALWAYS, aby byla vygenerovaná povaha sloupce jasnější, ale není to nutné. Poté můžete určit, zda je vygenerovaný sloupec VIRTUÁLNÍ nebo STORED. Rozdíl mezi těmito dvěma typy prozkoumáme v příštím díle. Ve výchozím nastavení, pokud to není v dotazu výslovně uvedeno, MySQL označí vygenerovaný sloupec jako VIRTUÁLNÍ.

    Nyní se podívejme na vygenerovanou syntaxi sloupce v akci v dotazu CREATE TABLE:

    Uživatelé CREATE TABLE ( 
    id INT AUTO_INCREMENT PRIMÁRNÍ KLÍČ,
    email VARCHAR(100) NOT NULL,
    jméno VARCHAR(60) NOT NULL,
    příjmení VARCHAR(60) NOT NULL,
    celé_jméno varchar(120) GENEROVÁNO VŽDY JAKO (CONCAT(křestní_jméno, ' ', příjmení))
    );

    V tomto příkladu sloupec full_name automaticky zřetězí sloupce first_name a last_name.

    Jaké typy generovaných sloupců jsou v MySQL?

    MySQL ukládá jakýkoli vygenerovaný sloupec, který je označen STORED. To znamená, že MySQL se postará o výpočet hodnoty a její uložení na disk, kdykoli vložíte nebo aktualizujete řádek. Jinými slovy, trvalý sloupec vyžaduje místo na disku, stejně jako běžný sloupec.

    Porovnání virtuálních a trvalých generovaných sloupců

    Pojďme si nyní zhodnotit klady a zápory virtuálních a persistentních generovaných sloupců.

    Virtuálně generované sloupce

    • Jejich vytvoření je okamžité, protože MySQL musí změnit pouze metadata tabulky.
    • Nevyžadují místo na disku.
    • Dotazy INSERT a UPDATE nepředstavují další režii, protože je MySQL nemusí generovat.
    • MySQL je musí počítat při čtení tabulky, což zpomaluje SELECT dotazy obsahující tyto sloupce.

    Trvale generované sloupce

    • MySQL je dokáže číst jako běžné sloupce, což zajišťuje rychlé načítání dat bez další režie.
    • Při přidávání do nové tabulky musí MySQL přestavět celou tabulku.
    • INSERT nebo UPDATE způsobuje další režii, protože MySQL musí generovat hodnoty.
    • Vyžadují místo na disku.

    Proč používat generované sloupce?

    • V kombinaci s ukládáním do mezipaměti poskytují rychlejší provádění dotazů.: Generované sloupce vám dávají možnost definovat sloupce, které obsahují užitečná data, abyste je pak mohli podle potřeby načíst.
    • Umožňují vám zjednodušit výrazy dotazů: Místo vytváření složitých dotazů můžete složitost přenést do vygenerovaných sloupců a poté je použít v jednoduchých operacích filtrování.
    • Umožňují definovat funkční indexy: MySQL implementuje funkční indexy jako skryté virtuální generované sloupce. Jinými slovy, vygenerované sloupce vám dávají možnost definovat efektivní a pokročilé indexy, které zahrnují funkce MySQL.

    MySQL generovalo sloupce v akci na skutečných příkladech

    Nyní se podívejme na některé příklady vygenerovaných sloupců, které jsem použil jako backendový vývojář ve spouštěcích projektech řízených daty.

    Použití vygenerovaného sloupce ke zřetězení sloupců pro účely konzistence

    Při vývoji frontendu vaší aplikace si můžete všimnout určitých vzorců v prezentaci dat. Například ve sportu jsou hráči v týmu obvykle identifikováni pomocí následujícího formátu:

    jméno [first_character_middle_name.] last_name [(číslo_dresu)]

    Jak vidíte, toto datové pole můžete snadno vygenerovat agregací čtyř sloupců v následujícím vygenerovaném sloupci:

    identifikátor_řetězce VARCHAR(255) GENERATED ALWAYS AS 
    (CONCAT(křestní_jméno, ' ', IF(prostřední_jméno JE NULL, '', CONCAT(LEFT(prostřední_jméno, 1); '. ')), příjmení, IF(číslo_dresu JE NULL, '', CONCAT(' (', číslo_ dresu) , ')'))))
    SKLADOVÁNO

    V důsledku toho dostaneme:

    Ronaldo (7) 
    Lionel A. Messi (10)

    V tomto případě vygenerovaný sloupec umožňuje standardizovat formát datového pole přímo na úrovni databáze. Uložením vygenerovaného sloupce se navíc vyhnete režii při vytváření pole při každém přístupu.

    Použití vygenerovaného sloupce k automatickému generování hash ID

    K načtení požadovaných dat obvykle používáte ID zdrojů v adrese URL vašeho webu nebo rozhraní REST API. Ale odhalení vašich ID může způsobit bezpečnostní problémy. To platí zejména, když generujete ID pomocí automatického přírůstku, který lze snadno předvídat a usnadňuje seškrabování nebo útoky botů.

    Abyste tomu zabránili, můžete zvážit skrytí původních ID pomocí automaticky náhodně generovaných, bezpečnějších veřejných ID. Můžete to udělat pomocí virtuálního vygenerovaného sloupce, který má ID takto:

    public_id VARCHAR(40) VYGENEROVÁNO VŽDY JAKO SHA1(CONCAT("PLAYER", id)) VIRTUAL

    Všimněte si, že abyste se vyhnuli generování známých hodnot hash, můžete ID zřetězit s nějakým klíčovým slovem. Zde se dozvíte více o funkcích šifrování a komprese v MySQL.

    Definování generovaného sloupce pro zjednodušení filtrování dat

    Při filtrování dat jsou některé sloupce užitečnější než jiné. Navíc často potřebujete změnit reprezentaci hodnot uložených ve sloupcích, aby bylo filtrování jednodušší nebo intuitivnější. Místo toho, abyste to dělali v každém filtrovacím dotazu, můžete definovat užitečný generovaný sloupec, který obsahuje informace ve formátu, který chcete filtrovat.

    Můžete například definovat takto vygenerovaný sloupec, abyste snáze našli hráče v basketbalovém týmu:

    řetězec_filtru VARCHAR(255) GENEROVÁNO VŽDY JAKO 
    (CONCAT(křestní_jméno, ' ', příjmení, IF(datum narození JE NULL, '', CONCAT(' ', DATE_FORMAT(datum narození, "%m-%d-%Y"))))
    SKLADOVÁNO

    Takový sloupec produkuje:

    LeBron James 12 
    Stephen Curry 03

    Taková data budou užitečná pro filtrování podle narozenin hráče v americkém formátu.

    Generované sloupce vs. spouštěče

    Jak bylo vysvětleno dříve, v tabulce můžete použít pouze vygenerované sloupce. Mohou také obsahovat pouze neměnné funkce a MySQL generuje jejich hodnoty jako odpověď na dotaz INSERT nebo UPDATE. Na druhé straně je spouštěč uložený program, který MySQL automaticky spustí, když nastane událost INSERT, UPDATE nebo DELETE spojená s konkrétní tabulkou. Jinými slovy, spouštěče mohou ovlivnit více tabulek a všechny funkce MySQL. To z nich dělá obecnější řešení než generované sloupce. Současně jsou spouštěče MySQL ze své podstaty složitější na použití a definování a jsou pomalejší než generované sloupce.

    Sloupce generované MySQL jsou nepochybně skvělým nástrojem, který může sloužit různým účelům a poskytovat určité výhody. Jejich použití je snadné a efektivní, i když je používá jen málo vývojářů databází. Ať tak či onak, vědět, jak těžit z jejich používání, může být zásadní pro vývoj rychlejšího, čistšího a méně komplexního aplikačního backendu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button