Dynamische Attribute

wolfgangpue

Neuer Benutzer
Beiträge
4
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
 
Werbung:

thomas_w

Datenbank-Guru
Beiträge
104
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
 

wolfgangpue

Neuer Benutzer
Beiträge
4
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
 

db.wizard

Aktiver Benutzer
Beiträge
43
AW: Dynamische Attribute

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


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
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 
Oben