Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.916 Beiträge
 
Delphi 12 Athens
 
#1

Was ist die beste Lösung für eine Keywort-Filterung per SQL ?

  Alt 9. Jul 2021, 09:41
Datenbank: ANY • Version: 1.0 • Zugriff über: FireDac
Hallo zusammen,

ich möchte gerne ein neues System aufbauen, was Tabellen nach Keyworten filtern kann.

Der Gedanke ist eine globale Keywort-Tabelle zu haben,
Code:
TabKeywort
Id       Keywort
1         Apfel
2         Birne
3         Banane
4         Grün
5         Gelb
...
998       Früchte
999       Obst
und eine Ziel-Tabelle, die ich eigentlich filtern möchte
Code:
TabZiel
Id       Descr    
101       Lorem1
102       Lorem2
103       Lorem3
104       Lorem4
...
dazu gibt es zu jedem Record eine Mapping-Tabelle, welche die entsprechenden Keyworte auflistet
Code:
TabMap
Id       IdZiel    IdKeywort
201       101        1      // Ziel 101 ==> Apfel, grün      
202       101        4
203       102        2      // Ziel 102 ==> Birne, gelb, Früchte, Obst
204       102        5
205       102        998
206       102        999
207       103        3      // Ziel 103 ==> Banane, gelb
208       103        5
...
Sowas in der Art, so das jeder Eintrag in TabZiel eine 1:n Liste von individuellen Keyworten bekommt.

Wie würde man das optimal anlegen, so dass es sich gut nach Keyworten filten lässt ?

Also es müsste so ungefähr gehen, aber meine Fragen sind:
Geht das besser/effektiver, um nach variablen Listen von Text-Keyworten zu filtern ?
Gibt es dafür Lösung, die genau auf so einen Fall ausgelegt ist, mit variablern Parametern ?
Wie bekomme ich in/vor dem SQL-SELECT die Keyworte am Besten als String-Parameter rein, und diese dann noch CaseInsenitiv oder LIKE gesucht ?

Code:
//Hier könnte man auch was Verschachteltes davorbauen, statt die Integer Id's von aussen reinzugeben,
//direkt mit String-Keys reinzukommen, und diese in aus der TabKeywork zu IdKeywort zu mappen
SELECT z.* 
FROM TabZiel z, TabMap m, TabKeywort k
WHERE ( z.Id       = m.IdZiel )
AND  (( m.IdKeywort = :PInt1   )
  OR  ( m.IdKeywort = :PInt2   )
  OR  ( m.IdKeywort = :PInt3   )
  ... //<== Hier ist es unschön, weil die Parameter-Liste jeweils unterschiedlich lang ist
ORDER BY z.Id
;
Meine Überlegungen zu den drei Tabellen sind:
  • Die TabZiel Tabelle kann mal sehr groß werden (weiss noch nicht genau), weil Texte/Links/Sonstwas da drin sein können,
    deshalb sollte das zwischengeschaltete Mapping dafür optimal sein (mit Integer Id's).
  • Die TabMap Tabelle wird dann entsprechend noch größer (was die RecCount betrifft),
    deshalb auch hier reines Integer-Mapping um Platz zu sparen.
  • Die TabKeywort Tabelle wird auch anwachsen mit der Zeit, aber überschaubar bleiben,
    deshalb können mögliche Keyworte schnell und leicht gefunden werden.

Oder mache ich mir da zuviel Gedanken, und man könnte statt Integer-ID's auch GUUID's, Hashes oder sonstwas Modernes verwenden ?
Weil die Datenbanken mittlerweile vielleicht so perfekt sind, dass die das selbst optimieren können
(es geht mit dabei um DB's von Sqlite, zu MySql, Postgres bis MsSql, das liegt noch nicht fest, deshalb Standard-SQL ).

Macht man sowas heutzutage überhaupt besser mit Mongo (aber ich würde schon gerne bei SQL bleiben) ?

Geändert von Rollo62 ( 9. Jul 2021 um 09:47 Uhr)
  Mit Zitat antworten Zitat