Databázové schéma

Databázové schéma Pedia.dog (MVP)

Návrh „kartotéky" celého MVP — jaké šanony (tabulky) v databázi budou, co v nich bude a jak jsou pospojované. Návrh celý dopředu, protože změny schématu uprostřed projektu jsou drahé. Pro chovatelku laicky, pro programátora dostatečně přesně.

30 tabulek (šanonů)
6 logických skupin
~3 dny návrhu + revize

Co je databáze a schéma (lajtsky)

Databáze je velká kartotéka v počítači. Místo papírových šanonů má tabulky — každá tabulka je jeden „šanon" na konkrétní typ informací (uživatelé, stanice, psi, vrhy, štěňata…).

Schéma je návrh té kartotéky — jaké šanony tam budou, jaké kolonky bude každý mít a jak jsou pospojované. Příklad propojení: kolonka majitel_id v tabulce psi řekne počítači „tenhle pes patří uživatelce číslo 42" — a tak jsou tabulky vzájemně propojené.

⚠️ Proč navrhnout všechno najednou? Když to později předěláváte, musíte převést stávající data, přepsat stovky řádků kódu a rozházíte si průběžnou práci. Jeden přepis = klidně týden navíc. Proto sedíme nad schématem 2–3 dny předem.

👥 Lidé 2 tabulky

uzivatele

Každý, kdo se zaregistruje (chovatelka, zájemce o štěně, admin). Jedna tabulka pro obě role — liší se sloupcem role.

SloupecTypPopis
idčíslojedinečné ID uživatele
emailtexte-mail (unikátní)
telefontexttelefon pro SMS ověření
heslo_hashtextzahashované heslo (bcrypt / Argon2) — nikdy v čisté podobě
rolevýběrchovatelka / zajemce / admin
typ_registracevýběrzakladajici / bezny (z URL ?zdroj=...)
email_overen_atdatum/nullkdy potvrdila e-mail
sms_overena_atdatum/nullkdy potvrdila SMS
schvalen_adminem_atdatum/nulljen pro chovatelky (admin ručně ověří)
jmeno, prijmeni, fototext/urlosobní údaje
vytvoreno_at, upraveno_atdatumprovozní
smazan_atdatum/nullsoft delete (GDPR)

gdpr_souhlasy

Log, kdo s čím souhlasil. Kvůli GDPR — když se někdo na něco zeptá, musíme dokázat, že souhlas byl udělen vědomě.

SloupecTypPopis
idčíslo
uzivatel_id→ uzivatelekdo souhlasil
typvýběrobchodni_podminky / cookies / newsletter…
znenitextpřesné znění v době souhlasu (může se měnit)
ip, user_agenttextz jakého počítače
datumdatum

🏠 Stanice 4 tabulky

stanice

Profil chovatelské stanice — jediná tvář navenek. Jeden uživatel = max jedna stanice.

SloupecTypPopis
idčíslo
uzivatel_id→ uzivatelekdo stanici vlastní
nazev_predlozkatextnapř. „od", „z", „ze"
nazev_jmenotextnapř. „Růžových strání"
popistext (1500 zn.)jedno textové pole, min 50 zn.
hlavni_fotourltitulní fotka
certifikatano/nebez certifikátu profil zůstane soukromý
certifikat_dokladurlnahraný doklad o certifikátu
ulice, mesto, psc, zeme, regiontextadresa
viditelnost_adresyvýběrregion_only / full
verejnyano/nezda je profil veřejně viditelný
vytvoreno_at, upraveno_atdatum

stanice_plemena

Propojka: která stanice chová která plemena. Jedna stanice může mít víc plemen, jedno plemeno chová více stanic.

SloupecTypPopis
stanice_id→ stanice
plemeno_id→ plemena

stanice_nastaveni

Nastavení stanice (jedna stanice = jedno nastavení).

SloupecTypPopis
stanice_id→ stanice
email_notif_zapano/nee-mailové upozornění zap/vyp
profil_viditelnostvýběrverejny / soukromy

smlouva_sablona

Editovatelná šablona kupní smlouvy štěněte. Z Odchovů půjde tisknout (placeholdery {{jmeno_stenete}}, {{cip}}…).

SloupecTypPopis
stanice_id→ stanice
sablonadlouhý textznění smlouvy s placeholdry
upraveno_atdatum

🐕 Psi 9 tabulek

psi

Hlavní karta psa. Na tohle se odkazují všechny ostatní tabulky o psech.

SloupecTypPopis
idčíslo
stanice_id→ stanicekterou stanicí je pes evidován
plemeno_id→ plemena
jmenotextcelé jméno psa (ručně, BEZ autocomplete)
pohlavivýběrpes / fena
datum_narozenidatumpro veterána se počítá automaticky
barvatextvarieta podle plemene
cip, tetovani, cislo_zapisutextidentifikace
zeme, svaz_id, klub_id→ svazy, klubykde je registrován
chovnyano/ne/nullstav v chovu
datum_chovnostidatum
vlastnictvivýběrvlastni / spolu
overenano/neschválené ověření vlastnictví (bez něj nelze do plán. vrhů)
titulni_fotourl
miry_vyska, miry_vahačíslotělesné míry
chrup_skusvýběr + text
popis_verejnytextO psovi (veřejně)
poznamky_soukrometextvidí jen chovatelka
vytvoreno_at, upraveno_atdatum

