Slovník pojmů

Primární klíč

Primární klíč určuje identitu záznamu pro databázi a vztahy. Není to oprávnění k jeho zobrazení ani automaticky veřejný identifikátor.

Stručná definice

Jedna stabilní identita řádku.

Primární klíč označuje hlavní identitu řádku. Je užitečný pro aktualizace, mazání, cizí klíče i ORM, protože aplikace ví, na který záznam přesně míří. Tabulka má jeden primární klíč, ale může být složený z více sloupců.

V PostgreSQL primární klíč vynucuje jedinečnost i NOT NULL a pro něj vytváří unikátní B-tree index. To je konkrétní chování PostgreSQL; obecný návrh nemá předpokládat, že každá databáze má shodné implementační detaily.

Jaký problém řeší

Jednoznačné propojení a změny záznamů

Primární klíč brání tomu, aby aplikace upravila „nějakou podobnou“ objednávku místo konkrétního řádku.

  • identita objednávky, zákazníka, produktu či importu
  • cíl cizího klíče z položek objednávky
  • mapování identity entity v ORM
  • stabilní interní odkaz při změnách a auditu
  • rozlišení interního ID, veřejného UUID a externího marketplace ID

SQL ukázka

PostgreSQL: interní a business identity objednávky

Ukázka používá PostgreSQL identity sloupec. Primární klíč je id, ostatní jedinečné hodnoty chrání samostatná pravidla.

CREATE TABLE orders (
    id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    public_id uuid NOT NULL UNIQUE,
    marketplace_code text NOT NULL,
    external_order_id text NOT NULL,
    order_number text NOT NULL UNIQUE,
    UNIQUE (marketplace_code, external_order_id)
);

Jak funguje

Od vytvoření objednávky k jejím vazbám

Textová alternativa: primární klíč propojuje data; přístup ke konkrétní objednávce stále ověřuje autorizace.

  1. Vznik objednávky Databáze vytvoří nebo přijme stabilní identitu, například číslo nebo UUID.
  2. Jednoznačný řádek Primární klíč nedovolí uložit druhý řádek se stejnou hlavní identitou ani hodnotu NULL.
  3. Navazující položky order_items.order_id může na primární klíč objednávky odkazovat cizím klíčem.
  4. Další identity Číslo objednávky, veřejné UUID a externí ID mohou být samostatné unikátní business údaje.
  5. Autorizace Server kromě nalezení ID kontroluje uživatele, tenant a oprávnění k operaci.

Důležité pojmy

Identita může mít několik rozumných podob.

Volba se řídí stabilitou hodnoty, vazbami, integracemi a způsobem publikování.

Jednoduchý a složený klíč

Jednoduchý klíč je jeden sloupec. Složený klíč obsahuje více sloupců, například dvojici order_id a product_id ve spojovací tabulce.

Přirozený a umělý klíč

Přirozený klíč existuje v doméně, například stabilní kód. Umělý neboli surrogate klíč je technická identita. Žádný není univerzálně lepší.

Sekvence a UUID

Sekvenční integer se jednoduše generuje. UUID může být vhodný pro distribuované vytváření nebo veřejné adresy, ale sám neřeší autorizaci.

Unikátní constraint

Tabulka smí mít více unikátních pravidel, ale jen jeden primární klíč. Unikátní business kód proto nemusí být hlavní identitou.

ORM identita

ORM pracuje s identitou entity, ale nenahrazuje databázový constraint ani rozhodnutí, který údaj je stabilní.

Vztah k podobným pojmům

Klíč, business údaj a přístup jsou odlišné vrstvy.

Jedno ID může mít technickou, veřejnou i integrační roli, které je vhodné nerozmělňovat.

Cizí klíč
Odkazuje na primární nebo jiný vhodný unikátní klíč a chrání referenční integritu.
Databázový constraint
PRIMARY KEY je jeden z constraintů a prohlásí hlavní identitu řádku.
Databázový index
V PostgreSQL se pro primární klíč vytvoří unikátní index; index ale není sám o sobě autorizace.
Doctrine ORM
Mapuje identitu entity, pracuje však nad databázovou identitou a jejími pravidly.

Výhody a omezení

Správná identita není bezpečnostní hranice.

Přínosy

  • jednoznačné cílení update a delete
  • bezpečný cíl pro vztahy mezi tabulkami
  • jasná dokumentace hlavní identity modelu
  • podpora ORM a konzistentních importů

Časté chyby

  • tvrzení, že primární klíč musí být autoincrement číslo
  • použití měnícího se business údaje jako neměnné identity
  • považování UUID za autorizaci nebo ochranu dat
  • vystavení sekvenčního ID bez zvážení informačního úniku
  • nepromyšlený složený klíč, který se propíše do všech vztahů

Praktický příklad

Jedna objednávka, čtyři odlišné identifikátory

Objednávka může mít interní primární klíč id, veřejné public_id typu UUID, order_number pro obchodní komunikaci a dvojici marketplace_code plus external_order_id pro idempotentní import. Každý údaj má jiný účel; není nutné z nich uměle dělat tutéž hodnotu.

Pokud se veřejné UUID dostane do URL, server stále ověřuje, zda na objednávku smí nahlížet přihlášená identita v konkrétním tenantovi.

Na co myslet

Zvolte identitu podle stability a role.

Klíč se časem propíše do vazeb, migrací, API a reportů, proto má být jeho význam explicitní.

  • rozlišit technickou identitu, veřejný odkaz a integrační business identifikátor
  • použít UNIQUE pro další jedinečné údaje
  • u složeného klíče zhodnotit dopad na všechny navazující cizí klíče
  • neodvozovat oprávnění pouze z toho, že klient zná ID
  • zohlednit přístupové vzory a indexy při volbě generování identity

Časté otázky

Primární identita v praxi

Musí být primární klíč autoincrement?

Ne. Může to být UUID, přirozená stabilní hodnota nebo složená kombinace sloupců.

Může tabulka mít více primárních klíčů?

Ne. Má jeden primární klíč, který ovšem může obsahovat více sloupců. Další jedinečné údaje chrání UNIQUE constrainty.

Je číslo objednávky vhodný primární klíč?

Jen pokud je dlouhodobě neměnné a odpovídá potřebám modelu. Často je výhodnější samostatný technický klíč a číslo objednávky jako unikátní business údaj.

Chrání UUID před čtením cizí objednávky?

Ne. Neodhadnutelný identifikátor nenahrazuje serverovou kontrolu autorizace.

Jak tento princip používám v praxi

Identity odděluji podle jejich skutečného účelu.

V e-commerce a integracích řeším interní, veřejné i externí identifikátory spolu s databázovými pravidly pro bezpečné změny a retry.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.