Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Metadaten von Spalte definieren

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von David777, 10 August 2016.

  1. David777

    David777 Benutzer

    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?
     
  2. drdimitri

    drdimitri Datenbank-Guru

    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.
     
  3. David777

    David777 Benutzer

    Das hört sich aber ganz schön kompliziert an...:( vielleicht sollte ich einfach bei der Lösung bleiben ^^
     
  4. akretschmer

    akretschmer Datenbank-Guru

    eine andere Idee wäre, hier z.B. mit JSON-Daten zu arbeiten.
     
  5. David777

    David777 Benutzer

    JSON? Wie genau meinst du das? Wo speichere ich die JSON-Daten?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  7. David777

    David777 Benutzer

    MSSQL 2014... Muss mal schauen ob das dort geht. Wäre ja cool!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden