NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
mkores.mk
Člen
Avatar
mkores.mk:21.5.2017 17:32

Ahoj,mám takový (asi blbý a easy) dotaz. Mám dvě tabulky (User a Save) a vazba mezi nimi je 1:1 - to tedy znamená v první tabulce jedna položka odpovídá jedné položce ve druhé tabulce. Napsal jsem SQL dotaz na vytvoření správně?

CREATE TABLE "User"(
 userid integer NOT NULL,
saveid integer,
login character varying,
password character varying,
email character varying,
date date,
CONSTRAINT "User_pkey" PRIMARY KEY (userid))
CREATE TABLE "Save"(
saveid serial NOT NULL,
userid integer NOT NULL,
savedata character varying,
CONSTRAINT "Save_pkey" PRIMARY KEY (saveid),
CONSTRAINT "Save_userid_fkey" FOREIGN KEY (userid) REFERENCES "User" (userid))

Nejsem si jist, jestli mám mít u tabulky Save ještě sloupec saveid (podle mě ano - jinak by měl jenom sloupec userID, což je cizí klíč a neměl by primární klíč).

Mám tedy v tomto případě, jestli to dělám dobře vytvořit i cizí klíč v tabulce User?

PS
Vytvářím to v pgAdmin III

 
Odpovědět
21.5.2017 17:32
Avatar
xpoproci
Člen
Avatar
xpoproci:21.5.2017 17:39

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.

Nahoru Odpovědět
21.5.2017 17:39
Motto
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na mkores.mk
Honza Bittner:21.5.2017 18:04

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ů.

Nahoru Odpovědět
21.5.2017 18:04
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
mkores.mk
Člen
Avatar
mkores.mk:21.5.2017 19:44

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)

Editováno 21.5.2017 19:45
 
Nahoru Odpovědět
21.5.2017 19:44
Avatar
mkores.mk
Člen
Avatar
mkores.mk:21.5.2017 19:48

V tom případě ale bych musel vytvořit ještě jeden sloupec, který by mohl mít hodnoty NULL? Protože User.saveid je cizí klíč tabulky Save, která má tento sloupec nastaven jako primární klíč a tudíž to nemůže být NULL?

 
Nahoru Odpovědět
21.5.2017 19:48
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na mkores.mk
Honza Bittner:21.5.2017 19:51

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? :-)

Nahoru Odpovědět
21.5.2017 19:51
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
mkores.mk
Člen
Avatar
Odpovídá na Honza Bittner
mkores.mk:21.5.2017 19:56

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

 
Nahoru Odpovědět
21.5.2017 19:56
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na mkores.mk
Honza Bittner:21.5.2017 19:59

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.

Nahoru Odpovědět
21.5.2017 19:59
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
mkores.mk
Člen
Avatar
Odpovídá na Honza Bittner
mkores.mk:21.5.2017 20:04

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?

 
Nahoru Odpovědět
21.5.2017 20:04
Avatar
Michal Žůrek - misaz:21.5.2017 22:30

no v každém případě si pak za první CREATE TABLE doplň středník.

 
Nahoru Odpovědět
21.5.2017 22:30
Avatar
Odpovídá na mkores.mk
Michal Štěpánek:22.5.2017 7:32

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".

Nahoru Odpovědět
22.5.2017 7:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
mkores.mk
Člen
Avatar
Odpovídá na Michal Štěpánek
mkores.mk:22.5.2017 15:06

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

 
Nahoru Odpovědět
22.5.2017 15:06
Avatar
Odpovídá na mkores.mk
Michal Štěpánek:22.5.2017 15:53

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...

Editováno 22.5.2017 15:54
Nahoru Odpovědět
22.5.2017 15:53
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
mkores.mk
Člen
Avatar
mkores.mk:24.5.2017 14:56

Můžu se tě zeptat jak by to vypadalo v kódu? Nějak to mohu najít, konkrétní použití

 
Nahoru Odpovědět
24.5.2017 14:56
Avatar
Odpovídá na mkores.mk
Michal Štěpánek:24.5.2017 16:35

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;
        }
Editováno 24.5.2017 16:37
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.5.2017 16:35
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
mkores.mk
Člen
Avatar
mkores.mk:25.5.2017 16:34

Díky :)

 
Nahoru Odpovědět
25.5.2017 16:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.