2011-11-18 8 views
5

私は、ユーザーがWebフォームにデータを入力して保存し、最終的にPDFフォームフィールドを設定するためのアプリケーションを作成する作業を行っています。フォームフィールドとフィールド値を格納するためのデータベーススキーマのアドバイス

フィールドの値をデータベースに格納するには、フォームが動的(PDFフィールドに基づいている)であるため、良い方法を考えようとしています。

アプリケーション自体では、ハッシュテーブル(fieldname、fieldvalue)でデータを渡しますが、ハッシュをdb値に変換する最適な方法はわかりません。

私はMS SQL Server 2000とasp.net webformsを使用しています。誰かが似たような仕事をしていますか?

+0

おそらく、私たちといくつかのフィールドと関係を共有することができます。時には、それは実際に目的に依存し、テーブルは正規化されなければならないことがあります。時には、テーブルを非正規化する必要があります(倉庫のような場合もあります)。 – Nonym

+0

私はまだ設計の初期段階にありますので、いかなる手段によっても最終決定された。おそらく、gviewが以下に示唆するように、フォームタイプ、created_onなどのカラムを格納するフォームテーブルを持つつもりです...フォームテーブルは、フィールド名、タイプを格納するFormFieldテーブルと1対多の関係を持ちます、および値。 – pteranodonjohn

+0

これは保険バックオフィスタイプのアプリだと付け加えたいと思います。フィールド値は、フィールドをアドレス指定するための運転免許証番号などの情報を保持します。 – pteranodonjohn

答えて

4

ここで文書データベースを使用したことはありますか?これは従来のRDBMSソリューションよりもよく解決する問題のほんの一例です。個人的には、私はRavenDbの大ファンです。かなり別のオプションはCouchDbです。 MongoDbは実際の実装ではデータの安全な場所ではないので、私はMongoDbを避けたいと思います。

ドキュメントデータベースを使用できない場合でも、シリアル化されたXMLまたはjsonというペイロードフィールドを持つ従来の列にメタデータを持つようにテーブルを設定すると、SQLを1にすることができます。これにより、EAV-landから離れている間にメタデータを検索できます。 EAVの土地は恐ろしい場所です。

UPDATE

私は良いガイドが存在するかどうかわからないんだけど、コンセプトは非常に単純です。基本的な考え方は、クエリする部分をテーブルの「通常の」列に分割することです。これにより、標準的な方法でクエリできます。必要なレコードが見つかったら、CLOBを取得して、必要に応じてデシリアライズすることができます。あなたのケースでは、あなたのようなものを見て、テーブルを持っているでしょう:

SurveyAnswers 
    Id INT IDENTITY 
    FormId INT 
    SubmittedBy VARCHAR(255) 
    SubmittedAt DATETIME 
    FormData TEXT 

数protips:
a)は、テキストベースの直列化ルーチンを使用します。データエラーを修正するチャンスを与え、実際にデバッグに役立ちます。
b)SQL 2000の場合、ペイロードデータを保持するCLOB(TEXTフィールド)を別のテーブルに分割することを検討することをお勧めします。私はSQL 2000を使用して以来、それは長い時間でしたが、私の記憶はTEXT列を使用してテーブルに悪いことをしました。

+0

私は本当にこのアイデアが大好きです。私はjsonまたはxmlに情報を格納したいと考えていましたが、データベースの格納には非常に制限があります。基本的には、ms SQL Server 2000で立ち往生しています。カラムでメタデータを使用する際のドキュメントをどこから見つけることができるでしょうか? – pteranodonjohn

+0

ちょっと答えを拡大しました。私はこれをSql 2000ベースのアプリケーションFWIWでうまく使用しました。 –

1

私は同じ構造をミラーリングすることをお勧めしたい:あなたが記述しているもののため

Form 
----- 
form_id 
User 
created 

FormField 
------- 
formField_id 
form_id 
name 
value 
1

溶液はEntity Attribute Value(EAV)と呼ばれ、このモデルは、に対処するための王室の痛みをすることができます。だから、あなたはこれをできるだけ制限するべきです。

たとえば、ほとんどの場合フォーム(姓、名字、電子メールなど)にフィールドがあり、フィールドとしてテーブルに配置する必要があります。

あなたがしなければ誰か遅かれ早かれ、彼らはこれらの名前や電子メールを持っていることを認識し、あなたがこれを記述することができたときに、このクエリ

 SELECT 
     Fname.value fname, 
     LName.Value lname, 
     email.Value email, 
     .... 
    FROM 
     form f 
     INNER JOIN formFields fname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'fname'  
     INNER JOIN formFields lname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'lname' 
     INNER JOIN formFields email 
     ON f.FormId = ff.FormID 
      and AttributeName = 'email' 
     .... 

を構築することをお願いしようとしているではないので、その理由は、あなたが本当にもUNPIVOT

そのPを欠場するつもりだので

SELECT 
     common.fname, 
     common.lname, 
     common.email, 
     .... 
    FROM 
     form f 
     INNER JOIN common c 
     on f.FormId = c.FormId 

はまた、できるだけ早くすることができますようにSQL 2000の下車します過去に人々が遭遇した問題のアイデアを伝えるために前にSO EAV questionsを見ることは悪い考えではありません。

+0

入力いただきありがとうございます。私は間違いなくEAVを研究します。私はSQL 2000から立ち去ることができたらいいと思いますが、その力は私が恐れている非常に長い間そこにいてくれるでしょう。 – pteranodonjohn

関連する問題