Kategorie v e-shopu. Rekurzivni SQL dotaz. rubrika: Databáze: SQL
(MariaDB, PHP7)
Dobry den,
potrebovala bych nejak nakopnout s tim, jak vyresit sub-kategorie a zarazeni produktu do nich v e-shopu.
Myslela jsem, ze MariaDB jiz konecne podporuje rekurzivni dotazy a ono porad jeste nic. :(
Chtela jsem to udelat tabulkou: id|name|parent_id a jednim dotazem vybrat celou cestu. Ale to nejde.
Nested Set Model popsany zde http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ mi pripadne prilis slozity na udrzovani (budu mit mooooc kategorii a casto se budou menit).
Mate nekdo nejaky napad jak jednoduse udelat kategorie v e-shopu, vcetne moznosti, ze vyberu nadrazenou kategorii a ono mi to vrati vsechny produkty zarazene ve vsech sub-kategoriich?
Predem diky za nakopnuti :)
Martina
Vzhledem k tomu, že to používáme na našich eshopech tak:
- Pomocná tabulka products_categories, která obsahuje productid a categoryid, tata kombinace je zároveň primární klíč
- Každý produkt je zařazen v N kategoriích
- Při importu produktu do eshopu se projdou všeechny kategorie do kterých je produkt zařazen a proskenuje se strom a zjistí se všechny možné kategorie, které jsou součástí cesty kategorií ve kterých je produkt zařazen a tyto kombinace se uloží do product_categories
Takže pak se stačí zeptat na jakoukoliv kategorii a pomocí jednoho selectu se vytáhnou všechny produkty v dané kategorii.
Je sice pomalé zapisování produktů do této tabulky, ale to se zase tak často nemění. A výběr do katalogu produktů je pak velmi jednoduchý.
Jenom je potřeba si trošku pohrát s nested setem a mít u něj pevné categoryid(tj.nikdy se nemění, v našem případě se bere z ERP, proto to v tabulce není typ serial) a pak počítané nscategoryid, aby to sedělo v nested setu.
Dále pak kategorie ani produkty nemažeme, jenom deaktivujeme. To je zase kvůli vyhledávačům, aby nekončili na 404. Pokud se kategorii změní uložení ve stromu, a tím padem cesta, mám tam hooky co automaticky vytvoří redirect na novou cestu aby user/vyhledávač neskončil na 404. Ale to už je trošku delší povídání a tabulky xD.
Tohle je kód na Postgre, vynechal jsem některé sloupce
CREATE TABLE categories ( categoryid integer NOT NULL, title character varying(30) NOT NULL, ... active boolean NOT NULL DEFAULT true, ... rootid bigint, lft integer, rgt integer, level smallint, ... nscategoryid integer, CONSTRAINT categories_pkey PRIMARY KEY (categoryid) ) WITH ( OIDS=FALSE ); CREATE TABLE products_categories ( productid integer NOT NULL, categoryid integer NOT NULL, CONSTRAINT products_categories_pkey PRIMARY KEY (productid, categoryid), CONSTRAINT products_categories_categoryid_categories_categoryid FOREIGN KEY (categoryid) REFERENCES categories (categoryid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE CASCADE, CONSTRAINT products_categories_productid_products_productid FOREIGN KEY (productid) REFERENCES products (productid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE CASCADE ) WITH ( OIDS=FALSE );
Pro zobrazení všech 5 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře