Autor | Zpráva | ||
---|---|---|---|
Jan Tvrdík Profil |
#1 · Zasláno: 12. 3. 2009, 22:13:02
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 |
#2 · Zasláno: 12. 3. 2009, 22:26:55
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 |
#3 · Zasláno: 12. 3. 2009, 22:58:30 · Upravil/a: TomášK
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 |
#4 · Zasláno: 12. 3. 2009, 23:02:21
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 |
#5 · Zasláno: 13. 3. 2009, 17:57:09 · Upravil/a: Jan Tvrdík
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' |
||
Časová prodleva: 4 dny
|
|||
Kajman_ Profil * |
#6 · Zasláno: 17. 3. 2009, 09:56:55
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. |
||
Časová prodleva: 15 let
|
0