Hledani podle vice klicovych slov

Milos Dvorak milos na rosice.cz
Pátek Červen 20 20:26:30 CEST 2003


Pekny podvecer. Po 14 mesicich odebirani teto konference se na vas
obracim s prvnim problemem, ktery sam nedokazu uspokojive vyresit.
DB server je MySQL 3.23.56, ale byl bych rad, kdyby to nebylo zavisle
na konkretnim DB stroji.

Mam tabulku Udaje (ID integer primary key, dalsi atributy). Pro kazdy
zaznam chci nekolik (0 az N, N neni predem dane) klicovych slov 
(jejichz seznam neni uzavren).

Chci co nejefektivneji realizovat nasledujici:
1. najit zaznamy podle zadanych klicovych slov ve vztahu 'or'
2. najit zaznamy podle zadanych klicovych slov ve vztahu 'and'
3. zjistit vsechna pouzita klicova slova (kvuli checkboxum)

Uvazoval jsem tyto alternativy:
A. tabulka KlicovaSlova (ID cizi klic z Udaje, Slovo string)
B. atribut KlicovaSlova v tabulce Udaje - retezec se seznamem klicovych 
   slov oddelenych napr. carkou nebo |, pricemz omezeni maximalni delkou
   retezce nevadi

Alternativa A: jednoduchymi dotazy umim zjistit 1 a 3, ale neumim
zjistit 2 jinak, nez jako zretezeni tolika joinu, kolik klicovych slov 
chci hledat, napr.:
select ... from Udaje
  left join KlicovaSlova as K1 using (ID)
  left join KlicovaSlova as K2 using (ID) ...
  where K1.Slovo=$slovo1 and K2.Slovo=$slovo2 ...
Fulltext search s moznostmi +slovo1 +slovo2 (od verze 4.x) neni to prave
- dle dokumentace ignoruje kratka slova (kratsi jak 4 znaky) a z castych
vyskytu (ve vic jak 50 % radku) udela stop slova.

Alternativa B: jednoduchymi dotazy umim zjistit 1 a 2, pomoci select
distinct KlicovaSlova a prenesenim casti prace na aplikaci pak i 3, coz
se mi ale nezda dost efektivni.

Napadlo me rozsireni alternativy B o tabulku PouzitaKlicovaSlova, ktera
by obsahovala prosty vycet pouzitych klicovych slov, byla by doplnovana
s kazdym insertem/updatem (duplicitu ohlida PK) a jednou za cas by byla
prebudovana podle skutecnych pouzitych slov, aby z ni vypadla ta slova,
ktera po delete/update na tabulce Udaje uz neexistuji. Pritomnost nekolika
nepouzitych klicovych slov by nevadila.

Jak by tuto situaci resili zdejsi databazovi guruove? Diky za odpovedi.

M. Dvorak



Další informace o konferenci Databases