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.
Člen
Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.