私が参加しているいくつかのWebアプリケーションプロジェクトでは、クライアントが独自のフォームを作成できるように要求しています。フォーム定義をどのように保存するか、そしてユーザーが入力した値をそれらのカスタムフォームにどのように保存するかという問題が発生します。
私はそれが2つの方法で行われるのを見てきました:
クライアントがフィールドの数と、それらのフィールドに関連付けられているラベルのみを定義すると仮定します。4つのテーブルを含むソリューションにたどり着くことができます。
FormDefinition
、、、、。FormFieldDefinition
_FormInstances
_FormFieldValues
クライアントはとに変更を加えFormDefinition
、FormFieldDefinition
Webアプリはその情報を使用してHTML Webフォームをレンダリングします。このフォームで、Webサイト訪問者(エンドユーザー)がフォームを送信します。このフォームで、新しい行FormInstances
が作成され、値がに保存されます。FormFieldValues
テーブル。の行
FormDefinition
はフォームを定義しますform definition ID = 2, form title = 'Car Registration Form'
。の行は、のフォームFormFieldDefinition
のフィールドを定義します。行は、ユーザーが入力した各フォームのインスタンスです。そして、の行はユーザーによるエントリです。FormDefinition
field definition ID = 7, field label = 'Car Model', field type = 'varchar(50)'
FormInstance
definition id = 2, date_entered = '2008-09-24'
FormFieldValues
field definition = 7, value = 'Tiburon'
残念ながら、の値列は
FormFieldValues
、クライアントがWebフォームで指定できる最大サイズのchar型でなければならないことを意味します...フォーム定義が変更されると、古いデータの管理が困難になります。ただし、ユーザーエントリはクエリ可能です(別のピボット質問と同様に、フォームIDを指定してユーザーエントリを一覧表示する簡単なクエリを作成しました)。4つのテーブルを使用する代わりに、フォーム定義とユーザーのフォームエントリをXML(またはYAMLなど)にシリアル化し、それをテキストとして保存することもできます。利点は、フォームがデータベースで人間が読める形式であることです。欠点は、XMLの解析によりアプリケーションのオーバーヘッドが増加し、SQLの観点からデータベースのクエリがはるかに少なくなることです。
私の本当の質問は、このデータベースモデルは何と呼ばれているのかということです。(だから私はこの問題をグーグルで検索することができます。)しかし、私は答えを決めるでしょう:どちらがより良い実装ですか、それともそこにもっと良い(または同じくらい良い)実装がありますか?