Autor Zpráva
Jan Tvrdík
Profil
Mám následující strukturu tabulky:
id          | int      | primární klíč
kategorie   | int      | cizí klíč
obsah       | text
url         | varchar


Platí, že url musí být v dané kategorii unikátní => unikátní klíč na dvojici (karegorie, url).

Moje otázka zní, zda má smysl házet ještě navíc klíč INDEX na sloupec url, když se podle tohoto sloupce bude vyhledávat, nebo jestli stačí UNIQUE klíč na dvojici (karegorie, url).
Mastodont
Profil
Vyhledávat se bude podle URL? A to podle celé adresy nebo jen domény?
Proč jen jedna kategorie ke každé URL, to je strašně svazující ...
TomášK
Profil
Pokud bys chtěl zachovat současnou strukturu, záleží na tom, jak přesně budou dotazy formulované. Pokud budeš vyhledávat url v dané kategorii, pak stačí index, který máš. Pokud budeš vyhledávat jen url, pak můžeš buď změnit index na UNIQUE(url, kategorie) nebo přidat další index na url.
SELECT * FROM weby WHERE kategorie = 1 AND url = 'www.jakpsatweb.cz' // použije se index UNIQUE(kategorie, url)
SELECT * FROM weby WHERE url = 'www.jakpsatweb.cz' // na tohle by se hodil index na url, případně UNIQUE(url, kategorie)
ninja
Profil
Jan Tvrdík: Pokud hledani bude pres URL na ne i pres kategorii, tak ten unikatni index udelat (url, kategorie). Pokud bude prvni kategorie, v hledani nepujde pouzit.
Jan Tvrdík
Profil
Zapomněl jsem uvést, že se jedná o tabulku se stránkama. Routování vypadá asi takto:

$path = 'jidlo/ovoce/hruska'; // stránka hruška v kategorii ovoce v nadřazené kategorii jídlo.
$pathParts = explode('/', $path);

$where = array();
$where['pages.url'] = array_pop($pathParts);
$where['c1.url'] = array_pop($pathParts);
$where['c2.url'] = array_pop($pathParts);

$query = dibi::query('
	SELECT [pages].[id]
	FROM [pages]
		LEFT JOIN [categories] AS [c1]
			ON [pages].[category] = [c1].[id]
		LEFT JOIN [categories] AS [c2]
			ON [c1].[parentCategory] = [c2].[id]
	WHERE
		%and', $where, '
');


Sestavený SQL dotaz:
SELECT `pages`.`id`
FROM `pages`
LEFT JOIN `categories` AS `c1`
 ON `pages`.`category` = `c1`.`id`
LEFT JOIN `categories` AS `c2`
 ON `c1`.`parentCategory` = `c2`.`id`
WHERE
 `pages`.`url` = 'hruska' AND `c1`.`url` = 'ovoce' AND `c2`.`url` = 'jidlo'
Kajman_
Profil *
Jestli se hodí index, prozradí explain. Stačí si ho zkusit vytvořit a vyzkoušet, zda se použije. (Jen je třeba mít dost dat, na tři řádky se nepoužije nikdy.)

Pokud je ve where jen url, tak bych tipnul, že pomůže. Také by mohlo stačit otočit pořadí v tom unikátním klíči na (url,kategorie) - ale to zase nemusí vyhovovat jiným dotazům.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: