Autor Zpráva
dbrel
Profil *
Zdravím, budu dělat takové forum, kde budou témata a v nich příspěvky. Dočetl jsem se, že tyto tabulky musí být v relaci 1:N (tzn. mít jeden cizí klíč). A zajímá mě z jakého důvodu?

Tabulka příspěvky:
id
text
id_tematu


Uživatel si vybere téma - tím získám id tématu a poté již mohu příspěvky ukládat a také zobrazovat podle témat.

Na co tedy vytvářet cizí klíč? Díky moc.
Kajman_
Profil *
Třeba k uložení názvu tématu?
dbrel
Profil *
Kajman:
Moc ti nerozumím. Název tématu budu mít v tabulce temata. Prosím o radu - opravdu mě zajímá na co je dobrý...

Tabulka temata
id
nazev_tematu
Kajman_
Profil *
Ztrácím se v tom, na co se ptáte? K čemu je obecně cizí klíč? K hlídání integrity dat - aby se nedal příspěvek napsat do neexistujícího tématu.
dbrel
Profil *
Kajman:
Díky.
Mám ještě jeden příklad... Uživatel bude moci vkládat události (žádné kategorie). Jak by měly vypadat tabulky? Je tady nutný cizí klíč?

Můj návrh:

Uzivatel
id_uzivatele
login

Udalost
id_udalosti
text_udalosti
uzivatel


Po přihlášení budu mít login uživatele v session a po napsání události uložím do tabulky Udalost ten text události a login uživatele ze session.

Poté budu události vypisovat takto:
Select * from udalost

a vypíšu text a uživatele.

Je tady nutné specifikovat cizí klíč a popř. jak? Díky
dbrel
Profil *
Prosím Vás o radu, je to pro mě celkem důležité. Je tady hodně lidí, kteří tomu podle mě hodně rozumí a snad mi i dokáží poradit. Díky moc
Kajman_
Profil *
Já tomu právě moc nerozumím. Na co se ptáte. Cizí klíč určuje vazbu mezi tabulkami, ale můžete tam mít i tu vazbu bez využití cizího klíče, pokud např. zvolená databáze cizí klíče nepodporuje.

Do tabulky udalost by se spíše měl ukládat primární klíč uživatele - tedy asi id_uzivatele ne jeho login. Pak je možné uživateli změnit login aniž by přišel o vazbu na události.
dbrel
Profil *
Kajman:
"Do tabulky udalost by se spíše měl ukládat primární klíč uživatele - tedy asi id_uzivatele ne jeho login. Pak je možné uživateli změnit login aniž by přišel o vazbu na události."

Díky už se mi to trochu vyjasňuje...

A na co potřebuju mít vazbu uživatele na událost? Třeba u fotogalerie a fotografií to chápu - např. pokud smažu fotogalerii, smažou se mi i fotografie v ní... Ale zrovna u události mě nenapadá žádný takový důvod...
dbrel
Profil *
edit: a navíc takhle můžu u události jednoduše vypsat kdo jí napsal... Pokud tam budu mít primární klíč uživatele jak to jednoduše zjistím, abych nemusel použít dva dotazy? Přes JOIN? Díky moc
nightfish
Profil
dbrel:
A na co potřebuju mít vazbu uživatele na událost?
Protože třeba můžeš chtít vypsat/smazat všechny události od určitého uživatele (a to i při změně uživatelova jméno/přezdívky).

a navíc takhle můžu u události jednoduše vypsat kdo jí napsal
To samozřejmě jde i při použití cizích klíčů - použije se JOIN.
Joker
Profil
dbrel:
Můj návrh:

A na co potřebuju mít vazbu uživatele na událost?
Chápu to dobře, že jako autor návrhu se ptáte, proč jste to navrhl zrovna takhle? :-)
Návrh databáze by měl vypadat nějak takhle:
1. Co se vlastně bude dělat? Jak se to má chovat, z čeho se to zhruba bude skládat.
2. Jaké informace o jednotlivých prvcích budu potřebovat uchovávat a jaké vztahy mezi nimi jsou?
3. Z kroku 2 mám model toho co budu potřebovat, teď už jen podle toho modelu vytvořím databázi a tabulky.

Čili odpověď na otázku „Na co potřebuju mít vazbu…“ by měla být „Protože při analýze jsem zjistil, že to je nutné pro (nějakou požadovanou vlastnost aplikace)“

Dočetl jsem se, že tyto tabulky musí být v relaci 1:N (tzn. mít jeden cizí klíč). A zajímá mě z jakého důvodu?
Moc nerozumím na co přesně míří ten dotaz, ale:
- Předpokládejme, že je potřeba evidovat nějaké informace týkající se tématu (například název, popisek a podobně)
- Předpokládejme, že je potřeba evidovat nějaké informace týkající se příspěvku (autor, text a podobně)
- Příspěvek může mít právě jedno téma
- Jedno téma může obsahovat více příspěvků

Pokud to je takhle, mám entitu „Téma“ a entitu „Příspěvek“, mezi kterými je zjevně vztah 1:N (vyplývá z posledních dvou odrážek).
To se do databáze převede jako dvě tabulky ve vztahu 1:N.
Jak jinak byste to chtěl udělat?
dbrel
Profil *
nightfish:
"To samozřejmě jde i při použití cizích klíčů - použije se JOIN."

Jak vypsat data pomocí JOIN vím, ale jak je zapsat?

Mám v proměnné $uzivatel uživatelův login ze session a teď bych potřeboval zjistit jeho ID, které potom zapíšu do tabulky Udalost. Jde to opět pomocí jednoho dotazu nebo nejprve si musím vytáhnout jeho id a až pak INSERT?. Díky
Kajman_
Profil *
Přehlednější bude vytáhnout id a pak insert. A když si do session dáte i id uživatele, tak ani tahat nemusíte.
dbrel
Profil *
Kajman:
Díky moc všem za rady
dbrel
Profil *
Ještě přeci jenom jedna otázka...

Pokud budu mít dvě tabulky Uzivatel a Temata a pouze administrátor (uživatel s ID=1) bude moct vytvářet témata, také si nebude moct změnit login (administrator bude napevno).

Je tam nutná vazba a nebo jí tam mám dát (neuškodí ničemu)?
Joker
Profil
dbrel:
Je tam nutná vazba a nebo jí tam mám dát (neuškodí ničemu)?
Že uživatel s ID=1 má oprávnění vytvářet témata není vazba mezi tabulkami Uzivatel a Temata.
Je to atribut uživatele, pokud to je dané takhle napevno- „Jen a pouze uživatel s ID=1 má oprávnění vytvářet témata“, nemusí se do databáze přidávat nic, protože ta informace už uložená je (ve sloupci ID - uživatel který má ID=1 je administrátor)

Další ilustrační příklady:
- Kdyby administrátorů mohlo být více, byl by to atribut uživatele, čili by se hodilo k uživateli přidat sloupec s významem "je administrátor".
- Vazba mezi těmi dvěma tabulkami by to byla třeba v případě, že by každé téma mělo přidělené jednoho administrátora. Pak by se do tabulky Temata asi hodilo přidat sloupec pro ID administrátora.
- Kdyby téma mohlo mít více administrátorů a administrátor mohl spravovat více témat, byla by to vazba M:N a hodilo by se založit tabulku pro administrátory témat (ID tématu, ID administrátora)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0