IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak uložit stejné hodnoty u různých uživatelů

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:9.2.2017 21:22

Zdravým,

potřebuji poradit, nebo různé nápady jak provést a navrhnout databázi, aby byla co nejefektivnější. Snad to popíšu co nejlépe.

Popis:
Rád bych umožnil tvorbu vlastního playlistu a tím i vložení skladeb. Nejde mi o klasické vložení, ale o zamezení duplicitního vkládání skladeb.

Mám 3 tabulky -> playlisty,sklad­by_playlistu a videa. Podle ID uživatele vím, který playlist komu patří, následně vím i která skladba patří pod určený playlist a tabulka videa obsahuje data o skladbách. Jenže když 100 uživatelů si vloží do playlistu stejnou skladbu, tak v tabulce "skladby_playlistu" informace bude zbytečně 100x a to se mi nelíbí. Rád bych našel řešení, které bude celkově efektivnější. Mohl bych to házet do "pole", ale zpětné filtrování mi přijde náročnější. Rád bych uložil jen kod skladby, nebo id, abych to propojil s videos.
Aktuálně všechny 3 tabulky mám propojené v jeden dotaz, ale nic to nemění na mém puntičkářském dotazu.

Moje vize by byla, nějak jakoby z indexovat ID uživatelů, kteří by patřili k dané skladbě a databáze by věděla hned co s tím. Nechci provádět zbytečně další práci na straně PHP.

Jde také o to, že dat bude dost velké množství a to možná v milionech a kdo ví zda i víc.

Možná řeším něco nemožného :D

Ukázka:

public function ukazPlaylist($id,$uzivatel){
 try{
  $data = Db::dotazVsechny("SELECT * FROM ytb_custom_playlisty JOIN ytb_custom_playlist_skladby using (id_playlistu) JOIN videos using (youtube_kod) WHERE id_playlistu=? AND id_uzivatele=? order by guid DESC",array($id,$uzivatel));
  return $data;
 } catch (PDOException $e){
  echo $e; exit;
 }
}

Děkuji za každý nápad.

Editováno 9.2.2017 21:25
 
Odpovědět
9.2.2017 21:22
Avatar
Odpovídá na katrincsak
Patrik Valkovič:9.2.2017 22:12

Jméno je trošku zavádějící, ale pokud jsem to pochopil, tak tabulka videos obsahuje skladby. V principu se jedná o klasickou N:M relaci.....N uživatelů může mít tu stejnou skladbu a jeden uživatel může mít M skladeb. Lepší řešení, než máš v relačních databázích nevytvoříš. Budeš mít tabulku skladby_playlist

create table skladby_playlist (
skladba_id INTEGER,
playlist_id INTEGER,
FOREIGN KEY (skladba_id) REFERENCE videos(id),
FOREIGN KEY (playlist_id) REFERENCE playlists(id),
PRIMARY KEY (skladba_id,playlist_id)
)

Databáze je natolik chytrá, že si to přebere a optimalizuje. Nechal bych to tak.

Nahoru Odpovědět
9.2.2017 22:12
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
katrincsak
Člen
Avatar
Odpovídá na Patrik Valkovič
katrincsak:9.2.2017 23:15

Omlouvám se, ale nějak jsem nevěděl jak to co nejlépe popsat. Ale tvá odpověď mi zřejmě asi stačí a líbí se mi v tom, že to asi lépe nelze vymyslet v relační databázi.

Mohl by jsi mi ještě popsat co přesně dělá "FOREIGN" ve spojení "REFERENCE" ? anglicky tak dobře neumím a dokumentace mi tedy moc nepomohla. Ale předpokládám, že to částečně nahrazuje JOIN ?

 
Nahoru Odpovědět
9.2.2017 23:15
Avatar
Odpovídá na katrincsak
Patrik Valkovič:10.2.2017 10:05

S joinem a selectem to nemá co dělat, zajišťuje to podmínky pro hodnoty, které v tabulce můžou být.
https://cs.wikipedia.org/…%C3%AD%C4%8D

Nahoru Odpovědět
10.2.2017 10:05
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na katrincsak
Neaktivní uživatel:10.2.2017 10:17

To je cizí klíč. Ukazuje na primární klíč tabulky, se kterou máš relaci. Předpokládám, že používáš MySQL
https://dev.mysql.com/…gn-keys.html

Takže řekneš, že chceš vytvořit cizí klíč FOREIGN KEY na nějakém sloupečku playlist_id, který odkazuje REFERENCE na primární klíč druhé tabulky playlist(id), s tím že ideálně specifikuješ, co se má stát, pokud se id v cizí tabulce smaže nebo změní (ON DELETE a ON UPDATE)

Editováno 10.2.2017 10:18
Nahoru Odpovědět
10.2.2017 10:17
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:10.2.2017 10:31

Takže kdybych provedl úpravu, dejme tomu změnil ID, tak se změna automaticky provede i v té referované ? Stejně tak, kyž dojde k smazání ?

 
Nahoru Odpovědět
10.2.2017 10:31
Avatar
Odpovídá na katrincsak
Neaktivní uživatel:10.2.2017 15:29

Podle toho, jak si vybereš. Možnosti jsou opět v dokumentaci:

RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Nahoru Odpovědět
10.2.2017 15:29
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.