psi_fotky

Galerie psa — víc fotek na jednoho psa (pes_id, url, poradi).

psi_zdravi

Zdravotní testy psa (pes_id, kategorie např. DKK/DLK/oči, vysledek ok/nosič/problém, datum, doklad_url). Semafor pravidel v Plánovaných vrzích čerpá odsud.

psi_vystavy

Výstavy a tituly (pes_id, datum, misto, oceneni, poznamka).

psi_zkousky

Zkoušky a soutěže (pes_id, datum, typ, vysledek).

psi_harani

Záznamy hárání u fen (pes_id, datum_zacatek, delka_dni, poznamka). Z toho se počítá predikce dalšího cyklu pro Nástěnku a Kalendář.

psi_rodice

Rodokmen 1. úrovně. Otec a matka — buď odkaz na jiného psa v systému (rodic_pes_id), nebo jen textem (rodic_jmeno_text) když není v Pedia.dog. typ = otec / matka.

psi_dokumenty

Nahrané dokumenty (pes_id, typ = PP / foto čipu / jiný, url, vytvoreno_at).

psi_overeni

Žádost o ověření vlastnictví (pes_id, doklad_id, stav = ceka / schvaleno / zamitnuto, schvalil_admin_id, schvaleno_at).

🐾 Vrhy a štěňata 4 tabulky

planovane_vrhy

Plán krytí — moje fena × krycí pes. Klíčové: 2 strany — fenistka i pejskař, formulář se přizpůsobí podle toho, co chovatelka má.

SloupecTypPopis
idčíslo
vlastnik_id→ uzivatelekdo plán vytvořil
fena_pes_id→ psi (nullable)moje fena nebo cizí (jen text)
fena_texttextjméno feny, pokud cizí
kryci_pes_id→ psi (nullable)analogicky
kryci_pes_texttext
ocekavany_termindatum
statusvýběrpreparing / mated / pregnant / awaiting_approval
schvaleno_druhymvýběrceka / schvaleno / zamitnuto / nepotreba
poznamky_soukrometextvždy soukromé
vytvoreno_atdatum

odchovy

Narozený vrh. Vznikne automaticky kliknutím „Narodilo se" u plánovaného vrhu. Status vrhu se počítá automaticky z dat (datum porodu, věk štěňat, statusy štěňat).

SloupecTypPopis
idčíslo
planovany_vrh_id→ planovane_vrhy (nullable)odkud vznikl
fena_pes_id→ psi
otec_pes_id→ psi (nullable)
otec_texttextpokud cizí pes
datum_porodudatum
pocet_celkem, pocet_psi, pocet_fenčíslopočet štěňat

stenata

Jednotlivá štěňata z vrhu. Status (volné / rezervované / prodané) se propisuje do veřejného katalogu stenata.php.

SloupecTypPopis
idčíslo
odchov_id→ odchovy
jmenotextvolitelné
pohlavivýběrpes / fena
barva, vaha_narozeni, cip, tetovanitext/číslo
titulni_fotourl
statusvýběrvolne / rezervovane / prodane
kupujici_id→ uzivatele (nullable)kdo si štěně koupil

stenata_dokumentace

MVP minimum elektronické dokumentace (stene_id, cip, datum_prvniho_ockovani, vaha_predani). Plný veterinární přístup až v další vlně.

💬 Komunikace 4 tabulky

zpravy

Interní zprávy. Žádné externí mailto / tel — klíčová konkurenční výhoda.

SloupecTypPopis
idčíslo
vlakno_id→ vlaknaseskupení zpráv do konverzace
od_uzivatele_id→ uzivatele
komu_uzivatele_id→ uzivatele
predmettextjen u první zprávy ve vlákně
telodlouhý text
kontext_typ, kontext_idvýběr + odkaznepovinné — stanice / pes / vrh / stene (z čeho zpráva vznikla)
precteno_atdatum/null
odeslano_atdatum

notifikace

Zvoneček v hlavičce (uzivatel_id, uroven = info/upozorneni/urgent, typ, titulek, telo, link, precteno_at, vytvoreno_at).

oblibene

Srdíčko (uzivatel_id, typ = pes / stanice, cil_id) — jen pro roli zájemce.

kalendar_udalosti

Ruční události chovatelky (uzivatel_id, pes_id, datum, typ, nazev, poznamka). Hárání, výstavy, porody se počítají automaticky z jiných tabulek, tady jsou jen ručně přidané věci.

📚 Číselníky 4 tabulky

