web-dev-qa-db-ja.com

動的フォームビルダーフォームとデータベース設計?

ユーザーが独自のWebベースのフォーム(テキストボックス、選択など)を作成し、ユーザーが入力できるようにWebで公開できるとします。

動的フォームに結び付けるデータベースを構築する方法に関するリソースやアドバイスはありますか?

たとえば、フォームごとに子テーブルを作成したり、特定のフォームの異なるバージョンを作成したりできますか?

32
Jeff Borden

通常、ユーザー入力に基づいて動的に新しいテーブルを作成することはお勧めできません。フォームの基本構造が変更された場合、動的に作成されたすべてのテーブルを更新して、新しい列を含めるか、古い列を削除する必要があるため、メンテナンスの問題が発生する可能性があります。次に、照会するテーブルを知るという問題があります(これは、おそらくすべての新しい問題を引き起こす動的SQLにつながるでしょう)。そして、おそらくパフォーマンスの問題もあるでしょうが、それがどれほど悪いかはわかりません。また、テーブルは通常、エンティティのtypeを表すために使用されます( "web form"など)。新しいinstanceごとに同じテーブルのコピーを持つのではなくエンティティ。

フォームには1つのテーブルをお勧めします。フォームが誰であるかを識別するために、各フォームに識別子が必要です。

フォーム
 ----- 
 id(PK)
 name 
 owner_id(users.idへのFK)
(その他のフィールド)
 
 form_elements 
 ------------- 
 id(PK)
 form_id(FK to forms.id)
 element_type_id(FK to element_types.id)
 caption 
(other fields)
 
 element_types 
- ----------- 
 id(PK)
 name 
 
 element_list_values 
 -------- ----------- 
 id(PK)
 element_id(FK to form_elements.id)
 name 
 value 
 (他のフィールド??)

Webアプリケーションでは、作成したユーザーへの参照を使用して、formsテーブルに保存されるフォームをユーザーが作成できるようにすることができます(ユーザーを適切なエンティティとして追跡している場合)。フォームには、formsテーブルを参照するform_elementsが入力されているため、どのフォームに属しているかがわかり、element_typesは、どのタイプであるかがわかります。 element_typesは、フォームが持つことができるさまざまな要素の静的(主に)リストを格納します。タイプには、「text_field」、「drop_down_list」、「radio_buttons」、「checkbox」があります。 「drop_down_list」や「radio_buttons」などのタイプの場合、通常これらの要素が持つリストの可能なオプションを格納するために、element_list_valuesと呼ばれる追加のテーブルが必要になります。