>

no big words

NTXT graphics design site

To enjoy the site visual flavours, you have to enable Flash plugin and JavaScript in your browser.

NTXT logo

System wyszukiwania i automatycznej generacji zapytań SQL

Fragment opisu wyszukiwarki i systemu opisywania kryteriów MLH użytego w serwisie tabelaofert.pl, w wersji 3 (do 2006 roku). System pozwala na zapamiętywanie, automatyczną analizę i opis kryteriów w języku naturalnym, a także na generowanie optymalnych zapytań do bazy danych i łatwe rozszerzanie i adaptację do innych zestawów danych.

1. założenia i możliwości systemu
2. składnia kryteriów
3. analiza kryteriów
a. typy pól
b. zależności między polami
4. automatyczny opis kryteriów 5. zapamiętywanie kryteriów
6. generacja zapytań do BD
7. generacja zapytań do BD
8. adaptacja do innych projektów

1. założenia i możliwości systemu

Wyszukiwarka została oparta na założeniu, że kryteria oparte na różnych polach rzadko łączone są operatorem ‘lub’. Przykładowo, że rzadko szukamy mieszkania „na parterze LUB dwupokojowego”. Zwykle szukamy tak: „(na parterze LUB poddaszu) I dwupokojowego”. To założenie ogranicza zakres zastosowań systemu, jednak dla zbiorów o podobnej liście cech elementów sprawdza się nieźle.

Wyszukiwarka została zaimplementowana w PHP i potrzebuje do pracy relacyjnej bazy danych obsługującej SQL i zestawu tabel powiązanych relacjami. Aczkolwiek nie jest to warunek konieczny, zakłada się utrzymanie przyjętej konwencji nazewniczej dla tabel i pól BD. Tabele biorą nazwy od mianownika nazwy obiektu opisywanego przez te tabele, np.: INWESTYCJA, FIRMA, OSOBA, RELACJA_PLIK_FIRMA. Pierwszym polem każdej tabeli, która nie jest wyłącznie tabelą relacji , jest zwykle pole ID z unikalnym kluczem własnym. Zwykłe pola noszą nazwy parametrów w nich przechowywanych, rozszerzone o konieczne przydawki, jak: CENA_NETTO, CENA_JEDNOSTKOWA, METRAZ, METRAZ_EFEKTYWNY, WARIANT_KREDYTU. Klucze obce składa się z nazwy tabeli i nazwy pola do którego wiążą, np.: pole OSOBA.FIRMA_ID wiąże krotki z tabeli OSOBA z rekordami tabeli FIRMA przez klucz własny ID firmy. Natomiast w tabeli FAKTURA zapewne pojawią się klucze obce FAKTURA.SPRZEDAWCA_FIRMA_ID i FAKTURA.NABYWCA_FIRMA_ID. W tym wypadku nazwy pól mają część opisującą i część wskazującą na tabelę i pole tabeli do której wiążemy. Wszystkie nazwy w bazie piszemy wielkimi literami.

Wyszukiwanie odbywa się przez porównanie wartości zdefiniowanych przez programistę wyrażeń SQL (kryteriów) z wartościami zadanymi przez użytkownika. Użytkownik zadaje również sposób porównania. Te dane, które spełniają zadane warunki znajdują się w wynikach wyszukiwania. Użytkownik ma do dyspozycji 5 sposobów porównania, czyli operatorów:

eq – (equal) równość ne – (not equal) nierówność gt – (greater than) większy niż lt – (less than) mniejszy niż lk – (like) podobny (dotycz tylko tekstu).

Możliwe jest użycie zdań typu: „budynki większe niż 7 pięter lub dokładnie o 5 piętrach” (budynki 5, 8, 9, 10-kondygnacyjne i wyższe), czy „koty młodsze niż 3 lata, ale nie w wieku 2 lat”. Warunki łączone są zawsze według schematu:

(kryterium1) AND (kryterium2) AND… (kryteriumN) gdzie każde kryterium z kolei składa się jak niżej: ( wyrażenie >= K AND wyrażenie <= L ) OR ( wyrażenie = A1 OR wyrażenie = A2 OR wyrażenie = A3 OR … wyrażenie = An ) AND ( wyrażenie <> B1 AND wyrażenie <> B2 AND… wyrażenie <> Bn )

Czyli: „wyrażenie jest większe lub równe wartości K, jednocześnie mniejsze lub równe wartości L, może też być równe jednej z wartości: A1, A2, A3… An, ale nie może być równe B1 ani B2 ani… Bn". Oczywiście nie muszą wystąpić wszystkie warunki na raz.

Wyrażenia zdefiniowane przez programistę oznaczane są dla zwięzłości 3-literowymi, unikalnymi w obrębie aplikacji skrótami, np.: cen może oznaczać TOWAR.CENA_NETTO ceb może oznaczać TOWAR.CENA_NETTO*(1+TOWAR.STAWKA_VAT) fir może oznaczać FIRMA.ID fin może oznaczać FIRMA.NAZWA

System jest w stanie rozpoznawać, z jakich tabel informację będą potrzebne do zapytania i dołączać je według tego rozpoznania. Oznacza to oszczędność czasu przy prostych zadaniach. Każda z dozwolonych tabel musi być zamieszczona w tablicy ETO_aliasy_tabel, która zawiera nazwę tabeli, jej ustalony alias, warunek łączący tę tabelę w zapytaniu. Jeśli na liście pól zapytania (klauzula „select”) albo sortowania (klauzula „order by”) znajdzie się pole znanej tabeli, tabela ta jest dołączana do klauzuli „from”, a do „where” dopisywany jest warunek łączący (typowo relacja klucz podstawowy-klucz obcy)