Hledání pomocí tagůZdravím, hledám nejoptimálnější variantu, jak hledat podle tagů a to následujícím způsobem
Mám 3 tabulky:
Data, Tags, DataAndTags.
Organizace je zřejmá, v tabulce Data mám nějaké řádky, v tabulce Tags mám nějaké tágy a v tabulce DataAndTags mám ve dvou sloupcích provedeno propojení mezi daty a tágy. Je to prostě vztah N:M
Dejme tomu, že spojení označím
Data.Id -> DataAndTags.Data_Id
Tags.Id -> DataAndTags.Tag_Id
A teď dotaz. Mám v tabulce Tags tyto tágy: A,B,C,D,E,F,G,....,Z a v tabulce Data je hromada dat, kde každý řádek má prakticky libovolnou kombinaci tágů.
Od uživatele mi přileze takovýto dotaz:
Najdi mi všechny záznamy, kde jsou vysačky
(A and B and X) or (A and B and Y) or (A and C and X) or (A and C and Y)
On to tedy ten uživatel zadává jinak, on zadá spíš to, že ho zajímají položky s tágama A,B,C,X,Y ale protože tágy mají ještě nějakou vnitřní strukturu, kterou nepovažuji za důležitou zde řešit, nějaký query parser z toho výrobí výše zmíněný dotaz.
A teď jak to přepsat do SQL dotazu?
Zatím mě nenapadlo nic lepšího, než to rozdělit do 4 dotazů sloučených přes UNION a každá ta disjunktní množina se vyhodnotí dotazem seskládaným pomocí JOIN sama se sebou. Vstupem je vždycky tento součinový tvar a nedá se zatím zadávat negace (například, že nějaký tág vyloučím... ale možná to tam časem přibude, uvidím co bude říkat zákazník). Na úrovni vstupu se to dá optimalizovat jestě Karnaughovou mapou :-) ale do toho jsem se ještě nepouštěl |