Andreas Korthaus: Datenstruktur-Problem / Performance vs. saubere Struktur?

Beitrag lesen

Hallo!

Mal wieder ein kleines Daten-problem ;-)
ich habe eine Art Formular-genrator gebastelt. Das funktioniert so dass man sich damit ein Formular zusammenklicken kann, z.B. kann man ein <select>-Feld erzeugen, indem man die zur Auswahl stehenden <option>'s einträgt, dann kann man einfache Text-Eingabefelder erzeugen, Checkboxen, Upload-Feld... halt die komplette Bandbreite. Das Problem was ich jetzt habe - 1. wie speichere ich diese Angaben möglichst effizient, und 2. wie speichere ich entsprechend die Daten die Anwender später in das so generierte Formular eintragen?

Mein Problem hierbei, ich habe 10 verschiedene Eingabefeld-Typen(select, upload, text...), wovon die meisten anders-artige Daten speichern müssen, aber oft gibt es nur wenige Ausnahmen von der "normalen" Struktur.

Als erstes bilde ich mal den kleinsten gemeinsamen Nenner, also Fragebogen_ID, Feld_ID, Frage(die Antwort darauf wird in das generierte Feld eingetragen) und ob es ein Pflichfeld ist, das speichere ich ich in "fields". Das reicht dann schon für Typen wie "text", "mehrzeiliger text", "upload". Anders bei "select", da muss ich die Auswahlwerte speichern. Und da es da nicht nur einen gibt habe ich eine 1:n Beziehung, also habe ich die Tabelle "fields_select" mit Feld_ID und option, vielleicht noch selected. Anders bei einem "ja/nein" Feld, da speichere ich nur ob ja oder nein vorbelegt ist, noch was anders beim Datum/Zeit-Feld, da speichere ich ob Tag? Monat? Jahr? Stunde? Minute? abgefragt werden soll, bräuchte ich im Prinzip 5 Spalten die ich entweder auf true oder false setze. Und das war noch nicht alles ;-)

Naja, das nächste Problem ist jetzt, wie speichere ich die Daten wenn jemand das oben generierte Formular ausfüllt? Das würde ich eigentlich gerne alles in einer Tabelle speichern, also Tabelle "data" mit User_ID Feld_ID, und "eingabe", nur ist das wieder nicht so einfach, es gibt da ja das mehrzeilige Textfeld, was den Datentypen TEXT erfordert, also alles als TEXT speichern? Das ist auch nicht wirklich effektiv, oder? Weiteres Problem, wenn ich bei select Mehrfachauswahl zulasse, habe ich hier eine 1:m Relation zw. Benutzer und Eingabe, aber auch nur für diesen einen Typen. Also fahre ich wieder 2-gleisig? Alle Sonderfälle raus, und nur die die alle meinetwegen mit 1:1 Relation und CHAR(32) klarkommen sollen in diese Tabelle, der Rest hat eine eigene? Oder für jeden Typen eine eigene Tabelle?

Auf der anderen Seite, CHAR(32) ist sicherlich auch nicht gerade kleiner als TEXT, denn der Speicherplatz ist hier abhängig von der Datenmenge, und da ich nicht nach diesem Feld filtern werden, sondern nur auslese, ist das doch eigentlich gar nicht so schlimm alle Eingaben in TEXT zu speichern, oder? Also Speicherplatzprobleme habe ich sicherlich nicht, eher Performance-Probleme.

Das hatte ich zunächst auch für die Feldtypen überlegt, und dann die Daten (die sonst in eine eigene Tabelle müssten) als serializierten Array zu speichern, nur kann ich die Daten dann natürlich vergessen wenn ich die später anders verwenden will, oder?

Mein Problem dabei ist auch, wie frage ich das ab? Nicht dass ich das nicht könnte, nur darf ich - wenn ich für jeden Typen eine extra Tabelle habe immer erst abfragen welcher Typ, und dann für _jedes_ Feld eine extra-Abfrage auf die eigene Tabelle, selbiges dann bei den eingegebenen Daten. Das heißt ich muss in der Anwendung ne ganze Menge(für meinen Geschmack zu viel) über die Datenstruktur wissen, nur mal so als Beispiel:

Das Formular hat 10 Eingabe-Felder, 2 mehrzeiliche Textfelder, 2 Datumsfelder, 2 Celect-Felder, und 4 einzeilige Textfelder.

Dann muss ich zum erstellen des Formulars etwa wie folgt vorgehen:

$result = SELECT pyp, pflicht, frage FROM fields WHERE fragebogen_ID = $id

foreach ($result) {
  if(typ = select) {
    SELECT options FROM fields_select WHERE feld_ID = $fid
  }
  if(typ = date) {
    SELECT day,month,year,hour,minute FROM fields_date WHERE feld_ID = $fid
  }
...
}

Entsprechend kompliziert geht das ganze mit dem Auslesen bzw. Eintragen von Eingaben die im Formular getätigt wurden. Im Augenblich sehe ich eigentlich keinen besseren Weg, aber vielleicht hat ja jemand eine Idee wie man sowas besser machen kann - wenn Ihr denn versteht was ich meine ;-)

Grüße
Andreas