Datenmodell für "Tags"

internet

Top Contributor
Hallo,

ich möchte bestehende Entities erweitern mit "Tags".

Beispiel:
Entity Kunde:
- Nun sollen verschiedene Tags hinzugefügt werden: "blaue Augen", "redet gerne".......

Das ganze soll in einer Liste einfach zu filtern sein, ohne dass ich einige Joins ausführen muss.

Am einfachsten stelle ich es mir, wenn ich einfach diese in einem String ablege:
String tags ="blaue Augen, redet gerne"

Zudem erstelle ich eine Entity "Tags".
- ID
- uniqueName
- Name

Nun könnte ich eine Mapping Tabelle erstellen "TagsObject".
- ID
- CustomerFK (Referenz auf Customer - Tabelle)
- TagsFK (Referenz auf Tag - Tabelle)

Aber dann müsste ich jedes Mal den JOIN ausführen, wenn ich in einer simplen Tabelle die Tags laden möchte.
Meine Idee ist nun:
- Ich schreibe in die Kundentabelle die Tags als String mit dem UniqueName.
-> Sobald man ein Tag hinzugefügt, wird dieser in der Tag - Tabelle erstellt und erhält einen eindeutigen Namen
- User kann aus einer Tag Liste den entsprechenden Tag auswählen
- In der Kunden - Tabelle wird in der String Liste dann der UniqueName nur gespeichert

Möchte man in einer simplen Kundenliste nun nach Tags suchen:
- Öffnen einer Drop Down Liste mit den Tags, die sich in der Tag - Tabelle befinden
- Tag - Objekt wird genommen und dann in der Kunden - Tabelle in dem entsprechenden String gesucht, ob der UniqueName enthalten ist.
-> Hier weiß ich jedoch noch nicht so ganz wie ich dann suchen soll:
WHERE customer.tags LIKE ´%blaue_augen%´
Problem: gibt es ein anderes Tag mit "blaue_augen_test", wird dieser ja auch ausgeliefert aus der String Liste.
Andere Option, dass ich einen internen prefix und suffix vor dem uniqueName noch mache: "myapp_blaue_augen_test".

Hat jemand Ideen?
 
Ich nutze Primefaces Listen mit LazyLoading.... Da ist das ein deutlich höherer Aufwand solche eine 1..n - Beziehung dann aufzulösen...
 
Das mit der JSON Spalte kenne ich auch nicht.
Aber wenn ich das richtig sehe, legt es mir dann einfach ein Objekt von einer Klasse Tags ab?
- Zum Einen k.A. inwiefern dann das mit JPA funktioniert.
- Wie kann ich eine Auswertung machen, wenn ich bpsw. mehrere Entities habe, die Tags verwenden. Mit Joins, könnte ich durch die N:M Beziehung ja ganz einfach alle Entities bekommen (Kunde., Bestellung.....)
 
a) Du kannst ein JSON-Array verwenden, also etwas wie ["tag1","tag2"]
b) Du brauchst meines Wissens eine native Query, weil die Verwendung vom DB-Hersteller abhängig ist.
c) in MySQL gibt es entsprechende Funktionen, z. B. json_contains, json_extract, json_search
d) würde ich wie @temi den Einsatz nicht generell empfehlen. Das war als Ergänzung gedacht, weil es bei Tags, wo es einfach nur darum geht, ob ein Tag vorhanden ist oder nicht, durchaus eine Möglichkeit darstellen könnte, über JSON-Arrays zu gehen.
e) haben wir das Zeug im Einsatz, um ... JSON-Arrays abzulegen 🙂 Da geht es aber wirklich nur darum, JSON->DB, DB->JSON - ohne Suche, ohne alles.

SQL:
create table kunden(id bigint not null auto_increment primary key, tags json);
insert into kunden(tags) values ('["tag1","tag2","tag3"]');
insert into kunden(tags) values ('["tag1","tag4","tag5"]');

Code:
mysql> select * from kunden;
+----+--------------------------+
| id | tags                     |
+----+--------------------------+
|  1 | ["tag1", "tag2", "tag3"] |
|  2 | ["tag1", "tag4", "tag5"] |
+----+--------------------------+

mysql> select * from kunden where json_contains(tags, '"tag1"', '$');
+----+--------------------------+
| id | tags                     |
+----+--------------------------+
|  1 | ["tag1", "tag2", "tag3"] |
|  2 | ["tag1", "tag4", "tag5"] |
+----+--------------------------+
2 rows in set (0,07 sec)

mysql> select * from kunden where json_contains(tags, '"tag2"', '$');
+----+--------------------------+
| id | tags                     |
+----+--------------------------+
|  1 | ["tag1", "tag2", "tag3"] |
+----+--------------------------+
1 row in set (0,00 sec)
 

Zurück
Oben