Diskuze: Vazba 1:1 mezi tabulkami
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 16 zpráv z 16.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Mám dojem, že keby si dal foreign key do tabuľky User, tak by ti to ani neprešlo lebo ešte neexistuje referencia na Save a hlavne by každý user musel mať priradené saveid od začiatku, čo by znamenalo, že by bolo zbytočne vytvárať 2 tabuľky. Stačil by jeden stĺpec "savedata" naviac v User. a keďže je to 1:1, tak by to možno bolo aj logické spraviť, zjednoduší sa to.
Nevím co přesně s databází zamýšlíš, ale obecně si myslím, že uživatel a uložená data jsou relace 1:N, páč můžeš mít více uložení?
Každopádně, pokud chceš dělat 1:1, měl bys opravdu mít v obou tabulkách nějaký klíč, třeba jako ten umělý atribut id, a zároveň odkazovat na tu druhou tabulku tím daným cizím klíčem. Dobře si pak rozmysli, které cizí klíče budou NOT NULL a které ne. (můžeš se dostat do stádia, kdy pak nebudeš schopen přidat záznamy, protože jedno nevytvoříš bez druhého)
Ve tvém případně User.saveid může být NULL (a tedy lze vytvořit nejdříve záznam uživatele) a Save.userid nesmí být NULL (takže záznam o uložení bez uživatele neuděláš, což je správně). Také si dej pozor na normální formy, konkrétně třeba tu první, která říká, že data ve sloupečkách mají být atomická, tj. je nemůžeš dále dělit. Viz http://programujte.com/…ich-databazi – myslím si totiž, že savedata bys měl rozdělit na více sloupečků.
Mám tam na ní postavenou Java aplikaci (takovou jednoduchou hru) a rád bych, aby to komunikovalo se serverem (stahovalo si to informace o itemech, byl by tam login a k tomu loginu jeden save - takto to mám nadefinováno v konceptuálním a logickém schématu).
Savedata by byl v podstatě jednoduchý soubor s uloženými věcmi (s uloženým progresem hráče)
A proč máš User.saveid jako část primárního klíče? Podle mne to je
dost zbytečné, uživatele plnohodnotně identifikuješ podle jeho User.userid,
ne? 
User.saveid není součást primárního klíče. User.saveid je sloupec s cizím klíčem, v Save.saveid je sloupec primárním klíčem
Chápu. Já si myslím, že User.saveid může být NULL, pokud tam explicitně nenapíšeš NOT NULL, což tam teď nemáš. To je věc parciality vztahu, jestli je povinný nebo ne.
Aha, takže obecně cizí klíče můžou být NULL (tedy za přepokladu, že explicitně nedefinuji, že nesmí být NULL), ačkoliv v jiné tabulce jsou primárním klíčem a tedy nesmí být NULL?
Ještě se zeptám - pokud se uživatel registruje, přihlásí, tak se vytvoří nový záznam v tabulce User a ve sloupci User.saveid bude NULL. Poté si chvilku zahraje a uloží hru (tudíž se vytvoří nnový záznam v tabulce Save). Jak dostanu hodnotu z Save.saveid do tabulky User.saveid? Triggerem?
no v každém případě si pak za první CREATE TABLE doplň středník.
Jak dostanu hodnotu z Save.saveid do tabulky User.saveid?
Při uložení záznamu do "Save" (což mimochodem nepovažuji zrovna za šťastně zvolený název tabulky) si vytáhneš ID právě uloženého záznamu a updatneš příslušný záznam v tabulce "User".
Pomocí triggerů to mohu udělat? Pokud mi se mi vytvoří nový záznam v tabulce Save, tak updatuju příslušný záznam u tabulky User
Já jsem triggery nikdy nepoužil, takže nevím, já bych použil "output inserted" metodu při vkládání záznamu, abych zjistil ID nově vloženého záznamu a to id bych pak jednoduše použil při update tabulky User příslušného uživatele...
takhle jsem to třeba použil já v jedné metodě
public int NovaObjednavka(int dodavatel)
{
SqlConnection dbcon = new SqlConnection(con);
SqlCommand com = new SqlCommand("INSERT INTO [GenerObjToner] ([DodavatelId]) OUTPUT INSERTED.ObjId Values (@dodavatel)", dbcon);
com.Parameters.AddWithValue("@dodavatel", dodavatel);
dbcon.Open();
ObjId = int.Parse(com.ExecuteScalar().ToString());
dbcon.Close();
return ObjId;
}
Zobrazeno 16 zpráv z 16.