Metadaten von Spalte definieren

David777

Benutzer
Beiträge
13
Angenommen ich habe eine Tabelle "Produkte", die hunderte Attribute zu Produkten speichern soll:
Also z.B.

Product:
name
price
material
color
.... + hunderte weitere Eigenschaften

Die Software, die auf die Datenbank zugreift soll später einen Bericht erzeugen in dem das Proukt beschrieben wird und wo alle Eigenschaften über das Produkt mit der id x ausgegeben werden.
z.B.

Produkt mit Nummer 3

Name: Tasche
Preis: 99 USD
Material: Leder
Farbe: Braun
.... + hunderte weitere Eigenschaften


Allerdings muss die Reihenfolge, in der die Produktdaten ausgegeben werden manuell bestimmt werden. Außerdem muss in der Software festgelegt werden können, dass bestimmte Attribute nicht im Bericht auftauchen.

Dies führt zu der Frage, wie man solche Informationen in einem DB Schema speichert.

1. Man könnte eine weitere Tabelle anlegen:

spalte showonreport order
name 1 1
price 1 3
material 0 2
color 1 4
.... + hunderte weitere Eigenschaften


Diese Art von Problemen begegnet mir immer wieder, doch meine Lösung gefällt mir nicht, weil es keine Möglichkeit gibt die relationale Integrität zu bewahren. Ich könnte schließlich auch eine der Spalten vergessen oder eine Spalte einfügen, die gar nicht in der Produkttabelle vorkommt.

Habt ihr mit so etwas Erfahrung?
 
Werbung:
Naja, das ist im Berichtswesen nichts ungewöhnliches. Dafür gibt es ja auch Tests, die sicherstellen dass das Ergebnis wie gewünscht geliefert wird bevor man es nach Produktion gibt.
Relationale Integrität ist nicht der richtige Begriff, denn zwischen den beiden Tabellen gibts keine Verbindung die als Relation in der DB abbildbar wäre.

Du könntest eine weitere Tabelle erstellen, die anhand des DataDictionaries eine Liste mit den vorhandenen Spaltennamen erstellt und auf diese dann eine FK Beziehung legen.
Du musst aber dran denken diese zu Aktualisieren wenn sich neue Spalten ergeben. Summa summarum kommst ums Testen nicht herum, die DB bietet dir hier keine eingebauten Constraints.
 
In der Datenbank - sofern diese sowas kann. Demo:

Code:
test=# create table david(id int primary key, name text, eigenschaften jsonb);
CREATE TABLE
test=*# insert into david values (1, 'Produkt1', '{"preis":{"show":"true","order":"1","val":"99"},"material":{"show":"true","order":"2","val":"Leder"}}');
INSERT 0 1
test=*# select * from david;
 id |  name  |  eigenschaften   
----+----------+--------------------------------------------------------------------------------------------------------------------
  1 | Produkt1 | {"preis": {"val": "99", "show": "true", "order": "1"}, "material": {"val": "Leder", "show": "true", "order": "2"}}
(1 Zeile)

test=*#

Das kann man sich dann auch so ausgeben lassen, da wird dann ganz magisch die Struktur sichtbar:

Code:
test=*# select id, name, jsonb_pretty(eigenschaften)from david;
 id |  name  |  jsonb_pretty   
----+----------+-------------------------
  1 | Produkt1 | {  +
  |  |  "preis": {  +
  |  |  "val": "99",  +
  |  |  "show": "true",+
  |  |  "order": "1"  +
  |  |  },  +
  |  |  "material": {  +
  |  |  "val": "Leder",+
  |  |  "show": "true",+
  |  |  "order": "2"  +
  |  |  }  +
  |  | }
(1 Zeile)

was für eine DB nutzt Du?
 
Werbung:
Zurück
Oben