Autor Zpráva
matak
Profil
mám databázi celkem navštěvovanou a je tam více než 500 000 záznamů, chci vyhledávat vlastnosti jako

skladem, výprodej, hlavní stránka, akce, atd. momentálně je to tabulka co má sloupec s každou takovou vlastností, ale já těch vlastností chci přidat více, ne moc ale bude jich třeba 15 a chci, aby si to každý eshop mohl určit

nelíbí se mi metoda mít sloupec1, sloupec2 ... 15 raději bych nějaké tagování, ale to bude hodně neefektivní vyhledávat s joinem rád bych se tomu vyhnul

jeden hash se mi nelíbí dát to do sloupečku a vyhledávat textově

1,2,3,4,5

a já budu hledat všechny co mají 2 nebo 4 ? opět dost neefektivní

neexistuje nějaký možnost bitového součtu? že vždy kombinace libovolných čísel by dala jedno číslo? akorát to mi zase nebude sedět protože produkt s 2,4 nenajde pokud hledám ten co má alespoň 2

fakt jediný způsob je hledat podle joinované tabulky?
juriad
Profil
Při takovém množství vždy chceš použít indexy.
Textový index existuje jen fulltextový nebo prefixový. Použitelný by byl jen ten fulltextový, ale nemyslím si, že je nejvhodnější.

Druhou možností je ukládat tagy jako čísla; v takovém případě index udržuje setřížený seznam záznamů a vyhledávání je pak v logaritmickém čase. Rozsah záznamů pak podpovídá souvislému bloku v indexu.

Bitové operace bohužel databáze neumí indexovat.

Join zas tak špatný není; databáze jsou na to stavěné, aby ho prováděly rychle. Zlášť pokud existují indexy.
Kajman
Profil
matak:
Pokud hledáš třeba pět vlastností v tabulce, kde jsou ulořeny po řádcích, nebusí být přijoinovaná 5x. Jde to napsat i jako
select id_zbozi
from vlastnosti_zbozi
where id_vlastnosti in (2,4,8,16,32)
group by id_zbozi
having count(distinct id_vlastnosti)=5
Joker
Profil
matak:
nelíbí se mi metoda mít sloupec1, sloupec2 ... 15
Naprosto oprávněně, to je cesta do pekel.

ale to bude hodně neefektivní vyhledávat s joinem rád bych se tomu vyhnul
Bylo to v nějakém konkrétním případě pomalé, nebo to je jen takový neurčitý pocit, že join bude pomalý?

Jestli Vás to uklidní, JOIN bude nejspíš efektivnější, než „magie“ s dolováním obsahu ze sloupce obsahujícího více hodnot.
matak
Profil
díky, bohužel se mi potvrdilo, že to musím dále dělat jako doteď, no nemám vyzkoušené co to udělá ale mám i eshop, kde není problém mít dny s 50k návštěvníky a na takovém eshopu se snažíme lidem nedovolit vyhledávat parametricky což odpovídá těmto tagům na které chci přejít, mám dost obavy aby to nekleklo
Kajman
Profil
matak:
bohužel se mi potvrdilo, že to musím dále dělat jako doteď

Jak jsi dospěl k potvrzení, že to nejde udělat dle [#3]?
Joker
Profil
matak:
mám dost obavy aby to nekleklo
Já v tom nevidím nějaký výkonový zádrhel.
Sice tam je několik operací, ale všechny by měly být rychlé.
Tabulka štítků bude vlastně jen id zboží - id štítku, což jsou dvě čísla, takže dost bezproblémová tabulka (když bude typu MySQL MyISAM, bude to rychlá statická tabulka).
I kdyby většina zboží měla několik štítků, bude záznamů maximálně pár milionů, vybrat z toho řekněme desítky tisíc IDček zboží by měla být pohoda.
A pak vlastně uděláte JOIN řekněme desítek tisíc IDček s tou tabulkou zboží, navíc podle primárního klíče, což by taky neměl být problém.
juriad
Profil
Kajman:
Podle mě se ptá na disjunkci, nikoli na konjunkci, kterou mu nabízíš ty.

matak:
Chceš hledat produkty, které mají některý ze štítků, nebo naopak produkty, které mají všechny štítky?

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: