Autor | Zpráva | ||
---|---|---|---|
Jack06 Profil |
#1 · Zasláno: 1. 11. 2009, 08:37:34
Dobrý den dnes jsem viděl tabulku s kategoriema a podkategoriema v jednom. Byla tvořena asi takto:
ID | Název kategorie/podkategorie | ID kategorie 01 | Kategoriex | 0 02 | Kategoriey | 0 03 | Podkategoriex | 1 04 | Podkategoriey | 1 ... ID Kategorie - číslo pod kterou kategorii spadá když je číslo 0 tak je to Název kategorie, když je jiné od nuly tak se přiřazuje k jedinečnému identifikátoru dané kategorie tadyten řetězec tedy vypadá takto Kategoriex -- Podkategoriex -- Podkategoriey Kategoriey Je lepší to dělat tímto způsobem, nebo přez dvě tabulky: ID | Název kategorie --------------------------------------- ID | Název podkategorie | ID kategorie ?? Děkuji za radu, či lepší řešení. |
||
Alphard Profil |
#2 · Zasláno: 1. 11. 2009, 09:08:11
Výhoda první možnosti je hlavně v tom, že můžete zanořovat do neomezené hloubky. Konkrétně tohle řešení se ale vypisuje rekurzivně a to není moc efektivní, zkuste se podívat i na jiné algoritmy.
Metody ukládání stromových dat v relačních databázích | Interval.cz |
||
Jack06 Profil |
#3 · Zasláno: 1. 11. 2009, 09:27:46 · Upravil/a: Jack06
Mno mě jde o to že budu mít:
kategorii - podkategorii -zařazený výrobek - nazařazené výrobky a pak výrobky (když se někomu nebude hodit podkategorie, tak by dal výrobek jen do kategorie) Tak hledám, jaké řešení bude nejlepší a tak trochu si nevím rady. Hledám co nejmenší nápor na databázi při vypisování stromu včetně výrobků, přičemž podle mě by bylo lepší minimálně na výrobky mít samostatnou databázi. Asiže z toho co jste mi poslal tak ačkoli ne nejméně zátěžové, ale nejlepší práce by byla s metodou zásobníku. Výsledkem, který potřebuji je pouze strom: Kategorie (počet výrobků) - podkategorie(počet výrobků) - podkategorie(počet výrobků) atd |
||
Alphard Profil |
#4 · Zasláno: 1. 11. 2009, 10:31:11 · Upravil/a: Alphard
Jack06:
„přičemž podle mě by bylo lepší minimálně na výrobky mít samostatnou databázi“ Určitě, ale stačila by samostatná tabulka (asi jste to tak myslel). „ale nejlepší práce by byla s metodou zásobníku.“ Tím neušetříte dotazy na databázi. Jestli je počet kategorií malý, můžete vše načíst jedním dotazem do pole a z něho rekurzivně poskládat. Jinak bych šel do Traverzování kolem stromu. |
||
Jack06 Profil |
#5 · Zasláno: 1. 11. 2009, 10:48:55
Alphard:
Kategorií bude tak 10-20 a v každé kategorii kolem 10 podkategorií zbytek už jen výrobky zařazené buď přímo do podkategorií, nebo jen do kategorie |
||
Časová prodleva: 13 dní
|
|||
Jack06 Profil |
#6 · Zasláno: 14. 11. 2009, 09:56:40 · Upravil/a: Jack06
Omlouvám se, že sem píšu znovu, nicméně jsem se pokoušel nějak rozjet tu rekurzivní třídu a nejde mi to :-(
Tabulka v mysql je: CREATE TABLE category ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INT(10) UNSIGNED NOT NULL, title VARCHAR(50) NOT NULL, seo_title VARCHAR(50) NOT NULL, meta_keywords VARCHAR(250) NOT NULL, meta_description VARCHAR(250) NOT NULL, description TEXT NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), INDEX category_parent(parent_id), INDEX category_title(title) ); a tu třídu jsem zkoušel tuto: <?php Class TreeCat { var $id = 0; var $name =''; var $level = 0; var $childNodes = array(); function TreeCat($id, $name, $level){ $this->id=$id; $this->name=$name; $this->level=$level; $this->db = MyDB::getDB(); $this->db->set_charset('utf8'); $re = $this->db->query("SELECT id, title FROM category where (parent_id=$id)"); while ($r = $re->fetch_assoc()) { $this->childNodes[] = new TreeCat($r['id'], $r['title'], $level++); } print $childNodes; } } ?> buď mi to naháže errory, že $id atd neexistují, nebo mi to nic nevypíše a nějak nevím jak to udělat, aby se mi vypsal ten strom :-( Děkuji za rady |
||
_es Profil |
#7 · Zasláno: 14. 11. 2009, 10:36:57
Jack06:
„Kategorií bude tak 10-20 a v každé kategorii kolem 10 podkategorií zbytek už jen výrobky zařazené buď přímo do podkategorií, nebo jen do kategorie“ Tak to potom sprav nejako jednoducho, ak má byť výrobok len v jednej kategórii, napríklad: Tabuľka kategórií a podkategórií: Id | Názov | Id nadradenej kategórie Tabuľka výrobkov: Id | Názov | Id kategórie alebo podkategórie Ak by mohol byť výrobok aj vo viacerých kategóriách alebo podkategóriách, tak to bude asi najlepšie ešte s tabuľkou naviac. A stačia ti na to len SQL dotazy a netreba žiadne rekurzívne algoritmy v PHP. |
||
Jack06 Profil |
#8 · Zasláno: 14. 11. 2009, 10:45:41
_es:
To ano, ale k té první tabulce potřebuju vypsat ten strom kategorie -podkategorie -podkategorie -podkategorie -podkategorie -podkategorie kategorie_b -podkategorie_b -podkategorie_b -podkategorie_b -podkategorie_b -podkategorie_b s těma dvěma tabulkama samozřejmě počítám, akorád jestli to mám teda udělat takto: <?php $ca = $this->db->query("SELECT id, title FROM category where (parent_id=0)"); while ($c = $ca->fetch_assoc()) { print "$p[title]<br>"; $po = $this->db->query("SELECT title, title FROM category where (parent_id=$c[id])"); while ($p = $po->fetch_assoc()) { print " => $p[title]<br>"; } } ?> ? Zdá se mi to moc dotazů k mysql, proto jsem hledal lepší řešení ohledně třídy, která by vytáhla ty data jednou a seředila si je do toho stromu |
||
_es Profil |
#9 · Zasláno: 14. 11. 2009, 11:15:24 · Upravil/a: _es
Jack06:
Na ten strom by ti mal tiež stačiť SQL dotaz: Ak budú stĺpce id, nazov, idN, idN2: SELECT nazov FROM category ORDER BY idN2, idN, id Stĺpec idN2 je taký istý ako idN, až na to, že pre hlavné kategórie je rovnaký ako id. Ešte ti zostáva nejako doplniť to formátovanie pre podkategórie. Možno by to šlo aj bez stĺpca naviac, no či by bol potom ten SQL dotaz taký jednoduchý... |
||
Jack06 Profil |
#10 · Zasláno: 14. 11. 2009, 11:21:53
_es:
Tak trochu to enchápu to idN2, IdN, id Přeciže by to snad muselo jít lépe ne? Myslím například na to sepsat nějakou funkci v php, která by si ty záznamy řešila :-) |
||
_es Profil |
#11 · Zasláno: 14. 11. 2009, 11:34:12
Jack06:
Načo chceš silou mocou používať PHP na zoraďovanie riadkov v databáze? Na to je predsa priamo databáza a ty si ju musíš navrhnúť tak, aby ti na takéto jednoduché zoraďovanie stačili SQL dotazy. „Přeciže by to snad muselo jít lépe ne?“ Asi áno, no nie nejakými PHP funkciami. Len som sa ťa snažil postrčiť iným smerom. |
||
Jack06 Profil |
#12 · Zasláno: 14. 11. 2009, 11:48:47
_es:
mohl by jsi mi dát třeba příklad s těmi idN2, IdN, id jak by to vypadalo v tabulce a jak se to vypsalo? protože to nějak moc nechápu jak si to udělá samo strom kategorie a pak s odrážkou podkategorie, abych to jako uživatel viděl na obrazovce |
||
_es Profil |
#13 · Zasláno: 14. 11. 2009, 12:12:49 · Upravil/a: _es
Jack06:
Napríklad: SELECT CONCAT(IF(idN=0, "", "-"), nazov) AS nazov FROM category ORDER BY idN2, idN, id V tabuľke by si mal napríklad: 1, 'k1', 0, 1 2, 'pk1', 1, 1 3, 'pk2', 1, 1 4, 'k2', 0, 4 5, 'pk3', 4, 4 Možno to pôjde jednoduchšie alebo lepšie, no napadlo ma len toto. |
||
Časová prodleva: 14 let
|
0