Pomoc se strukturou databáze

Logik

  • *****
  • 992
    • Zobrazit profil
    • E-mail
Re:Pomoc se strukturou databáze
« Odpověď #30 kdy: 14. 12. 2011, 20:17:48 »
Ještě upřesním, zaměř se na kapitoly
- První tabulka
- Vytváření relací
- Select I (jestli nevíš nic o selektu), ale tady přeskoč spojování tabulek
- Select III (tady je to spojování tabulek pořádně).


Ivan

Re:Pomoc se strukturou databáze
« Odpověď #31 kdy: 15. 12. 2011, 10:58:46 »
Tohle není kritická aplikace, u které se musí provést pečlivá analýza. Je to jen playlist.
Presne. Na neco takoveho by melo stacit EAV.

Kit

Re:Pomoc se strukturou databáze
« Odpověď #32 kdy: 15. 12. 2011, 11:58:05 »
Tohle není kritická aplikace, u které se musí provést pečlivá analýza. Je to jen playlist.
Presne. Na neco takoveho by melo stacit EAV.
Až na to, že jsi špatně napsal citaci. Tohle jsem napsal já a Logik s tím nesouhlasí.

EAV přesouvá databázovou logiku do aplikace. V některých případech to může vyhovovat.

Re:Pomoc se strukturou databáze
« Odpověď #33 kdy: 16. 12. 2011, 01:45:47 »
Tak díky vašim radám už se mi to tak trochu rýsuje, ale mám ještě dva problémy, které neumím nějak vhodně vyřešit.

První je jednoduchá otázka - je lepší použít DISTINCT nebo GROUP BY? Jaký je v tom vlastně rozdíl?

Druhá věc je trošku složitější na vysvětlení, ale snad to zvládnu. Chtěl bych mít tabulku, kde budou sloupce album, autor alba, cesta k obalu a id alba (syntetický primární klíč). Album a interpret alba ho jednoznačně určují.

Problém nastává, jak takovou tabulku vytvořit. Když prohledávám písničky, tak nevím, jestli album, ze kterého písnička je, už v databázi není a už vůbec netuším id toho alba. Napadá mě tedy několik možností, jak to řešit, ale všechny se mi zdají dost krkolomné. Jediný aspoň trošku rozumný postup mě napadá tohle:
1) Zjistím, jestli už album je v tabulce s alby
2) Pokud ne, přidám ho s novým id, pokud už existuje, zjistím jeho id
3) Do tabulky s detaily o písničkách zapíšu id alba

Zdá se mi trochu zbytečné, abych s každou písničkou zjišťoval, jestli už daná kombinace alba a interpreta existuje. Nejde to nějak zjednodušit? Mně nějak došly nápady...

Kit

Re:Pomoc se strukturou databáze
« Odpověď #34 kdy: 16. 12. 2011, 10:00:16 »
První je jednoduchá otázka - je lepší použít DISTINCT nebo GROUP BY? Jaký je v tom vlastně rozdíl?

GROUP BY se používá, pokud potřebuješ agregovat některé sloupce. Jinak stačí DISTINCT.

Druhá věc je trošku složitější na vysvětlení, ale snad to zvládnu. Chtěl bych mít tabulku, kde budou sloupce album, autor alba, cesta k obalu a id alba (syntetický primární klíč). Album a interpret alba ho jednoznačně určují.

Problém nastává, jak takovou tabulku vytvořit. Když prohledávám písničky, tak nevím, jestli album, ze kterého písnička je, už v databázi není a už vůbec netuším id toho alba. Napadá mě tedy několik možností, jak to řešit, ale všechny se mi zdají dost krkolomné. Jediný aspoň trošku rozumný postup mě napadá tohle:
1) Zjistím, jestli už album je v tabulce s alby
2) Pokud ne, přidám ho s novým id, pokud už existuje, zjistím jeho id
3) Do tabulky s detaily o písničkách zapíšu id alba

