Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Návrh databáze a select dotaz

Ahoj,
chtěl bych poprosit o radu při návrhu mysql databáze. Základem databáze jsou položky různého typu (např. filmy, knihy, videohry, apod. typů je max. 20 a jsou předem dané). Tyto položky tvoří témata - např. téma Batman obsahuje filmy o batmanovi, komix, pc hry a třeba i batmobil (auto). Vzhledem k tomu, že každý typ má zcela rozdílné vlastnosti, navrhnul jsem tabulky takto:
Každá položka je zahrnuta v tabulce Položka, její další vlastnosti jsou v tabulkách jednotlivých typů. Položky jsou také přiřazeny k tématům, ke kterým patří - pomocí jednoduchého SLELECTu (název tématu se vyskytuje ve jménu nebo popisu položky) spáruju položky a témeta.
Nicméně některé položky (filmy, knihy) mají k sobě přiřazené autory (herci, režiséři, spisovatelé). A tady jsem narazil na problém - jak vyhledávat i v osobách - např. pokud bude tématem "Stephen King" tak potřebuji snadno najít osoby spojené s (některými) položkami. Chtěl bych nějaké dobré řešení už z důvodu, že se časem může objevit další situace typu - položka má vlastnosti, které jsou sami o sobě taky položky. (i když mě teď žádná nenapadá)
Napadly mě tyto řešení:
  • přidávat jména osob i do tabulky Položka, přiřazení osoby k jiné položce bych mohl udělat sloupcem "Patří k" v tabulce Položka (0 - nepatří k jiné položce, jinak id položky) ... ale porušuje se tu normalizace (více řádků v tabulce Položka se stejnou osobou (např. herec hrající ve 3 filmech)
  • využít Entity-Atribute-Value model, od něj ale zkušení programátoři dost odrazují
  • posledním nápadem je do tabulky Položka přidat sloupec Hledani, který obsahovat všechny vlastnosti položky sloučení jako jeden TEXT, nad tímto sloupcem bych prováděl hledání. Pokud bych to neuložil v nějaké struktuře typu JSON tak bych taky potřeboval další dotaz, zdá se mi ale, že by tabulky byly přehlednější.
Mohli byste mi prosím napsat váš názor, případně poradit, jak byste to udělali vy?
Děkuju za pomoc,
Richard
11. 12. 2012 22:44:21
https://webtrh.cz/diskuse/navrh-databaze-a-select-dotaz/#reply841279
Jdeš na to podle mě dobře - vytvořit univerzální očíslování pro všechny položky.
Ale zastavil ses před posledním krokem - zařadit do toho systému i témata.
"Téma" bude další typ vedle "Film", "Kniha", "Autor".
Ke spojení všech položek ti pak stačí jediná tabulka - `connections` se dvěma sloupci
Pro každé spojení uložíš dva řádky
Kniha s itemId 1 a autor s itemId 2 budou mít v `connections` tyto dva řádky
Můžeš pak mít film A podle knihy X od autora Y na témata Z a Ž.
11. 12. 2012 23:11:44
https://webtrh.cz/diskuse/navrh-databaze-a-select-dotaz/#reply841278
Jersák Martin
verified
rating uzivatele
(23 hodnocení)
11. 12. 2012 23:43:51
Přikláním se k Martinovu řešení (používá jiný druh zápisu názvu). Takovéto propojení se řeší tak, že unikátní věci se dají do jedné tabulky(tkzv. číselníky, C tabulka) a pak se vytvoří tabulka propojení (R tabulka). Principem je oddělení unikátních zdrojových dat a jejich návazností. Můžeš buď udělat pro každé propojení vlastní propojovací tabulku (varianta 1) nebo jednu tabulku, která bude obsahovat pro každý "idčko" vlastní sloupec (varianta 2), případně univerzální propojovací tabulka s identifikátory (varianta 3). níže uvedu zdrojové tabulky a 3 návrhy propojení. Každá varianta je vhodná pro jiný objem dat a velikost, je na tobě, kterou si vybereš.
Tema
-------
id
jméno
Kniha
-------
id
jmeno
.....sloupce jedinečné pro každý film
Film
-------
id
nazev
.....sloupce jedinečné pro každý film
Propojovací varianta 1
---------------------
id
tema_id
kniha_id
film_id
Propojovací varianta 2
Propojeni_1
---------------------
id
tema_id
kniha_id
Propojeni_2
---------------------
id
tema_id
film_id
Propojovací varianta 3
---------------------
id
tema_id
polozka_id (kniha_id, film_id
druh (F)=film,K=kniha - nutno vytvořit vlastní číselník)
11. 12. 2012 23:43:51
https://webtrh.cz/diskuse/navrh-databaze-a-select-dotaz/#reply841277
Z toho, co jste napsali, mi vychází, že osoby budu brát jako další položky a pak pomocnou tabulkou vytvořím odpovídající relace.
Měl bych ještě jeden (poslední dotaz) - nejčastější dotazy na DB budou fulltextové hledání v několika sloupcích napříč několika tabulkami a vybírání položek (a k nim dané řádky v jednotlivých kategoriích) patřících k určitému tématu - půjdou k takto navrženým tabulkám vytvořit pěkné (optimalizované) dotazy? Neumím si moc představit, jak budu joinovat Položky s příslušnými Osobami a zároveň ke všem položkám rozšiřující informace uložené v ostatních tabulkách v závislosti na typu položky... Nebude v tom moc velký binec? (Co se týká složitějších dotazů v MySQL, jsem absolutní tabula rasa, takže se omlouvám za případný stupidní dotaz.)
Martine, děkuju za pomoc, jestli to chápu správně, ten ukázkový dotaz vybírá položky spjaté s filmem A, ano?
Martine č. 2, taky děkuju, nejbližší je mi trojka s tím, že druh mám už podchycený u každé položky, tudíž tenhle sloupec ani nepotřebuju, to myslím ničemu nevadí...
12. 12. 2012 22:20:08
https://webtrh.cz/diskuse/navrh-databaze-a-select-dotaz/#reply841276
Pro odpověď se přihlašte.
Přihlásit