Dynamisch erweiterbare Tabellen durch User ?

Hallo,

z.B. bei einigen Anwendungen gibt es die Möglichkeit, dass der Nutzer beliebig weitere Spalten einer Tabelle anlegt. So. z.B. bei einer Internet-Anwendung die Adressen speichert wo der Nutzer beliebig weitere Spalten wie tel-mobil, tel-sat tel-analog, bemerkung1, bemerkung-privat usw. dazufügen kann. Wichtig ist, dass die Anwendung dabei auf einer Datenbank basiert.
ES macht wohl keinen Sinn im Voraus schon unendlich viele Spalten anzulegen da man ja nicht weiss welche Spalten der Nutzer braucht…

Wie würde man sowas aber dann idealtypisch programmieren? (HAb mal den Begriff DataDictonary gehört, wo wohl? in einer eigenen Tabelle die Tabellen selbst verwaltet wird, oder?)

würde man in dem Falle oben einfach mit „altertable“ (bei mysql) die Tabelle selbst ändern oder ist das zu gefährlich oder zu ressourcen-aufwändig oder würde man vielleicht doch einfach einige Spalten im voraus anlegen mit 1 bis n nummeriert und dann einfach wirklich irgendwo speichern was diese nummern genau bedeuten so z.B. 1=tel-privat usw…
WEr hat weiss wie man das idealtypisch löst:wink: sowas wie ein Design-Pattern, das eben als anerkannte Lösung für dieses Problem gilt.

Vielen Dank für Tips / oder Links wo dieses Problem besprochen wird!!!
Danke Julian

Dynamisch erweiterbare Textfiles für mündige User
Hi Julian,

vorab: Technisch ist alles machbar, auch wenn es völlig sinnlos ist.

Du stellst Dir vor, dass jeder Anwender die Tabellen beliebig erweitert. Wie soll der Anwender diese Daten ansehen? Schreiben sich die Auswertungsprogramme selbst? Soll jeder Anwender nur die Spalten sehen, die er selbst hinzugefügt hat? Wie sollen Redundanzen verhindert werden? Fragen über Fragen…

Projekte gehen den Bach runter, weil niemand seine Anforderungen festschreiben will resp. weil intelligente Auftraggeber sich nicht auf Spezifikationen festlegen lassen: „Tue, was ich denke“ oder auch „Hasch mich, ich bin der Frühling“. Ein Programmierer mit Hirn und Herz antwortet darauf: „Leck mich, ich bin der Honig“.

Wenn Deine Anwender nicht wissen, was sie wollen, dann sollten sie das woanders tun, aber nicht auf der Arbeit. Schenke ihnen ein Textverarbeitungssystem, da können sie sich Spalten bauen nach Herzenslust - jeder kann dann für sich kreativ sein.

So, jetzt weißt Du, warum es für so einen Schmarrn keine Musterlösung gibt.

Gruß Ralf

Hallo,
wenn du sowas unbedingt tun möchtest warum dann Spalten erweitern.
Wenn du eine Tabelle mit 3 Attributen machst reicht das vollkommen.

ID (welche einem Namen in einer anderen tabelle zugeordnet ist)
Funktion (z.B. Telefonnummer, E-Mail,…deine Spalten eben)
Value (zB. 0049XXXXX, [email protected],…)

So könnten die Anwender soviele Funktionen hinzufügen wie sie wollen, die andere Frage ist halt, wie du das darstellen willst/wirst.

Grüße
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

mit ALTER TABLE gehts nicht. Du kämst ja gar nicht mehr an die Daten ran, weil Dir jeder Benutzer die Tabelle zerschießt.

Man löst das Problem mit einer schwachen Entity, also einer Untertabelle, die den Schlüssel der übergeordneten Tabelle erweitert:

CREATE TABLE master (
id NUMBER(10),
bez VARCHAR2(60) NOT NULL,
CONSTRAINT pk_master PRIMARY KEY (id)
);
CREATE TABLE types (
type VARCHAR2(30),
CONSTRAINT pk_type PRIMARY KEY (type)
);
CREATE TABLE slave (
id NUMBER(10),
subid NUMBER(10),
bez VARCHAR2(60) NOT NULL,
value VARCHAR2(60),
type VARCHAR2(30) NOT NULL,
CONSTRAINT pk_slave PRIMARY KEY (id, subid),
CONSTRAINT fk1_slave FOREIGN KEY (id) REFERENCES master (id),
CONSTRAINT fk2_slave FOREIGN KEY (type) REFERENCES types (type)
);

Das SQL ist hier in der Oracle Syntax, sollte aber bis auf Kleinigkeiten auf allen Datenbanken so gehen. (Bei MySQL musst Du noch die Primärschlüsselattribute NOT NULL setzen, damit es geht.)

Man löst das Problem mit den Spalten, indem man eine Zusatztabelle anlegt, in der man Zeilen eintragen kann. Dadurch bekommt man das Problem, dass man verschiedene Datentypen in ein Feld schreiben muss (Es sei denn, Du willst eh nur Zeichenketten speichern). Daz brauchst Du die Tabelle TYPES, in der Du die gültigen Typen definierst und auf die Du in der Tabelle verweist. Mit dieser Information kannst Du die Typen durch ein CAST wieder richtig herstellen.

Gruß

Peter

Jupp! So hab ich das letztens auch gemacht.

Vielen Dank !!
Hallo Peter,

super vielen Dank für diese sehr hilfreiche Antwort! Diese lößt mein problem idealtypisch!!
(Als relativer Anfänger ist es manchmal schwer auf solche, für den Profi wohl eher logischen und einfachen Lösungen zu kommen.)

Danke für Deine Hilfe!!

Julian