2017-11-17 4 views
0

私は多くのフィールドを持つ多くのフォームを持つWebアプリケーションを持っています。これらのフィールドの一部は必須であり、そうでないものもありますが、フォームテーブルの値をデータベーステーブルに保存して、ユーザーがその進捗状況を保存できるようにしたいと考えています。列に関するこのメタ情報を保存するにはどうすればよいですか?具体的には、私はテーブルを持っていると言う:データベース設計:列のプロパティを格納する方法?

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

私はのような何かを得るためにDBを照会することができるように、フィールドがどこかで必要とされているかについて、ビジネス・ロジックを保存したいと思います:

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

ここで、奇数列はすべてテーブルに格納された値であり、偶数列はフィールドが必要かどうかです。

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); 

しかし、私はそれがそのように参加を行うことは可能ですかどうかわからないんだけど、それが賢明だ場合:私はそうのように要求データを格納する別のテーブルを持っていることについて考えました。

これに最適な解決策は何ですか?私は主にpostgresqlに興味がありますが、mysqlとsqlite3にも関心があります。

答えて

0

必要な列をNOT NULLとして定義するだけではどうですか?

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

not nullと宣言されたものが必要です。

+0

私が質問したように、不完全なフォームを保存できるようにしたい。 – user3243135

+0

Gordonのアイデアを使用すると、最初の挿入が失敗したときに不完全なフォームデータを別のテーブルに保存しますが、dB辞書のメタデータを使用してこれを非NULL制約として定義します。ここにコメントとデフォルト値を残すこともできます –

1

私はではありません。は、そのようなフィールドを格納します。フィールドは、フォームのテーブルに1対多の関係を有する別のテーブルにすべきである:

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 ... 
); 

、個々の値は、別のテーブルに格納されるべきである:上記

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) 
); 

あります「エンティティ属性値」の設計パターンとしても知られています。

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

あなたはまだ実際に保存するために、第2のテーブルを使用する必要があります:あなたが何かを格納しますコラムfield_definitionsで

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

別のオプションは、json列にその情報を格納することですフィールド値。 1つのフォームのすべての値を1つのJSON列に格納することもできます。

+0

それは確かに私が抱えている問題を解決します....しかし、私は助けができませんが、私が望むならデータの使用を尻に痛めてしまうと思うすべてのフォーム値に対して単純なSELECTを実行するには、列ごとに自己結合を行う必要があります。 – user3243135

+0

@ user3243135:はい、そのような汎用データモデルの欠点の1つです。単一のJSON列にその情報を格納すると、_that_の一部が簡単になります –

関連する問題