7

WufooおよびGoogleが提供するものと同様のカスタム フォーム ビルダーを実装しようとしています。

これらのカスタム フォームを作成するためのシンプルな UI を作成しましたが、問題はデータベースの設計にあります。フォームを作成すると、JSON 実装がデータベースに保存され (これを改善したいと考えています)、ユーザーに表示されるフォームを作成するために参照されます。

送信時に、フォームのすべてのフィールドをデータベースに保存したいと思います。データベースの設計に使用される JSON 構造に従えば、これは非常に簡単です。ただし、個々のフィールドを検索可能にしたいと思います

質問:

  1. フォームのデザインを保存するより良い方法はありますか?
  2. フォームの結果の保存に適したデータ構造/モデルはどれですか? 私は EAV が可能性があることを見てきましたが、関連する入力タイプ (ドロップダウン、チェックボックス、テキスト、テキストエリア) が異なるため、これは面倒になる可能性があります。
  3. 最も簡単に検索でき、WHERE 句を使用できる構造はどれですか? 与えられたJSONの例では、これをうまく行うことはできません
4

2 に答える 2

3

EAV は有効なオプションです。事実上型なしデータになると、複雑で厄介な場合があります。

XPath を使用した XML もオプションです: http://dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html

検索するフィールドが異なる可能性がある場合、ほとんどの場合、動的 SQL を生成する必要があると思います。

于 2009-10-31T13:12:59.627 に答える
3

多くの場合、マップ値をいくつかの基本的な型にマップできるため、EAV は非常にうまく機能します。個人的なプロジェクトでは、次のテーブルがあります。

entity_id     : INTEGER REFERENCES entities(id)
attr_id       : INTEGER REFERENCES attributes(id)
value_bool    : BOOLEAN
value_int     : INTEGER
value_string  : VARCHAR
value_text    : TEXT

attr_id に関する情報は別のテーブルに保存され、属性のタイプや名前などを見つけることができます。また、文字列とテキストの違いは、文字列は基本的な一致インデックスのみであるのに対し、テキストには「全文」検索インデックスを設定できることです。

属性をクエリする場合は、属性テーブルで検索し、「WHERE attr_id=12 AND value_string='sfds'」のように適切な条件を設定してクエリを作成します。

クエリを高速化するには、次のように、デュアル列に条件付きインデックスを作成します。

CREATE INDEX test ON eav(attr_id, value_int) WHERE value_int IS NOT NULL;

別の方法として、JSON フィールドを含む列にインデックスを付けて検索できるカスタム db 関数を用意することもできます。はるかに厳しい仕事...

于 2009-10-31T13:55:32.060 に答える