Datenschema für vielfältige Objekte

Ludwigmller

SQL-Guru
Beiträge
168
Hallo,
ich bin am Überlegen, wie ich das Datenschema für folgenden Sachverhalt am besten gestalte:
Es sollen Reparaturen/Wartungen für verschiedene Fahrzeuge, Maschinen und Kleingeräte dokumentiert werden.
Das Problem ist, dass jedes Objekt andere Attribute hat. Zum Beispiel:
- Pkw:
Grunddaten: Name, Marke, Kennzeichen, ...
Wartung: Datum, km-Stand, Art der Wartung (Ölfilter, Dieselfilter, neue Reifen, Zahnriemen, ....), ....
- Traktor
Grunddaten: Name, Marke, Kennzeichen, ...
Wartung: Datum, km-Stand, Art der Wartung (Ölfilter, Dieselfilter, neue Reifen, ....), ....
- Maschine
Grunddaten: Name, Marke, kein Kennzeichen, ...
Wartung: Datum, ggf. Betriebsstunden, Art der Wartung (sehr maschinenabhjängig), ...

Wie gehe ich mit diesen verschiedenen, (vorerst) unvorherzusehenden Attributen um?
Ich kann ja nicht für jeden Objekttyp eine eigene Tabelle erstellen. Genauso unübersichtlich wäre eine Tabelle je Wartungsart...

Gruß Ludwig
 
Werbung:
Es gibt dafür 2 Ansätze:

* EAV (Entity-Attribute-Value
* schemalose Ansätze

Da PostgreSQL sehr gut mit Key-Value-Stres (HSTORE) und JSON(B) - Dokumenten arbeiten kann, würde ich dazu raten.


Reicht das als Anfang für weitere Google-Suche?


Andreas
 
Kannst du zu Letzteren mal ein Beispiel machen?

Wie wäre es zu beruteilen, wenn ich einfach Freitext mit einem Fremdschlüssel zu der jeweiligen Maschine/Kfz speicher?
 
Meinst Du mit letzteres JSON? Es gibt tausende Beispiele JSON im Internet. Postgres bietet einen Haufen Funktionen und Operatoren dazu:
Mit JSONB (unter Postgres) kannst Du sogar diese Daten indizieren. Was aber oft gar nicht nötig ist.

Wenn Du bereits über Freitext nachdenkst, dann lieber JSON, ist quasi auch Freitext, folgt aber einem Format.
Dieser ziemlich totale Freiheitsgrad mit JSON hat den Preis, dass die Anwendung (oder irgendetwas darin, drumrum) die JSON Elemente "kennen" muss.
 
Kannst du zu Letzteren mal ein Beispiel machen?

Wie wäre es zu beruteilen, wenn ich einfach Freitext mit einem Fremdschlüssel zu der jeweiligen Maschine/Kfz speicher?
Code:
postgres=# create table my_json_data (id int primary key, json_data jsonb);
CREATE TABLE
postgres=# 
postgres=# create index idx_json  on my_json_data using gin (json_data);
CREATE INDEX
postgres=# insert into my_json_data values (1, '{"km-stand": "100km", "Treibstoff": "Diesel", "Reifen": "neu"}');
INSERT 0 1
postgres=# insert into my_json_data values (2, '{"Ölfilter": "neu", "Betriebsstunden": "100", "Farbe": "gelb"}');
INSERT 0 1
postgres=# 
postgres=# 
postgres=# select * from my_json_data ;
 id |                            json_data                            
----+-----------------------------------------------------------------
  1 | {"Reifen": "neu", "km-stand": "100km", "Treibstoff": "Diesel"}
  2 | {"Farbe": "gelb", "Ölfilter": "neu", "Betriebsstunden": "100"}
(2 rows)

postgres=# select * from my_json_data where json_data ? 'Farbe';
 id |                            json_data                            
----+-----------------------------------------------------------------
  2 | {"Farbe": "gelb", "Ölfilter": "neu", "Betriebsstunden": "100"}
(1 row)

postgres=# explain select * from my_json_data where json_data ? 'Farbe';
                               QUERY PLAN                                
-------------------------------------------------------------------------
 Bitmap Heap Scan on my_json_data  (cost=12.10..22.79 rows=13 width=36)
   Recheck Cond: (json_data ? 'Farbe'::text)
   ->  Bitmap Index Scan on idx_json  (cost=0.00..12.10 rows=13 width=0)
         Index Cond: (json_data ? 'Farbe'::text)
(4 rows)

postgres=#

Im Internet gibt es massig Beispiele zum Umgang mit JSON(B) - Daten.
 
Ich würde wahrscheinlich eine reine JSON Lösung gar nicht nutzen. Nur für den variablen Teil. Alles was in einem statischen Modell abzufacklen ist, auch dort behandeln / modellieren. Vermutlich ein Kategorienschema mit Wartung, Support, Reparatur für z.B. Kategorie Fahrzeug|Maschine|Kleingerät|..
Auch Hersteller, Hersteller Nr, EAN .. Baujahr, .. könnte alles in einem normalen Modell landen.

Was mit vertretbaren Aufwand nicht mehr modellierbar ist, wird als JSON gespeichert.
 
Werbung:
Zurück
Oben