- ad pojmenování:
doporučuju tabulku v jednotném čísle. Název cizího klíče <table>_id. Název primárního klíče buďto shodný s cizím klíčem, nebo jen id, obé má své výhody a nevýhody. A cíleně se vyhýbat duplicitám v jménech sloupců spíš nedoporučuju: ono to ve větší db ani nejde. Spíše je lepší si zvyknout vždy psát plně kvalifikované názvy sloupců, tzn tabulka.sloupec.
- ad GROUP BY - pokud někde musíte použít GROUP BY, kde přímo nepotřebujete agregaci, asi je dotaz špatně
- jak dělat filtry
píšeš, že všechny tabulky máš M:N. Tak to je skvělé, stačí Ti jeden mustr, kterej půjde aplikovat všude. Představ si teď filtr jako blackbox , kterej Ti hodí všechny možný čísla písniček. Takovej filtr poskládáš snadno, třeba u autora:
(SELECT pisnicka_id FROM pisnicka_autor WHERE autor_id IN (SELECT id FROM autor WHERE jmeno = "Cimrman")
Podmínka ve where může bejt různá, např. WHERE autor_id = 1 nebo autor_id IN (1,2,3,4), podle toho, jak autory vybíráš.
Úplně stejnou podmínku můžeš udělat pro žánry, alba, co tě napadne.
No a teď vem tendle kus dotazu jakko blackbox kdekoli potřebuješ vybrat písničky:
SELECT * FROM pisnicka WHERE id IN <blackbox>
Nebo kde potřebuješ vybrat <entitu> (např. žánr, autora, atd...) z daných <entit>, které jsou možné pro již vybrané písničky
SELECT * FROM <entita> WHERE id IN (SELECT <entita>_id FROM <entita>_<pisnicka> WHERE <pisnicka_id> IN <blackbox>
V podstatě todle jsou všechny dotazy, které budeš potřebovat.
- ad opakující autoři:
Pokud Ti ten dotaz
SELECT artist FROM artist_table WHERE artist_id IN (...subselect...)
vyhodí opakující se autory, je to čistě proto, že v té tabulce opakující autoři prostě jsou :-). Řešení tedy není expost group by, ale už při plnění tabulky se duplicit vyvarovat. Nejlépe tak, že hodíš na sloupce, které by neměli být duplicitní omezení (constraint) UNIQUE (zároveň slouží jako index) a tabulku znova naplníš. Samo Ti to zařve v okamžiku, kdy tam budeš chtít vložit druhého stejného autora a budeš moct to opravit tak, aby to místo toho použilo již toho co tam je.
-ad jak dostat autora, album atd....
No jsou dvě možnosti: buďto opravdu přidat pro každou subtabulku, nebo si ty záznamy ze subtabulek vypsat vedle, strčit do nějakýho hashpole (v pythonu asi dictionary) a tahat je v případě potřeby. První řešení se vyplatí, pokud se tahá relativně málo písniček, druhý řešení se hodí, pokud se tahá hodně písniček a počet písniček značně převyšuje počet autorů/alb atd...
Pokud jsi tam Ty joiny dal a bylo to pomalý, pak je to možná tím problémem z předchozího odstavce, popř. je také možné, že Ti někde schází indexy... anebo tam např. někde schází nějaká potřebná podmínka. Zkus sem až ten předchozí problém vyřešíš dát ten dotaz, co je pomalej, a zároveň ještě jeho EXPLAIN (spusť ten samý dotaz, ale před něj napiš EXPLAIN, tzn. EXPLAIN SELECT ...........
- Jinak Ti doporučuju na to nezanevřít - mkožná to je opravdu overkill, ale na to, abys pro příště poznal, co už je overkill a co ne bys měl ten "overkill" zvládat a to se nenaučíš líp, než tak, že to prostě napíšeš.