2017-11-17 24 views
0

Ich habe eine Webanwendung, die viele Formen mit vielen Feldern hat. Einige dieser Felder sind erforderlich, andere nicht, aber ich möchte die Formularwerte in einer Datenbanktabelle speichern können, damit Benutzer ihren Fortschritt speichern können. Wie speichere ich diese Meta-Informationen zu Spalten? Um konkret zu sein, sagen, ich habe eine Tabelle:Datenbankdesign: Wie speichere ich Spalteneigenschaften?

create table form1 (
    field1 text, 
    field2 text, 
    -- ... 
    fieldn text 
) 

Ich möchte die Business-Logik speichern, welche Felder irgendwo erforderlich sind, so dass ich die DB abfragen kann wie etwas zu bekommen:

('field1_val', true, null, false, ..., 'fieldn_val', true) 

wo jede ungerade Spalte ist, werden die Werte in der Tabelle gespeichert, und sogar Spalte gibt an, ob die Felder erforderlich sind oder nicht. Ich dachte über eine separate Tabelle, wie so die Anforderung Daten zu speichern:

create table form1_requirements (
    table_name text, 
    field_name text, 
    required boolean 
); 
insert into form1_requirements values ('foo', 'field1', true); 
insert into form1_requirements values ('foo', 'field2', false); 
insert into form1_requirements values ('foo', 'fieldn', true); 

Aber ich bin nicht sicher, ob es möglich ist, dass wie eine Verknüpfung zu tun, und wenn es ratsam ist.

Was ist die beste Lösung dafür? Ich interessiere mich hauptsächlich für Postgresql, aber auch für MySQL und SQLite3.

Antwort

0

Warum definieren Sie nicht einfach die benötigten Spalten als NOT NULL?

create table form1 (
    field1 text not null, 
    field2 text, 
    -- ... 
    fieldn text not null 
); 

Die not null deklariert diejenigen dann erforderlich.

+0

Ich möchte in der Lage sein, unvollständige Formulare zu speichern, wie ich in der Frage sagte. – user3243135

+0

Wenn Sie also Gordons Idee verwenden, speichern Sie die unvollständigen Formulardaten in einer separaten Tabelle, wenn die erste Einfügung fehlschlägt, aber verwenden Sie die Metadaten aus dem dB-Wörterbuch, um dies für die Nicht-Null-Einschränkung zu definieren. Kann sogar Kommentare und Standardwerte hier behalten –

1

Ich würde nicht speichern diese Felder so. Die Felder sollten mit einer Eins-zu-viele-Beziehung zu einer Formular Tabelle in einer separaten Tabelle sein:

create table form 
(
    id integer primary key, 
    name text not null unique, 
    ... other columns for the form ... 
); 

create table field 
(
    id integer primary key, 
    form_id integer not null reference form 
    name text not null, 
    required boolean, 
    ... other columns describing a single field, e.g. the data type ... 
); 

und die einzelnen Werte sollten in einer separaten Tabelle gespeichert werden:

create table form_values 
(
    form_id integer not null references form, 
    field_id integer not null references field, 
    value text, 
    primary key (form_id, field_id) 
); 

Die oben ist auch als Designmuster "Entity-Attribute-Value" bekannt.

Eine weitere Möglichkeit ist, dass die Informationen in json Spalten zu speichern:

create table form 
(
    id integer primary key, 
    name text not null unique, 
    field_definitions jsonb 
); 

In der Spalte field_definitions Sie so etwas wie speichern würde:

{ 
    "field_1": {"name": "Lastname", "required": true }}, 
    "field_2": {"name": "Firstname", "required": false }} 
} 

Sie noch eine zweite Tabelle verwenden sollte die tatsächliche zu speichern Feldwerte. Sie können auch alle Werte für ein einzelnes Formular in einer JSON-Spalte speichern.

+0

Das löst sicherlich die Probleme, die ich habe .... aber ich kann mir nicht helfen, aber denke, dass es die Verwendung der Daten einen Schmerz in den Hintern machen würde, wenn ich wollte Um eine einfache SELECT für alle Formularwerte zu machen, müsste ich einen Self-Join pro Spalte machen, richtig? – user3243135

+0

@ user3243135: Ja, das ist einer der Nachteile eines solchen generischen Datenmodells. Wenn Sie das in einer einzelnen JSON-Spalte speichern, wird _that_ einfacher –