Jak navrhnout DB pro "výskyt produktů"? – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak navrhnout DB pro "výskyt produktů"? – MySQL – Fórum – Programujte.comJak navrhnout DB pro "výskyt produktů"? – MySQL – Fórum – Programujte.com

 

CZechBoY+4
Věrný člen
14. 3. 2012   #1
-
0
-

Zdravim,

potřeboval bych pomoct s návrhem DB pro e-shop.

Konkrétně se jedná o tabulku s kategoriemi a zobrazení kategorií u produktu.

Jediné řešení co mě napadlo:
tabulka product2category (product_id, category_id) + tabulka category(category_id, parent_id, zanoření ve stromu)

Každý produkt má minimálně 20 stromů kategorií (třeba auto->motor->příslušenství->olej)

Nahlásit jako SPAM
IP: 213.192.10.–
An
~ Anonymní uživatel
19 příspěvků
31. 7. 2012   #2
-
0
-

#1 CZechBoY

Je-li tvůj produkt zanořený do 20 kategorií, pak ke zjištění celé této cesty potřebuješ buď 20 dotazů (1 na kategorii a 19 na parent_id) a nebo 1 dotaz s JOIN na 20 tabulek.

Alternativa může být např. toto http://php.vrana.cz/traverzovani-kolem-stromu-prakticky.php 

Nahlásit jako SPAM
IP: 213.151.77.–
CZechBoY+4
Věrný člen
31. 7. 2012   #3
-
0
-

#2 An
jj už jsem to udělal tim jednim, ale mám problém se stránkováním :(

skládám ty kategorie za sebe (Ford-Focus-..-kola) pod tim (Audi-A8-...-kola) a někdy tam je jen BMW-3-kola

tohle asi nejde ošetřit co?

Nahlásit jako SPAM
IP: 213.192.10.–
An
~ Anonymní uživatel
19 příspěvků
1. 8. 2012   #4
-
0
-

"už jsem to udělal tim jednim" - jaký přístup jsi tedy zvolil?

"Problém se stránkováním" - upřesni mi to: stránkování čeho? produktů v kategorii?

"Každý produkt má minimálně 20 stromů kategorií" - minimálně nebo maximálně?

Jinak, našel by se i způsob, jak přečíst těch 20 odkazů na kategorie, které máš takto ve 20 záznamech uložené v tabulce, na jeden dotaz/komunikaci s databází. Buď přes uloženou proceduru a nebo přes finesu, které se říká CTE - Common Table Expressions (jen jsem o tom slyšela a nevím, jestli to má MySQL - to by chtělo nastudovat).

Někoho by napadlo též vkládat cestu jednotlivých kategorií, tak, jak jdou za sebou, do jedné hodnoty jako celek (např. jako seznam čísel, oddělených čárkou), ale akademik by nad tím pozvedl obočí, protože je to nesystémové řešení.

Nahlásit jako SPAM
IP: 213.151.77.–
CZechBoY+4
Věrný člen
1. 8. 2012   #5
-
0
-

aktuální řešení: tabulka p2c(product_id, category_id)
příklad: 1,2;1,3;1,9;1,458452;1,1521578

v tabulce už je to seřazené podle category.depth takže neztrácím čas řazením

tabulka má zatím 7M řádků což je asi 1/6 výsledného objemu

aktuální SQL dotaz: 

query("SELECT c.*,cd.* FROM product_to_category p2c ".
															"LEFT JOIN category c ".
																"ON c.category_id=p2c.category_id ".
															"LEFT JOIN category_description cd ".
																"ON c.category_id=cd.category_id ".
															"WHERE p2c.product_id=".$product_id." LIMIT ".($vyskyt_page-1)*$vyskyt_limit.",".$vyskyt_limit)

trvá zhruba půl sekundy (s countem teda sekunda) nic extra hroznýho, ale bojim se, že až to nabyde tak to bude pomalejší

dál je tam ten problém, že někde je těch kategorií 10 a někde třeba 5 (v tom stromu-Náhradní díly-Ford-Focus-...-světla)

kdyžtak náhled (zde chyba není)
zatim hledám produkt, kde ta chyba je

Nahlásit jako SPAM
IP: 213.192.10.–
KIIV
~ Moderátor
+43
God of flame
1. 8. 2012   #6
-
0
-

#5 CZechBoY
spis bych se bal, az se ti tam objevi vic dotazu najednou :)  Pul sekundy na jeden dotaz je hodne - a kdyz ti tam prijde 10 lidi tak pak uvidis zac je toho loket :D

zkus si pak udelat nejakou simulaci

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CZechBoY+4
Věrný člen
1. 8. 2012   #7
-
0
-

