Databázový design se Supabase: Průvodce pro vibecodery bez SQL zkušeností
TL;DR
Databáze je srdce každé aplikace. V Supabase (PostgreSQL) navrhujte tabulky s uuid klíči, NOT NULL omezeními a DEFAULT hodnotami. Používejte cizí klíče pro relace, RLS politiky pro bezpečnost a indexy pro výkon. Nejčastější chyby: float pro ceny, chybějící RLS a CSV místo polí.

Proč potřebujete rozumět databázím i jako vibecoder
Vibecoding vám umožňuje vytvářet aplikace bez psaní kódu, ale databáze je srdce každé aplikace. Pokud špatně navrhnete strukturu dat, žádný AI nástroj to za vás neopraví. Podle analýzy Supabase (2025) je 67 % výkonnostních problémů v produkci způsobeno špatným databázovým designem, nikoli aplikačním kódem.
Supabase poskytuje PostgreSQL databázi s webovým rozhraním, automatickým API a Row-Level Security. Pro vibecodery je to ideální volba — dostanete plnohodnotnou relační databázi bez nutnosti spravovat servery. Ale musíte pochopit základní koncepty, abyste ji využili správně.
Základní koncepty: tabulky, sloupce, typy
Představte si databázi jako Excel spreadsheet na steroidech. Každá tabulka je jeden list, každý sloupec má přesně definovaný datový typ a každý řádek je jeden záznam. Klíčový rozdíl oproti Excelu: databáze vynucuje konzistenci dat.
Nejdůležitější datové typy v PostgreSQL:
uuid— unikátní identifikátor, ideální pro primární klíče (např.gen_random_uuid())text— textový řetězec bez omezení délky (jméno, popis, email)integer/bigint— celá čísla (cena v haléřích, počet položek)boolean— true/false (je_aktivní, je_publikováno)timestamp with time zone— datum a čas s časovou zónou (created_at, updated_at)jsonb— strukturovaná JSON data (nastavení, metadata, pole objektů)text[]— pole textových hodnot (tagy, dovednosti)
Jak navrhnout schéma: praktický příklad
Ukážeme si návrh databáze pro jednoduchý SaaS — aplikaci pro správu projektů. Postupujte vždy od business požadavků k tabulkám:
Krok 1: Identifikujte entity — Co v aplikaci existuje? Uživatelé, projekty, úkoly, komentáře.
Krok 2: Definujte relace — Jak spolu entity souvisí? Uživatel vlastní projekty. Projekt obsahuje úkoly. Úkol má komentáře.
Krok 3: Vytvořte tabulky
-- Projekty
CREATE TABLE projects (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
name text NOT NULL,
description text,
owner_id uuid NOT NULL,
status text DEFAULT 'active',
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now()
);
-- Úkoly
CREATE TABLE tasks (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
project_id uuid REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
title text NOT NULL,
completed boolean DEFAULT false,
assigned_to uuid,
due_date timestamptz,
priority text DEFAULT 'medium',
created_at timestamptz DEFAULT now()
);
Důležitá pravidla: Vždy používejte uuid jako primární klíč. Nastavujte NOT NULL na povinné sloupce. Používejte DEFAULT hodnoty, aby insert operace nevyžadovaly všechny sloupce. ON DELETE CASCADE zajistí, že smazání projektu automaticky smaže jeho úkoly.
Relace a cizí klíče (foreign keys)
Relace mezi tabulkami jsou klíčem k dobrému databázovému designu. V Supabase existují tři základní typy:
One-to-Many (1:N): Jeden projekt má mnoho úkolů. Řešení: cizí klíč project_id v tabulce tasks.
Many-to-Many (M:N): Úkol může mít více tagů a tag může být na více úkolech. Řešení: propojovací tabulka task_tags s dvěma cizími klíči.
One-to-One (1:1): Uživatel má jeden profil. Řešení: tabulka profiles s primárním klíčem id, který je zároveň cizím klíčem na auth.users.
Pozor: nikdy neukládejte data do auth.users tabulky přímo — je spravována Supabase. Vytvořte si vlastní tabulku profiles s referencí na auth.users.
Row-Level Security: Kdo co vidí
RLS je nejdůležitější bezpečnostní funkce Supabase. Bez RLS politik může kdokoli číst a zapisovat do vašich tabulek. S RLS definujete pravidla na úrovni řádků — každý uživatel vidí pouze svá data.
-- Zapnout RLS
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
-- Uživatel vidí pouze své projekty
CREATE POLICY "Users can view own projects"
ON projects FOR SELECT
USING (auth.uid() = owner_id);
-- Uživatel může vytvářet projekty
CREATE POLICY "Users can create projects"
ON projects FOR INSERT
WITH CHECK (auth.uid() = owner_id);
Důležité: RLS politiky se aplikují na KAŽDÝ dotaz, včetně těch z vaší aplikace. Vždy testujte s reálným uživatelem, ne s service_role klíčem, který RLS obchází.
Indexy a výkon
Indexy zrychlují vyhledávání v databázi. Představte si je jako rejstřík v knize — místo čtení celé knihy skočíte rovnou na správnou stránku. Supabase automaticky vytváří index na primární klíč, ale pro filtrování a řazení potřebujete další:
-- Index pro rychlé filtrování úkolů podle projektu
CREATE INDEX idx_tasks_project_id ON tasks(project_id);
-- Index pro vyhledávání podle statusu
CREATE INDEX idx_projects_status ON projects(status);
-- Kompozitní index pro časté dotazy
CREATE INDEX idx_tasks_project_completed ON tasks(project_id, completed);
Pravidlo: vytvářejte indexy na sloupce, podle kterých často filtrujete (WHERE), řadíte (ORDER BY) nebo spojujete tabulky (JOIN). Ale nepřehánějte — každý index zpomaluje zápis.
5 nejčastějších chyb v databázovém designu
- Ukládání cen jako float: Vždy používejte integer v nejmenší jednotce (haléře, centy). Float způsobuje zaokrouhlovací chyby.
- Chybějící updated_at trigger: Vytvořte trigger, který automaticky aktualizuje updated_at při každé změně záznamu.
- Ukládání polí jako CSV text: Místo "tag1,tag2,tag3" používejte text[] pole nebo propojovací tabulku.
- Ignorování nullable: Pokud sloupec nemá default a není NOT NULL, bude obsahovat NULL hodnoty, které komplikují dotazy.
- Nepoužívání ON DELETE CASCADE: Bez něj zůstanou v databázi osiřelé záznamy po smazání rodičovského záznamu.
Často kladené otázky
Zdroje
- [1]Supabase Documentation: Database— Supabase Team
- [2]PostgreSQL Data Types— PostgreSQL Global Development Group
- [3]Supabase Row Level Security Guide— Supabase Team
Štítky
Chcete se stát vibecoderem?
Zaregistrujte se a získejte přístup k práci, kurzům a komunitě.
Vytvořit účet zdarma