---
title: "Databázová schéma a typy kľúčov — Contacts for Laravel | Roundly"
description: "Tabuľka contacts stĺpec po stĺpci, jej indexy, soft delete a ako key_type typuje owner_id pre vlastníkov s UUID alebo ULID."
url: https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel/databazova-schema
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Contacts for Laravel](https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel.md)

# Databázová schéma a typy kľúčov

Všetky kontakty všetkých vlastníkov ukladá jedna polymorfná tabuľka. Jej názov pochádza z contacts.table:

| Stĺpec | Typ | Účel |
| --- | --- | --- |
| `id` | bigint | Autoinkrementálny kľúč. |
| `owner_type / owner_id` | nullable morph | Polymorfný vlastník; owner\_id sa riadi key\_type. Null pri kontaktoch bez vlastníka. |
| `type` | string, default custom, indexed | Surový druh — vstavaná hodnota alebo registrovaný vlastný druh. |
| `name` | string | Zobrazované meno ('' ak nie je nastavené). |
| `value` | nullable string | Normalizovaná hodnota kontaktu, najviac 255 znakov. |
| `label` | nullable string | Voľný popis, napr. Work. |
| `category` | nullable string, indexed | Zoskupenie, napr. Suppliers. |
| `is_primary` | boolean, default false | Primárny v rámci vlastníka a druhu. |
| `position` | unsigned int, default 0 | Poradie v rámci druhu. |
| `verified_at` | nullable timestamp | Kedy bol kontakt overený. |
| `verification_token` | nullable string | Hash čakajúceho tokenu — skrytý v poliach aj JSON. |
| `verification_expires_at` | nullable timestamp | Expirácia tokenu. |
| `verification_attempts` | unsigned smallint, default 0 | Nesprávne pokusy minuté na čakajúci token; nový token ich vynuluje. |
| `meta` | nullable jsonb | Ľubovoľné metadáta, castované na Collection. |
| `created_at / updated_at` | timestamps | Štandardné časové pečiatky. |
| `deleted_at` | soft deletes | Zmazané kontakty zostanú dostupné. |

Najčastejšie dotazy pokrývajú dva zložené indexy: (owner\_type, owner\_id, type) pre čítanie podľa druhu a (owner\_type, owner\_id, type, is\_primary) pre vyhľadanie primárneho kontaktu.

## Index jedného primárneho kontaktu

Druhá migrácia, update\_contacts\_table\_with\_one\_primary\_per\_kind, pridá na PostgreSQL a SQLite čiastočný unikátny index <table>\_one\_primary\_per\_kind nad (owner\_type, owner\_id, type) s podmienkou, že is\_primary je true a deleted\_at je null — najviac jeden nezmazaný primárny kontakt na vlastníka a druh tak vynúti samotná databáza. Odmietne aj primárny kontakt zapísaný mimo akcií balíka, napríklad priamym insertom. MySQL čiastočné indexy nepozná, preto tam migrácia index vynechá a povýšenia sa spoliehajú na zámok (pozrite Primárne kontakty). Kontakty bez vlastníka index nepokrýva na žiadnej databáze — null vlastníci v unikátnom indexe nikdy nekolidujú.

Pred vytvorením indexu migrácia v každej skupine vlastníka a druhu zosadí duplicitné nezmazané primárne kontakty: príznak si ponechá prvý podľa position a potom id — ten, ktorý by zvolilo aj automatické povýšenie. Primárne kontakty v koši zostanú nedotknuté; žiadne miesto neobsadzujú.

## Typ kľúča vlastníka

Vlastník je voliteľná polymorfná relácia, preto musí owner\_id zodpovedať kľúčom vašich modelov. Ak tieto modely používajú HasUuids alebo HasUlids, nastavte key\_type na uuid alebo ulid. Hodnota sa číta pri spustení migrácie, takže ju nastavte pred publikovaním a migráciou:

```bash
# set before you publish and run the migration
CONTACTS_KEY_TYPE=uuid
```

Nenastavená alebo prázdna hodnota sa číta ako bigint, ktorý vytvorí presne tie isté stĺpce ako nullableMorphs() v Laraveli. Akákoľvek iná hodnota vyhodí pri spustení migrácie InvalidConfigurationException, takže preklep nikdy potichu nevytvorí stĺpce bigint pre vlastníkov s UUID či ULID.

## Soft delete

Kontakty používajú soft delete, takže zmazaný kontakt zostane dostupný cez withTrashed(). Soft delete spolu s kontaktom presunie do koša aj jeho štruktúrované adresy a hrany vzťahov v oboch smeroch a restore() vráti presne tie — nie tie, ktoré ste predtým zmazali samostatne. Obnovený primárny kontakt sa vráti ako sekundárny, ak medzitým jeho druh povýšil iný kontakt. forceDelete() adresy aj hrany odstráni natrvalo.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel.md)