#6 KIIV
jo ale jak to mám snížit :D

Nahlásit jako SPAM
IP: 213.192.10.–
Sipi
~ Anonymní uživatel
19 příspěvků
1. 8. 2012   #8
-
0
-

#4 An
"Buď přes uloženou proceduru a nebo přes finesu, které se říká CTE - Common Table Expressions (jen jsem o tom slyšela a nevím, jestli to má MySQL - to by chtělo nastudovat)."

Presne tak, obycajne sa to robi cez rekurzivnu CTE aleho inu hierarchicku funkciu ako napr. "connect by" v oracle.

Mysql myslim ale ziadnu nema.

Nahlásit jako SPAM
IP: 144.36.194.–
KIIV
~ Moderátor
+43
God of flame
1. 8. 2012   #9
-
0
-

#7 CZechBoY
na to se da odpovedet, az kdyz clovek pochopi presne zadani .. coz z popisu zatim moc nehrozi :D

v horsim pripade by se dalo presunout kus logiky do aplikace... mit tu tabulku ve stylu produkt + seznam kategorii oddelenych strednikem... nicmene to by bylo jen pro prochazeni podle produktu, opacne by to bylo neskutecne pomaly

a muselo by se to refreshovat (pri zmenach produktu)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CZechBoY+4
Věrný člen
1. 8. 2012   #10
-
0
-

#9 KIIV
potřebuju seznam všech kategorií jen u konkrétního produktu, obráceně to mám zařízený už jinak(kategorie a nadřazená kategorie)

potřebuju prostě udělat výskyt k produktu (v jakých kategoriích se nechází, u těch aut to je trošku složitější)

Nahlásit jako SPAM
IP: 213.192.10.–
CZechBoY+4
Věrný člen
3. 8. 2012   #11
-
0
-

#9 KIIV
při struktuře product_id, category_ids(oddělené čárkami, mediumtext) a selectem s IN to nějak nefaká a ukáže to jméno jen jedný kategorie :(

SELECT name FROM oc_category_description WHERE category_id IN (SELECT category_ids FROM p2c WHERE product_id=7)

myslim si, že tohle bude hodně pomalý řešení

když tam dám obsah toho subquery ručně tak to stejně nefunguje jak potřebuju - chybí tam kategorie který už jednou ve výsledku jsou

Nahlásit jako SPAM
IP: 213.192.10.–
CZechBoY+4
Věrný člen
10. 8. 2012   #12
-
0
-

#5 CZechBoY
no takže jsem zjistil, že u dalších dílů tam není fixní počet kategorií snad nikde

jak teda vytáhnout ten výskyt?

ukázka třeba tady

Nahlásit jako SPAM
IP: 213.192.10.–
An
~ Anonymní uživatel
19 příspěvků
13. 8. 2012   #13
-
0
-

Jak často předpokládáš, že se bude měnit strom kategorií (nemyslím přidávání nových, ale hlavně přesouvání těch existujících)? Bude to hodně často, docela často nebo naopak předpokládáš, že moc ne nebo jen velmi výjimečně?

Pokud jen výjimečně, pak by sis mohl pomoci trikem, který není zrovna čistý, ale zajistí větší rychlost. A sice, místo předchozí kategorie ve formě čísla (parent_id) si budeš ukládat celou cestu od kořene stromu kategorií až k dané kategorii (například jako IDčka oddělené čárkami, aby se dala pohodlně vložit do SQL operátoru IN()). Každý přesun podstromu ale bude potřebovat "přepočítání" seznamu nadřazených kategorií u každé kategorie, které se to týká.

Druhá věc je zjistit si souhrnně všechna ID kategorií, které budu vypisovat (mnoho z nich se bude opakovat), načíst si je do pole a při jejich vypisování používat toto pole a ne dotazy do databáze.

Nahlásit jako SPAM
IP: 213.151.77.–
CZechBoY+4
Věrný člen
17. 8. 2012   #14
-
0
-

#13 An
idečka oddělený čárkama jsem zkoušel, že by to bylo zrychlení bych neřekl.. z 500ms dotazu byl rázem dotaz trvající 20sekund (pak jsem to stopl)

ad 2 nechápu

použil jsem toto řešení: v p2c ukládám jen poslední kategorii ze stromu, potom pro každý strom pokládám dotaz na funkci, která mi vrátí id kategorií ze stromu (pomocí parent, parent, parent, ..) a názvy kategorií

je to dost rychlý, prtže se vždy vypisuje max 30 stromů

Nahlásit jako SPAM
IP: 213.192.10.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý