Autor Zpráva
doby92
Profil *
Dobrý den,

jak docílím toho, abych propojil jednu tabulku s druhou?

Příklad
tbl_produkt
id, nazev, cena, idAutor
1, Blabla, 2000, 1

tbl_uzivatele
id, jmeno
1, karel

Jak to lze propojit, aby se v phpmyadmin vytvoril odkaz a pri kliknuti na idAutor = 1 by mě to odkázalo přímo na 1.řádek v tbl_uzivatele....

Předem děkuji za radu.
Joker
Profil
doby92:
Přidáte na sloupec idAutor cizí klíč.
Buď v SQL přes FOREIGN KEY, nebo v phpMyAdminu to asi jde i naklikat (teď nevím přesně).

Některé databázové stroje, zejména tabulky typu MyISAM v MySQL, neumějí cizí klíče, takže to nepůjde nastavit (příkaz s nastavením FOREIGN KEY se sice provede, ale nebude mít žádný efekt).

Dodatek:
Ještě se možná hodí doplnit, že pro MySQL tabulky, které potřebují cizí klíče, lze použít typ InnoDB (což je u novějších verzí MySQL i výchozí nastavení).

A samozřejmě při provázání tabulek přes cizí klíče je nutné na to pamatovat při mazání či změně dat.
doby92
Profil *
Joker:
koukám na DB u jednoho projektu, který využívá MySQL InnoDB a tam to funguje.... když dám moji databázi stejný engine (InnoDB) mělo by to fungovat ne?
Joker
Profil
Ano.
doby92
Profil *
Joker:
Děkuji :)
doby92
Profil *
Joker:
Jen ještě jeden dotaz.... bude to mít nějaký vliv na rychlost databáze? :)
juriad
Profil
doby92:
Dokud nebudeš mít stamiliony záznamů, tak rozdíl v rychlosti nepocítíš. Samozřejmě, pokud máš správně nastavené indexy.
V tomto případě by mělo stačit, aby sloupec id v tbl_uzivatele byl označený jako primární klíč. Pokud budeš chtít pokládat opačný dotaz: pro daného uživatele vypiš všechny jeho produkty, pak by se ti hodil index i nad sloupcem idAutor v tabulce tbl_produkt.
doby92
Profil *
juriad:
děkuji za reakci, až budu mít strukturu tabulek...mohu Vám se sem postnout na kontrolu?
doby92
Profil *
Jak by jste řešili strukturu databáze, kdyby jste chtěli uložit výbavu vozu do db a pak s tím dále pracovat (např. filtrování). Dali by jste to do jednoho sloupce jako pole a nebo by jste pro každou výbavu (např. ABS) vytvořili vlastní sloupec a zde ukládali 0 či 1?
Keeehi
Profil
doby92:
S první možností neumí databáze pracovat, takže filtrovat podle toho nejde. Druhá by se dala použít, ovšem u ní je většinou potřeba aby veškeré parametry byly dopředu známé, v průběhu života projektu se nejlépe neměnily, také je vhodné aby většina řádků měla vyplněnou většinu sloupců jinak máš opravdu obří avšak téměř prázdnou tabulku.
Existuje tak ještě třetí řešení. Máš klasickou tabulku vozů. Dále máš tabulku kategorií. Nic složitého, jen dva sloupce, ID a název
1 | ABS
2 | počet válců
3 | rok výroby
...
No a pak budeš mít tabulku která propojuje vůz s kategorií a udržuje hodnotu. Má tedy tři sloupce ID_vozu, ID_kategorie, hodnota
4186 | 2 | 4
8347 | 3 | 2001
4186 | 1 | 0
4186 | 3 | 1990
Taková tabulka nám říká, že vůz s ID 4186 nemá ABS, má 4 válce a byl vyroben roku 1990. Vůz s ID 8347 byl vyroben v roce 2001 a informace o počtu válců nebo ABS není dostupná.
Toto se hodí obzvláště v situaci kde některé kategorie u některých vozů nedávají smysl. Například u kabrioletů tě bude zajímat, zda je střecha hard-top a nebo soft-top ale u ostatních vozů tato kategorie nedává smysl. Při řešení s tou velkou tabulkou by ovšem všechny vozy musely mít v daném sloupci nějakou hodnotu. Takto se jednoduše kategorie vynechá pro vozy, kde nemá smysl.
doby92
Profil *
Keeehi:
Děkuji za názorný příklad :) vyzkouším dát dohromady tabulky co se týče vozidel a postnu sem náhled. Byl bych velice vděčný, kdyby jste se na to potom kouknul, zda je to vhodné řešení. Předem děkuji. :)
doby92
Profil *
Zdravím,

konečně jsem se dostal opět k tomu co jsme tu řešili a chtěl bych znát Váš názor, zda je možné jít takovouto cestou. Zkusím Vám popsat co od toho očekávám.

Mělo by se jednat o systém, který udržuje stav vozů a jejich informace o nich (jako je výbava apod.). Export dat bude probíhat ze systému škoda. Strukturu tabulky jsem se snažil udržet v podobném rozložení, jako je samotný export od škodovky. Škodovácký systém neumožňuje filtrovat pomocí výbavy (ABS atd.), takže výbavu vypisují v tabulce "vozidlo" v jednom sloupci a to jako množinu.

příklad:(BX1A BX2B AX4C ...) - tuto množinu skriptem rozdělí na jednotlivé části a projedou tabulku "vybavy", kde si nechají vypsat popis výbavy podle kódu

Já bych filtrování pomocí výbavy uvítal, takže zkusím aplikovat příklad od Keeehi. Výbavu jako takovou bych nedával a nenazýval kategorií, ale spíše jako vlastnost vozu.

V kategorii si představuji toto:

ibb.co/3mLdpXw

Do kategorie jsem zapojil jen značky a modely. Chtěl jsem tam vložit i zda je auto nové, ojeté, předváděcí, nebo havarované (jako hlavní kategorie), ale v tom momentě jsem si uvědomil, že bych pro každou hlavní kategorii (nové, ojeté apod.) musel opakovat jak značku, tak i modely. Proto si osobně myslím, že je vhodnější založit novou tabulky "stav_vozu" a odkázat na ni indexem v tabulce vozy idStavVozu.

ibb.co/98wnvJN

Osobně si myslím, že mě budete chtít skalpovat za toto řešení, ale tohle se mi zdá nejvíc přehledné. Předem Vám děkuji za reakce a za případné poznatky. :)

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