1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Dynamische Attribute

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von wolfgangpue, 7 Dezember 2010.

  1. wolfgangpue

    wolfgangpue Neuer Benutzer

    Ich möchte die Tabelle 'contact', welche Daten zu einer Kontaktperson hält um dynmaische Attribute erweitern. Also der Benutzer kann die Tabelle um verschiedene Attribute selbst erweitern (Int, Date, Varchar) die dann für alle Kontakte gilt.

    Mein momentaner Ansatz: Ich erstelle eine 1:1 Tabelle (special_attribute) zu 'contact' und lasse dort direkt die Attribute von der DB anlegen. Es gibt mehere gleiche Datenbanken und deswegen möchte ich die Tabelle 'contacts' für alle gleich belassen. Listen und Comboboxes möchte ich auch abbilden. Für jede Combobox gibt es eine eigene Tabelle, welche die Einträge hält und die Tabelle special_attribute verweist auf einen Eintrag der Combobox-Tabelle. Für Listen erstelle ich noch zusätzlich eine Relationstabelle welche die gewählten Einträge enthält.

    Also ich möchte die Attribute direkt in der Tabelle abbilden. Es gibt auch die Möglichkeit über eine Metadatenbank. Also einer Datenbank in einer Datenbank.

    Ich habe auch fast nichts im Internet gefunden zu (dynamic attributes, custom fields). Hat jemand einen Vorschlag wie man das am besten abbilden könnte. Oder irgendwelche Links?

    Anforderungen:
    Int, Varchar, Date, (Comboboxen, Listen (mehrere wählbar))

    lg Wolfgang
     
  2. thomas_w

    thomas_w Datenbank-Guru

    AW: Dynamische Attribute

    Hallo Wolfgang,

    ich denke, das in ein generelles Problem der starren Stukturen einer relationalen Datenbank wie MySQL, DB2, ORACLE , etc. eine ist.
    Flexiblere Datenspeicher ist ja das "NoSQL" Thema oder XML.

    Eine Idee wäre folgende Tabelle mit XML Anteil für das Custom Field "xdatum".

    Code:
    CREATE TABLE user_items (
     id INT NOT NULL,
     user_id INT NOT NULL,
     data VARCHAR(4000) NOT NULL,
     PRIMARY KEY (id)
    );
     
    INSERT INTO user_items VALUES
    ( 1, 1, '<daten><xdatum type="date">2010-12-07</xdatum></daten>' );
    
    Soweit mal eine Idee zum Thema.

    Grüße
    Thomas
     
  3. wolfgangpue

    wolfgangpue Neuer Benutzer

    AW: Dynamische Attribute

    Danke, ist ein sehr interressanter Ansatz. Die Datenbank würde dabei auch übersichtlich sein. Schwierig stell ich mir bei dieser Lösung die Suche vor über die verschiedenen Attribute. Auch die Konsistenz der Daten muss per Hand gewährleistet werden, sodass jeder Kontakt die gleiche Struktur vom XML hält.

    Eine Form der Speicherung wäre auch:

    ID Bezeichnung Datentyp Wert
    X VARCHAR VARCHAR VARCHAR

    Jedes Attribut(Bezeichnung, Datentyp, Wert) wird als String abgespeichert.

    Ich glaub die Entscheidung wird schwierig was ich genau wählen werde.
    Wichtig wäre eine einfache Suche über die Attribute.

    lg Wolfgang
     
  4. db.wizard

    db.wizard Aktiver Benutzer

    AW: Dynamische Attribute


    Hallo,

    Ich habe schon viele dieser oder ähnlicher Ansätze gesehen meiner Meinung nach taugen alle nicht wirklich. Ich würde es mir gut überlegen, ob du eine Relationale DB in dieser weise "missbrauchen" willst.


    Grüsse
     
  5. Charly

    Charly Datenbank-Guru

    AW: Dynamische Attribute

    Hallo wolfgangpue,

    was hälst du hiervon:

    Ich schreibe es mal in SQL

    Code:
     
    CREATE TABLE contact(contact_id int primary key)GO
     
    CREATE TABLE special_attribute(sa_id int primary key,sa_name nvarchar(100))
     
    CREATE TABLE Value(contact_id int,sa_id int,value nvarchar(100),
     constraint PK_Value primary key(contact_id, sa_id),
     constraint FK_contact foreign key(contact_id) references contact,
     constraint FK_special_attribute foreign key (sa_id) references special_attribute)
     
    insert into contact values (1)
    insert into contact values (2)
    insert into contact values (3)
     
    insert into special_attribute values(1,'special_attribute1')
    insert into special_attribute values(2,'special_attribute2')
    insert into special_attribute values(3,'special_attribute3')
     
    insert into value values(1,1,'value1')
    insert into value values(2,1,'value2')
    insert into value values(3,1,'value3')
    insert into value values(1,2,'value1')
    insert into value values(2,2,'value2')
    insert into value values(3,2,'value3')
    insert into value values(1,3,'value1')
    insert into value values(2,3,'value2')
    insert into value values(3,3,'value3')
     
    -- Werte abfragen
    select c.contact_id,v.value,s.sa_name from contact as c
    join value as v on v.contact_id=c.contact_id
    join special_attribute as s on s.sa_id=v.sa_id
     
    -- neues Attribut einfügen
    insert into special_attribute values(4,'special_attribute4')
    insert into value select contact_id, 4 as special_attribute, NULL AS Value  from contact
     
    -- Wert ändern für alle Kontakte
    update value SET value='Test'
    where  sa_id=1 
     
    -- und für einen Kontakt
    update value SET value='Test2'
    where  sa_id=1 
    and contact_id = 2
     
    -- nochmal fragen
    select c.contact_id,v.value,s.sa_name from contact as c
    join value as v on v.contact_id=c.contact_id
    join special_attribute as s on s.sa_id=v.sa_id
    
    Hoffe dir wenigstens mit den dynamischen Attributen geholfen zu haben.

    Dem RDMS würde es gefallen:)

    EDIT: Wenn es wirklich verschiedene Datentypen sein sollen kannst du ja Subtypen-Tabellen für die value-Tabelle erzeugen.

    Gruß Charly
     
Die Seite wird geladen...

Diese Seite empfehlen