2009-07-16 1 views
4

Ich arbeite an einer Erweiterung eines Flex-Dashboards, mit der Benutzer Suchvorgänge speichern können. Ich benutze BlazeDS und Java/Spring/SpringJdbc auf der Serverseite.Speichern von Suchkriterien in einer Datenbank

Meine Frage lautet: Wie würden Sie eine Suche modellieren, die ein oder mehrere Kriterien hat, wie zum Beispiel:

  • Wert Datum zwischen 2009-10-01 und 2009-10-31
  • Währung = 'USD'
  • Name der Bank beginnt mit 'First'

Mein erster Stich an dieser die Kriterien in 3 Typen einzuteilen:

  • Numerische Kriterien
  • Datum Kriterien
  • String Kriterien

Jede der Kriterien Typen hat einen anderen Satz von Vergleichsoperatoren:

  • Numerische Operatoren: =,>,> =, <, < =, <>
  • Datum Operatoren: vor, nach, zwischen
  • String-Operatoren: Beginnt mit, Endet mit, enthält

I-Codes haben jede dieser Betreiber zu identifizieren.

Mein Objektmodell ist eine such Schnittstelle und 3 Klassen, die sie implementieren: NumericCriteria, DateCriteria und StringCriteria

Alle diese Klassen zur gleichen Tabelle Karte mit den folgenden Spalten:

- SAVED_SEARCH_ID: id of the saved search 
- SEQ_NUM: criteria order. We want to load the criteria in the same order each time 
- CRITERIA_TYPE: Operator code. I can use this later to determine what kind of criteria this is. 
- FIELD: currency, valueDate, bank, etc 
- FIRST_VALUE_NUMERIC 
- SECOND_VALUE_NUMERIC 
- FIRST_VALUE_DATE 
- SECOND_VALUE_DATE 
- FIRST_VALUE_STRING 
- SECOND_VALUE_STRING 

Ist gibt es einen saubereren Weg, dies zu tun? Ich bin nicht verrückt nach dem Datenmodell, aber ich kann keine Ressourcen zu diesem Thema finden ... Alle Kommentare werden geschätzt, egal wie grausam :)

Antwort

4

Sie könnten Ihre Kriterienklassen in XML serialisieren und das XML beibehalten, anstatt ein umfangreiches Schema zu implementieren.

0

Gibt es Schaden bei der Speicherung der gesamten Suchkriterien in SQL-Format selbst Nicht sicher, was Ihre anderen Parameter sind, um den von Ihnen erwähnten Ansatz zu berücksichtigen.

+0

Nun, das Hauptproblem beim Speichern von SQL in der db ist, dass das SQL dann so analysiert werden müsste, dass der Flex-Client es verwenden könnte, um die Kriterien erneut anzuzeigen, wenn der Benutzer eine gespeicherte Suche abgerufen hat. –

2

Vielleicht können Sie etwas Inspiration von der Hibernate Criteria API bekommen. Es stellt ein vollständiges Modell für die typensichere Abfrage bereit, das möglicherweise selbst mithilfe von JPA/Hibernate selbst in eine Datenbank mapped.

0

Wenn Sie JDBC verwenden, können Sie SQL-Anweisungen buchstäblich als Strings speichern (oder vielleicht nur where-Klauseln). Die Abfragen müssen bei jeder Ausführung vorbereitet werden. Dies kann bei sehr hohen Abfragevolumina ein Problem darstellen. Aber das klingt viel einfacher als der Versuch, die where-Klausel in konstituierende Tokens aufzuteilen.

Wenn Sie diese Vorgehensweise verwenden, seien Sie sehr vorsichtig, um SQL Injection-Angriffen vorzubeugen (indem Sie mehr als nur eine where-Klausel in Ihre Abfrage einfügen - sagen Sie eine DROP TABLE).