V tomto článku se zabývám konceptem surrogate keys v datovém skladu. Definici, výhody oproti přirozeným klíčům a metody generování.
Surrogate key je unikátní identifikátor záznamu (id). Je uměle generovaný a nemá žádný vztah k obsahu. Oproti tomu přirozený (složený) klíč má vazbu na existující data. Na generovávání surrogate key existují různé techniky jako auto inkrement, sekvence, UUID, hash, a pod.
Generování surrogate key
Auto-Increment,Identity
Většina databází umožňuje generování pomocí auto-incrementu nebo identity automaticky. Na pozadí bude většinou použita sekvence. V Postgres lze použít GENERATED AS IDENTITY.
CREATE TABLE SURROGATE_KEY_AUTO ( ID INT GENERATED ALWAYS AS IDENTITY, VAL VARCHAR(10) ); |
Možnost ALWAYS zajistí to, že pokud zkusím do tabulky vložit ID, tak se mi to nepovede. Sloupec je pouze generovaný automaticky a nemůžu ho nijak ovlivnit. ALWAYS lze nahradit hodnotou DEFAULT, která mi umožní INSERT i UPDATE hodnot v ID.
Sekvence
Teď se podíváme do pozadí předchozího způsobu. K inkrementálnímu generování čísel slouží objekt typu SEQUENCE. Při vytváření sekvence řeknu jakého má být typu (jen rozsah čísel), kde má začínat a jak velký je inkrement. Nastavit lze také zda je sekvence cyklická, minimální a maximální hodnotu. Následně se jen použije nextval() na získání hodnoty ze sekvence a ta se použije při INSERTu do tabulky.
/* Vytvoření sekvence */ CREATE SEQUENCE SURROGATE_KEY_SEQUENCE AS INT INCREMENT 1 START 1; /* Dotaz na následující hodnotu */ SELECT NEXTVAL('SURROGATE_KEY_SEQUENCE'); |
UUID surrogate key
UUID mají několik způsobů generování a generují se tak, aby byly unikátní na světě. Jde o 32 hexadecimálních číslic, oddělené pomlčkami do pěti skupin: 8-4-4-4-12 znaků. Například: 2fae6597-e17b-4c68-a767-1d574d9d7679.
Verze 1 používá kombinaci času a MAC adresy, verze 4 je náhodná, verze 3 a 5 používají hash.
/* Nejdříve je nutné nainstalovat rozšíření pro podporu UUID */ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; /* Vytvoření tabulky s UUID generováním */ DROP TABLE SURROGATE_KEY_UUID; CREATE TABLE SURROGATE_KEY_UUID ( ID uuid DEFAULT uuid_generate_v4() PRIMARY KEY, VAL VARCHAR(10) ); |
Business Key Hashing
Tato varianta vychází z přirozeného klíče v datech. Na daný klíč se použije hashovací funkce. Toto není čístý surrogate key, ale uvádím sem tuto možnost pro úplnost.
CREATE TABLE SURROGATE_KEY_HASH ( ID VARCHAR(255) PRIMARY KEY, BUSINESS_KEY VARCHAR(10) ); INSERT INTO SURROGATE_KEY_HASH (ID, BUSINESS_KEY) VALUES (sha256('KOKOS'), 'KOKOS') |
Výhody surrogate key
Surrogate keys jsou nezávislé na zdrojových systémech a změnách v nich.
Menší nároky na úložiště – hlavně číselné.
Lze pomocí nich lépe joinovat než oproti přirozeným klíčům.
Historizace (SCD) tabulek není tak komplikovaná jako se přirozeným klíčem.
Je to prostě jednodušší a efektivnější.
Shrnutí
Surrogate key je uměle generovaný klíč, který je nezávislý na datech zdrojového systému.
Má menší nároky na úložiště, je jednodušší, lze pomocí něj efektivně joinovat.
Existuje více způsobů generování surrogate key. Databáze generování obstará sama, generování pomocí sekvence a nebo UUID.
Dokumentace
Postgres CREATE TABLE s IDENTITY https://www.postgresql.org/docs/current/sql-createtable.html
Postgres SEQUENCE https://www.postgresql.org/docs/current/sql-createsequence.html
Postgres UUID https://www.postgresql.org/docs/current/functions-uuid.html
MSSQL IDENTITY https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-ver16
MSSQL SEQUENCE https://learn.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver16
Doporučené články
Co je to datový sklad (DWH)? – 1. díl
Základní tipy v datovém skladu (DWH) – 2. díl
Vrstvy datového skladu (DWH) – 3. díl
Pojmenovávání a dokumentace – 8. díl
Pokročilé agregační funkce – 10. díl
Následující Tipy a triky – 12. díl
Příklady
SELECT dotazování – 2. příklady