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) ?