Statické seznamy, které se mění zřídka. Slouží pro rolovací menu a validace.

plemena

Seznam všech plemen + variety (Jezevčík dlouhosrstý, hrubosrstý…). Sloupce: nazev, rodic_plemeno_id (pro variety), fci_kod.

svazy

ČMKU, SKJ, VDH, ÖKV, ZKwP, KC, AKC, FCI. Sloupce: nazev, zkratka, zeme.

kluby

Plemenné kluby pod svazy. Sloupce: nazev, svaz_id, plemena_ids (kterých plemen se týká — pro filtr).

pravidla_chovu

Per svaz / plemeno. svaz_id, plemeno_id (volitelné — obecné nebo per plemeno), min_vek_feny, max_vek_feny, max_vrhu_rok, povinne_testy (JSON), min_vek_psa. Semafor pravidel čerpá odsud.

🛠 Provoz a admin 3 tabulky

admin_kampan

Seznam 1 600 WFD stanic pro oslovení. Sloupce: nazev_stanice, email, telefon, wfd_id, vlna, status (cekajici / osloveny / odpovedel / odmitnuty / registrovan), spárováno_uzivatel_id (po registraci se napojí), poznamka.

email_log

Každý odeslaný e-mail (kvůli kontrole doručitelnosti a auditu). komu_email, predmet, status (sent / bounced / opened / clicked), odeslano_at.

pozvanky

Hodnoty z URL ?zdroj=... — určuje typ registrace (zakládající / běžná). kod, typ, pouzito_at, vyuzil_uzivatel_id.

🔗 Hlavní vztahy mezi tabulkami

Šipka znamená „odkazuje na". Hvězdička znamená „má víc záznamů" (např. jedna stanice může mít víc psů).

uzivatele ──┬── stanice ──┬── stanice_plemena ──→ plemena
            │             ├── stanice_nastaveni
            │             ├── smlouva_sablona
            │             │
            │             └── psi* ──┬── psi_fotky*
            │                        ├── psi_zdravi*
            │                        ├── psi_vystavy*
            │                        ├── psi_zkousky*
            │                        ├── psi_harani*
            │                        ├── psi_rodice* ──→ psi (sám na sebe — rodokmen)
            │                        ├── psi_dokumenty*
            │                        └── psi_overeni
            │
            ├── zpravy* ──→ uzivatele (komu)
            ├── notifikace*
            ├── oblibene* ──→ psi / stanice
            ├── kalendar_udalosti*
            └── gdpr_souhlasy*

planovane_vrhy ──┬── fena (psi)
                 ├── kryci_pes (psi)
                 └── vlastnik (uzivatele)
       │
       └── odchovy ──→ stenata* ──→ kupujici (uzivatele)
                                    │
                                    └── stenata_dokumentace
            

📝 Důležité poznámky

  • Soft delete u uživatelů — GDPR vyžaduje úplné smazání, ale provoz potřebuje historii (např. komu kupující poslal zprávu). Sloupec smazan_at v tabulce uzivatele + anonymizace osobních polí při mazání.
  • Statusy se počítají z dat, ne ukládají — status vrhu (očekávaný/narozený/odrostlý/přemístěn), veterán u psa, „má všechny testy pro krytí" — všechno jsou odvozené hodnoty, ne sloupce.
  • Rodokmen do 1. úrovně v MVP — tabulka psi_rodice. Plné 3 úrovně do další vlny — pak se rozšíří, ne přepíše.
  • Indexy — minimálně na emailuzivatele, cippsi, cislo_zapisupsi (vyhledávání) a na všechny cizí klíče.
  • UTF-8mb4 pro celou databázi — kvůli emoji, českým znakům a diakritice.
  • Časové zóny — všechny datumy ukládat v UTC, zobrazovat v časové zóně uživatele (default Europe/Prague).
  • Auditní sloupcevytvoreno_atupraveno_at ve všech tabulkách s ručně vyplňovanými daty. Plus vytvoril_uzivatel_id u tabulek, kde to dává smysl.
  • Migrace — schéma spravovat přes Laravel Migrations (každá změna = nový migrační soubor), ne ručně v phpMyAdminu.

⏳ Co v MVP NENÍ (do další vlny)

  • rodokmen_ancestori — 3 úrovně předků s procesem schvalování
  • coi_vypocty — koeficient příbuznosti
  • bonitace — víc bonitací per pes
  • vet_pristup — sdílecí odkazy pro veterináře
  • faktury, predplatne, platby — placené funkce (zakládajících 20 chovatelek je zdarma natrvalo)
  • ucetnictvi_vrhu — náklady / příjmy / zisk za vrh
  • novinky a clanky_komunity — sociální nadstavba
  • push_subscriptions — push notifikace v prohlížeči

Najděte svého chovatele

Hledám podle

Můžeš vybrat více plemen najednou

Můžeš vybrat více velikostí

Můžeš vybrat více typů

Pohlaví
Další požadavky