Zdá se mi trochu zbytečné, abych s každou písničkou zjišťoval, jestli už daná kombinace alba a interpreta existuje. Nejde to nějak zjednodušit? Mně nějak došly nápady...
1. Přidej album příkazem INSERT OR IGNORE. Název alba musí mít atribut "UNIQUE". Pokud už existuje, nevloží se.
2. Přidej písničku a ID alba doplň vnořeným SELECTem.

Oba příkazy vlož do jedné transakce, bude to rychlejší.


Logik

  • *****
  • 992
    • Zobrazit profil
    • E-mail
Re:Pomoc se strukturou databáze
« Odpověď #35 kdy: 17. 12. 2011, 23:56:58 »
Kdy chceš použít distinct/group by? IMHO ho tady vůbec potřebovat nebudeš. (Pokud chceš vypsat všechny autory od píšniček, tak přehlednější je psát
SELECT * FROM autori WHERE id IN (SELECT autor_id FROM pisnicka WHERE .... 
než to spojovat joinem a jinde mě nenapadá, kde by se to mohlo použít.
Jinak, jak říkal předřečník, GROUP BY se používá, pokud tě zajímá např. počet "stejnejch" řádek, součet nějakejch polí (např. celková délka alb jako součet délek jednotlivejch písniček GROUP BY album_id) apod.
-
Pokud na začátku chceš jednorázově vytvořit novou tabulku alb a chceš to fakt rychle, tak tady bych se vykašlal na databázi a udělal si vedle phpkovský pole s nima a kouknul se tam. Ale nejlepší je IMHO udělat defaultní rutinu na přidávání písniček, kterou budeš používat i jindy, a vykašlat se na to, že se bude pokaždý písnička hledat znova - dělá se to jen jednou. Navíc pokud si uděláš metodu na vyhledání alba, tak tam můžeš udělat cache: pak Ti stačí záznamy zpracovávat seřazené dle abla a máš to defakto bez výkonnostní ztráty.
Takovýdle věci se optimalizujou, teprv až když je to hotový a je to moc pomalý.

mimi.vx

Re:Pomoc se strukturou databáze
« Odpověď #36 kdy: 18. 12. 2011, 01:37:51 »
trochu offtopic , proc vse delas v pythonu kdyz v QT je vrstva pro SQL + Vrstva pro multimedia ...takze se da celkem rychle a na par radcich stvorit prehravac cehokoliv

Logik

  • *****
  • 992
    • Zobrazit profil
    • E-mail
Re:Pomoc se strukturou databáze
« Odpověď #37 kdy: 18. 12. 2011, 18:46:35 »
Jo, omlouvám se za to phpkovský pole, zapoměl jsem na zadání, tak pythonovskej dictionary, ten má taky (snad) dobrou implementaci.

Re:Pomoc se strukturou databáze
« Odpověď #38 kdy: 19. 12. 2011, 09:38:11 »
mimi.vx> No podle mě to je celkem fuk, jestli použiju SQLite z Pythonu nebo Qt. Jelikož celá logika programu je v Pythonu a v Qt (respektive QML) je pouze UI, tak mi to přišlo takhle logičtější. Na přehrávání používám Phonon z Qt. Ale možná přejdu GStresmer nebo QtMultimediaKit.

Logik> Díky za perfektní rady. Zkusím to nějak zpracovat. Já už to mám v podstatě všechno funkční (s pomocí jedný tabulky), akorát některý věci prostě trvají dýl než by se mi líbilo a taky začíná váznout udržovatelnost. Proto jsem to začal řešit.

Re:Pomoc se strukturou databáze
« Odpověď #39 kdy: 26. 12. 2011, 20:04:03 »
Rád bych se ještě vrátil k tomuto tématu a požádal o pár rad.

Něco jsem dal dohromady, ale nejsem s tím spokojený. Respektive jsem to celý zprasil, protože mi některý věci nedošly.

Zásadní problém je v tom, že tak jak jsem tabulky poskládal, tak by ke každému umělci musel příslušet jeden žánr, ke každému albu jeden umělec atd. Předpokládám, že jediný rozumný způsob, jak tohle vyřešit, je vytvoření porovnávací tabulky mezi všema tabulkama. To už jich ale bude šílená spousta, nebude to nakonec kontraproduktivní?

Vypadalo by to asi takhle:

ŽánrŽánr_id
Folk-rock1
Country2
Rock & Roll3

InterpretInterpret_id
Elvis Presley1
Pavel Bobek2

Žánr_idInterpret_id
12
21
22
31
32

Podobné porovnávací tabulky by potom byly mezi všema třídícíma tabulkama. Dává to smysl? Je to takhle správně?

A jak se potom udělá JOIN takových tabulek?

Taky mě trápí, jak implementovat autora alba. Chtěl bych, aby v UI v seznamu "Interpret" bylo obojí. To znamená, že tam bude jak Country Beat Jiřího Brabce, jakožto autor alba, tak i Nadě Urbánková, Jiří Grossman nebo Ladislav Vodička, jakožto interperti jednotlivých písniček.

Jediná rozumná věc, která mě napadla, je přidat autora alba do tabulky alb, protože každé album má logicky pouze jednoho autora. Pokud vytvářím seznam interpretů/autorů, vyjedu si s "DISTINCT" autory alb a celou tabulku "Interpret". Potom oba seznamy spojím a vymažu duplicity. Zdá se mi to ale dost krkolomné. Bohužel jsem na nic lepšího nepřišel. Položka "Autor alba" do toho vnáší spoustu různých nesystematičností a výjimek, kterým bych se rád vyhnul, ale nevím jak. Každopádně tohle je spíš podružný problém, protože to funguje, jenom se mi to nelíbí. Důležité pro mě je, jak udělat ty tabulky.

Díky všem za rady.

urso2

Re:Pomoc se strukturou databáze
« Odpověď #40 kdy: 26. 12. 2011, 21:38:10 »
Rád bych se ještě vrátil k tomuto tématu a požádal o pár rad.

Něco jsem dal dohromady, ale nejsem s tím spokojený. Respektive jsem to celý zprasil, protože mi některý věci nedošly.

Zásadní problém je v tom, že tak jak jsem tabulky poskládal, tak by ke každému umělci musel příslušet jeden žánr, ke každému albu jeden umělec atd. Předpokládám, že jediný rozumný způsob, jak tohle vyřešit, je vytvoření porovnávací tabulky mezi všema tabulkama. To už jich ale bude šílená spousta, nebude to nakonec kontraproduktivní?

Vypadalo by to asi takhle:

ŽánrŽánr_id
Folk-rock1
Country2
Rock & Roll3

InterpretInterpret_id
Elvis Presley1
Pavel Bobek2

Žánr_idInterpret_id
12
21
22
31
32

Podobné porovnávací tabulky by potom byly mezi všema třídícíma tabulkama. Dává to smysl? Je to takhle správně?

A jak se potom udělá JOIN takových tabulek?

Taky mě trápí, jak implementovat autora alba. Chtěl bych, aby v UI v seznamu "Interpret" bylo obojí. To znamená, že tam bude jak Country Beat Jiřího Brabce, jakožto autor alba, tak i Nadě Urbánková, Jiří Grossman nebo Ladislav Vodička, jakožto interperti jednotlivých písniček.

Jediná rozumná věc, která mě napadla, je přidat autora alba do tabulky alb, protože každé album má logicky pouze jednoho autora. Pokud vytvářím seznam interpretů/autorů, vyjedu si s "DISTINCT" autory alb a celou tabulku "Interpret". Potom oba seznamy spojím a vymažu duplicity. Zdá se mi to ale dost krkolomné. Bohužel jsem na nic lepšího nepřišel. Položka "Autor alba" do toho vnáší spoustu různých nesystematičností a výjimek, kterým bych se rád vyhnul, ale nevím jak. Každopádně tohle je spíš podružný problém, protože to funguje, jenom se mi to nelíbí. Důležité pro mě je, jak udělat ty tabulky.

Díky všem za rady.
Tomu, co zde řešíš, se říká KARDINALITA. Je zde vztah (kardinalita) více ku více, takže se to řeší takto (pozor na kartezký součin).

Re:Pomoc se strukturou databáze
« Odpověď #41 kdy: 26. 12. 2011, 23:27:16 »
Tak to jsem se trochu unáhlil, v případě 4 sloupců (žánr, interpret, album, skladba) to budou pouze 3 porovnávací tabulky, protože tabulka se skladbama žádnou porovnávací s ostatníma nepotřebuje (vše je unikátní). Zatím na malém počtu písniček to funguje k mé spokojenosti, akorát z toho lezou příšerné SQL dotazy typu:
Kód: [Vybrat]
SELECT title, track FROM genre_table JOIN genre_artist ON genre_table.genre_id = genre_artist.genre_ref JOIN artist_table ON genre_artist.artist_ref = artist_table.artist_id JOIN artist_album ON artist_table.artist_id = artist_album.artist_ref JOIN album_table ON artist_album.album_ref = album_table.album_id JOIN Library ON genre_table.genre_id = Library.genre_ref AND artist_table.artist_id = Library.artist_ref AND album_table.album_id = Library.album_ref WHERE genre='Soundtrack' AND (album_artist='Wings' OR artist='Wings') AND album='James Bond Themes' ORDER BY track ASC

Re:Pomoc se strukturou databáze
« Odpověď #42 kdy: 27. 12. 2011, 00:21:54 »
Tak jsem se opět unáhlil. Nefunguje to. Sice tuším proč, ale nevím, co s tím.

Například když kliknu na dynamický playlist, který se jmenuje "Hudba 3+" a vyjedu si znovu sloupce "žánr", "interpret", "album", tak se všechny položky vyjedou několikrát.

konkrétně u žánru se použije tento příkaz:
Kód: [Vybrat]
SELECT genre, genre_id FROM genre_table JOIN Library ON genre_table.genre_id = Library.genre_ref WHERE rating >= 3 AND genre <> "Speech" ORDER BY genre ASC
Skladeb, které tomu odpovídají, je v knihovně 6 a tak se žánr objeví 6x stejný. Samozřejmě to můžu jednoduše ošetřit přidáním "DISTINCT", jenže se obávám, že tím zase všechno zpomalím.

Ještě hůř to dopadne u alba. V knihovně je zatím pouze jedno s 28 stopami. Použije se tento dotaz:
Kód: [Vybrat]
SELECT album, album_picture, album_id FROM genre_table JOIN genre_album ON genre_table.genre_id = genre_album.genre_ref JOIN album_table ON genre_album.album_ref = album_table.album_id JOIN Library ON genre_table.genre_id = Library.genre_ref AND album_table.album_id = Library.album_ref WHERE rating >= 3 AND genre <> "Speech" ORDER BY album ASC

A na ten mi vypadne to samé album 168x. Nechápu proč a už vůbec nevím, co s tím dělat.

Dokážete mi někdo poradit, co jsem zvoral?

Kit

Re:Pomoc se strukturou databáze
« Odpověď #43 kdy: 27. 12. 2011, 00:24:41 »
Zásadní problém je v tom, že tak jak jsem tabulky poskládal, tak by ke každému umělci musel příslušet jeden žánr, ke každému albu jeden umělec atd.
To je otázka, zda žánr patří k umělci, albu nebo ke konkrétní skladbě. Případně zda připustíme více žánrů k jedné skladbě/albu/umělci.

Pro sjednocení a vyřazení duplicit slouží UNION.

Kit

Re:Pomoc se strukturou databáze
« Odpověď #44 kdy: 27. 12. 2011, 00:28:50 »
...
A na ten mi vypadne to samé album 168x. Nechápu proč a už vůbec nevím, co s tím dělat.

Však to už psal Logik, jak to máš udělat. Stačí se podívat do historie této diskuze, hledej vnořený dotaz. Bude to s ním i rychlejší.