Aveți nevoie de model pentru căutare dinamică a mai multor tabele sql

Căut un model pentru efectuarea unei căutări dinamice pe mai multe mese.

Nu am niciun control asupra structurii tabelului de baze de date (și a unui proiect slab proiectat).

Luați în considerare un scenariu similar cu o căutare de reluare în cazul în care un utilizator ar putea dori să efectueze o căutare împotriva oricăror date din CV și să revină o listă de CV-uri care se potrivesc criteriilor lor de căutare. Orice câmp poate fi căutat oricând și în combinație cu unul sau mai multe alte câmpuri.

Interogarea reală sql este creată dinamic în funcție de câmpurile care sunt căutate. Cele mai multe soluții pe care le-am găsit implică complicate în cazul blocurilor, dar nu pot să cred că trebuie să existe o soluție mai elegantă, deoarece aceasta trebuie să fie o problemă rezolvată până acum.


Yeah, so I've started down the path of dynamically building the sql in code. Seems godawful. If I really try to support the requested ability to query any combination of any field in any table this is going to be one MASSIVE set of if statements. shiver


Cred că am citit că COALESCE funcționează numai dacă datele dvs. nu conțin NULL-uri. Este corect? Dacă da, nu merge, deoarece am valori NULL peste tot.

0
fr hi bn

3 răspunsuri

Căutarea și normalizarea pot fi în contradicție între ele. Deci, probabil, primul lucru ar fi să obțineți un fel de "vizualizare" care să arate toate câmpurile care pot fi căutate ca un singur rând cu o singură cheie care vă obține CV-ul. atunci puteți să aruncați în față ceva ca Lucene , pentru a vă oferi un index complet de text acele rânduri, modul în care funcționează este, îl cereți "x" în această vizualizare și vă revine cheia. Este o soluție excelentă și este recomandată de joel el însuși pe podcast în primele 2 luni IIRC.

0
adăugat

În măsura în care înțeleg (și sunt și cineva care a scris împotriva unei baze de date moștenitoare oribilă), nu există clauze dinamice WHERE. Nu a fost rezolvată.

Personal, prefer să generez căutările mele dinamice în cod. Face testul convenabil. Rețineți că, atunci când creați interogările SQL în cod, nu concatenați în introducerea utilizatorului. Utilizați @ variabilele!

Singura alternativă este utilizarea operatorului COALESCE. Să presupunem că aveți următorul tabel:

Users
-----------
Name nvarchar(20)
Nickname nvarchar(10)

și doriți să căutați opțional numele sau porecla. Următorul interogare va face acest lucru:

SELECT Name, Nickname
FROM Users
WHERE
    Name = COALESCE(@name, Name) AND
    Nickname =  COALESCE(@nick, Nickname)

Dacă nu doriți să căutați ceva, trebuie doar să treceți în nul. De exemplu, trecerea în "brian" pentru @name și null pentru @nick are ca rezultat următoarea interogare care este evaluată:

SELECT Name, Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

Operatorul de coalesce transformă nulul într-o evaluare a identității, care este întotdeauna adevărată și nu afectează clauza unde.

0
adăugat

Ceea ce aveți nevoie este ceva de genul SphinxSearch (pentru MySQL) sau Apache Lucene .

După cum ați spus în exemplul dvs., vă puteți imagina un rezumat care va conține mai multe domenii:

  • Element de listă
  • Nume,
  • Adriess,
  • Educație (ar putea fi un tabel pe cont propriu) sau
  • Experiența de lucru (acest lucru ar putea crește la propriul tabel în care fiecare rând reprezintă o lucrare anterioară)

Deci, căutarea unui cuvânt în toate acele câmpuri cu WHERE devine rapid o interogare foarte lungă cu mai multe JOINS.

În schimb, ați putea să schimbați cadrul de referință și să vă gândiți la CV-ul întreg ca la un document unic și doriți doar să căutați acest document.

Aici găsiți instrumente ca Sphinx Search. Ele creează un index FULL TEXT al "documentului" tău și apoi poți interoga sphinx și te va da înapoi unde se găsește baza de date care a fost găsită.

Foarte bune rezultate de căutare.

Nu vă faceți griji cu privire la faptul că aceste instrumente nu fac parte din RDBMS dvs. vă va salva o mulțime de dureri de cap pentru a utiliza modelul corespunzător "Documente" vs cel incorect "TABLURI" pentru această aplicație.

0
adăugat