2011-01-04 19 views
4

私は管理者が内容を変更してデータベースに保存することができるアプリケーションの作成を任されています。 Modx/Wordpress/Expression Engineのテンプレート変数を考えてみてください。柔軟なフォームとデータベース構造のサポート

私が見てきたアプローチは、仕様が一貫している具体的なテーブル(つまりユーザープロファイル、ユーザーコンテンツなど)と、特定ではない値を格納するいくつかの汎用フィールドデータテーブル(テキスト、ブール値)を実装することです。フォーム(およびモデルフィールド)は、最初にテーブルをクエリし、関連するカラムを取得することによって生成されますが、検証の設定方法についてはまだ考えていません。

私はこの問題を見てきましたが、これはEAVタイプのアプローチを示しているように思われます。私の簡単な研究から見ると、柔軟性がもたらす恩恵よりも大きな負担がかかるようです。誰もが持っている場合、私はこの問題についていくつかのアドバイスをいただければと思います

How to design a generic database whose layout may change over time?

Dynamic Database Schema

は、私は、これは危険なルートであることを示唆しているが、ここでの記事のカップルを、読みました

よろしく

SWK

を与えるために、いくつかの

答えて

3

私は数年前に非常に大きなEVAデータベースを作成しました(PHP w/PostgreSQL)。それは素晴らしいことが判明しましたが、大きなプロジェクト($$$)でした。すべてのフォームは、フォーム/フィールドのバージョン管理、公開ワークフロー、動的なレポート作成など、完全に動的でした。

EVAの基本は簡単です。データを取得することは難しいことではありません。しかし、バージョン管理とレポート作成を行うには、何年もかかることがあります。

私が今日もう一度やっていたら、新しいNoSQLソリューション(http://en.wikipedia.org/wiki/NoSQL#Document_store)を使って研究します。私は、フォームジェネレータに渡すことができるDTOスタイルクラスを作成することをお勧めします。フォームの「変更」は、実際にDTOを変更することです。次に、そのDTOをドキュメント/オブジェクトデータベースに保存します。

また、アルファソリューションを構築する際に、バージョン管理とレポートニーズを含むテストケースを解決する方法を考えてください。

ここに私が意味するものの例があります:単純な "質問質問フォーム"です。

  • オリジナル(バージョン1):ありまず、最後に、質問
  • 電子メールのフィールドを追加します(バージョン2):まず、最終、メール、質問は
  • 誰かが電子メールについての彼らの心を変更します。 (バージョン3):まず、最後に、質問
  • 新しいマーケティングの男が入って来て、それを変更します(バージョン4):フルネーム、メール、質問

ここで、レポート(csv)を生成する必要があります。物事は難しい。どうやってやるの?

フィールドレベルのバージョン管理でこの問題を解決しました。以前のバージョンを参照しました。さらに、レポートシステムでは、実行前にエンドユーザーがレポートデータソースの定義を組み立てる必要がありました。 (レポートフィールドをデータフィールドにバインドするなど)。

しかし、ドキュメントDBの私はあなたがそれを違うことができると思います。 I 新しいDBのCouchDB(他の?)には、これらの問題を処理するためのメカニズムが組み込まれています。

幸運!

0

必要に応じて、フォームフィールドを「DBフィールド」レベルに上げても価値がない場合があります。代わりに、これらのフィールドを(本質的にaとする)動的BLOBにシリアル化してDBに格納することができます。これは、あなたのアプリの外でこれらの動的なフィールドを照会する必要がある(DBデザインは統合システムとのより大きな公的契約の一部です)人がいる場合はお勧めできませんが、これらの動的フィールド、またはフィールド内の任意の集約/検索機能が軽微な場合は、私はそれを考慮します(最近のCPU機能を使用)。私はこのパターンを何度も使用してきましたが、これまでのところ、リファクタリングする必要はありませんでした。 (ただし、あなたが必要と思われる場合は理解できます)。

1

最後のwebappでユーザープロファイルを作成するときは、キー/値テーブルを選択しました。

Users table with fixed columns: 
id 
login 
name 
regdate 

ユーザーテーブルがプロファイルテーブル(ユーザーHasManyプロファイル)にリンクされています。

Profiles table with different data: 
user_id 
field 
value 

ユーザーが自分のプロファイルに任意の追加フィールドを追加することができますこの方法です。たとえば、次のように

user_id = 1  
field = 'Facebook' 
value = 'http://facebook.com/...' 

user_id = 1 
field = 'Stackoverflow' 
value = 'http://stackoverflow.com/user/...' 

など..

関連する問題