Datenbank-Design für benutzerdefinierte Formular-Builder (und Speicherung der Ergebnisse)
-
11-09-2019 - |
Frage
Ich versuche, eine benutzerdefinierte Formular-Builder, ähnlich denen von Wufoo und Google .
Während ich eine einfache Benutzeroberfläche erstellt haben, diese benutzerdefinierte Formulare mit zu schaffen, liegen meine Probleme in der Datenbank-Design. Auf das Formular erstellen, wird eine JSON-Implementierung in der Datenbank gespeichert (möchte dies verbessern) und verwies die Form zu erstellen, die ein Benutzer sehen würde.
Nach Vorlage, ich möchte alle Felder des Formulars in einer Datenbank speichern. Im Anschluss an der Struktur JSON verwendet für das Datenbankdesign, das ist einfach genug. Allerdings würde ich jedes einzelne Feld wie durchsuchbar sein .
Die Fragen:
- Gibt es einen besseren Weg, um den Formularentwurf zu speichern?
- Welche Datenstrukturen / Modelle passen würde Speicherung der Ergebnisse der Form? Ich habe das EAV gesehen eine Möglichkeit sein könnte, aber aufgrund der unterschiedlichen Eingabetypen beteiligt (Dropdown-Checkbox, Text, Textarea) diese langweilig werden können.
- Welche Struktur würde einfachste Suche ermöglichen und die Verwendung von WHERE-Klauseln erlauben? Das JSON Beispiel gegeben, erlaubt mir nicht, dies zu tun, ganz so schön
Lösung
EAV ist eine gültige Option - es komplex und umständlich mit dem, was effektiv nicht typisierte Daten wird sein
.Andere Tipps
EAV funktioniert recht gut, da man oft Kartenwert in einigen Grundtypen zuordnen. In einem persönlichen Projekt haben wir eine Tabelle mit:
entity_id : INTEGER REFERENCES entities(id)
attr_id : INTEGER REFERENCES attributes(id)
value_bool : BOOLEAN
value_int : INTEGER
value_string : VARCHAR
value_text : TEXT
Und die Infos über attr_id in einer anderen Tabelle gespeichert, wo wir das Attribut finden Typ und den Namen und so. Auch der Unterschied zwischen String und Text ist, dass der Text einen ‚Volltext‘ Suchindex auf sie haben kann, während String grundlegendes Spiel Indizierung ist nur.
Wenn Sie eine attrbute abfragen möchten, schauen Sie in der Attributtabelle, dann die Abfrage contruct durch den richtigen Zustand der Einrichtung wie „WHERE attr_id = 12 und value_string =‚SFDs‘“.
Abfragen zu beschleunigen, machen bedingten Index über die doppelte Säulen, wie folgt aus:
CREATE INDEX test ON eav(attr_id, value_int) WHERE value_int IS NOT NULL;
Eine Alternative ist auch eine benutzerdefinierte db Funktion zu haben, der Index kann und eine Spalte, die ein JSON Feld suchen. Viel mehr Arbeit hart ...