CREATE TABLE `Tracklista` ( `TracklistaID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `KiedyGrane` timestamp NULL DEFAULT NULL, `UtworID` int(11) NOT NULL, PRIMARY KEY (`TracklistaID`), UNIQUE KEY `KiedyGrane` (`KiedyGrane`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ; CREATE TABLE `Utwor` ( `UtworID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `WykonawcaID` int(11) NOT NULL, `UtworTytul` varchar(255) COLLATE utf8_polish_ci NOT NULL, PRIMARY KEY (`UtworID`), UNIQUE KEY `UtworTytul` (`UtworTytul`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ; CREATE TABLE `Wykonawca` ( `WykonawcaID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `WykonawcaNazwa` varchar(255) COLLATE utf8_polish_ci NOT NULL, PRIMARY KEY (`WykonawcaID`), UNIQUE KEY `WykonawcaNazwa` (`WykonawcaNazwa`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
Czy tak wyglądająca struktura bazy jest według Was w porządku, czy można by jeszcze ją bardziej zoptymalizować, coś odjąć, dodać?
W jaki sposób mając dane w postaci zmiennych $utwor, $wykonawca, $data najbardziej optymalnie wykonać takie zadanie:
Dodać zawartość zmiennej $wykonawca do tabeli 'Wykonawca' (tylko jeśli jej nie ma w tabeli), następnie z tabeli 'wykonawca' pobrać pole WykonawcaID dla rekordu zgodnego ze zmienną $wykonawca, i dodać pobraną wartość WykonawcaID i zmiennej $wykonawca do tabeli 'utwory' (tylko jeśli tego zestawu nie ma jeszcze). Na końcu pobrać z tabeli 'utwory' UtworID dla zestawu "WykonawcaID i $utwor", i wrzucić go do tabeli 'Tracklista', razem ze zmienną $data
Do powyższego zadania widzę konieczność wykonania conajmniej 5 zapytań na jeden utwór:
$sqlQuery1 = INSERT IGNORE INTO 'Wykonawcy' (WykonawcaNazwa) VALUES ($wykonawca); $sqlQuery2 = SELECT 'WykonawcaID' FROM 'Wykonawcy' WHERE 'WykonawcaNazwa' LIKE '$wykonawca'; // wynik tego zapytania przypisujemy do zmiennej $WykonawcaID $sqlQuery3 = INSERT IGNORE INTO 'Utwory' (WykonawcaID, UtworTytul) VALUES (WykonawcaID, $utwor); // no właśnie, jak tu dodać tylko unikalne zestawy WykonawcaID, UtworTytul? $sqlQuery4 = SELECT 'utworID' FROM 'utwory' WHERE 'WykonawcaID'='$WykonawcaID' AND UtworTytul LIKE '$utwor' // wynik tego zapytania przypisujemy do zmiennej $UtworID $sqlQuery5 = INSERT IGNORE INTO 'Tracklista' (KiedyGrane, UtworID) VALUES ($data, $UtworID);
Biorąc pod uwagę że każde wywołanie skryptu który będzie uruchamiany cronem, to próba dodania w pętli 20 rekordów, robi się już 100 zapytań na jedno wywołanie skryptu, więc wydaje mi się to trochę nieoptymalne, nie wiem czy dobrze myślę, ale wydaje mi się że mogę wyeliminować oddzielne zapytania select wrzucając je od razu do zapytań insert, ale nie wiem czy to już najbardziej optymalne rozwiązanie?