1

現在取り組んでいるサイトでコンテストを作成します。各コンテストは同じになることはなく、ユーザーがコンテストに参加するために入力する必要のある入力フィールドの数が異なる場合があります。

コンペティション1には名が必要な場合があります

コンテスト2では、名、姓、メールアドレスが必要になる場合があります。

また、個々のエントリを確認できるように、これらのエントリを監視するツールを構築します。

私の質問は、任意の数のフィールドを格納するための最良の方法は何ですか?私は2つのオプションを考えていました。1つはコンテストのすべてのエントリを含むCSVファイルに各エントリを書き込むこと、もう1つはエントリ全体をテキストとして格納するだけのvarcharフィールドを持つdbテーブルを持つことです。これらの方法はどちらも厄介なようですが、この種のタスクに一般的な方法はありますか?

理論的には、考えられるすべてのフィールドの列を含むdbテーブルを作成できますが、「100語で教えてください...」や「5つの好きなものを入力してください」などの特定の要件がある場合は機能しません。 。」

回答:

競技ごとに異なる目的に利用できる複数のジェネリックカラムがある場合は、以下に説明する方法を使用することにしました。

最初はEAVを使用するつもりでしたが、それでもこの特定のシナリオには少し適切かもしれないと思います。ただし、スケーラビリティが低く、クエリが複雑であるため、一般的には使用しないことをお勧めします。使用する習慣をつけたくありません。私のテストでは、両方の答えが完全にうまくいきました。

4

2 に答える 2

2

コードが少し複雑になり、テーブルに対してアドホック クエリを実行するのが少し難しくなるので、EAV に注意するのは正しいと思います。

多くのエンタープライズ アプリが単に次のスキーマのようなものを採用しているのを見てきました -

t_Comp_Data
-----------    
CompId  
Name  
Surname  
Email 
Field1 
Field2 
Field3 
... 
Fieldn

この例では、一般的なフィールド (Field1 など) は、競技ごとに異なる意味を持ちます。クエリを簡単にするために、適切なフィールド名にエイリアスを付けて、競技ごとに異なるビューを作成できます。

于 2012-05-07T03:21:46.983 に答える
1

私は通常、それを使用することを躊躇しますが、データベースを使用する場合、これは Entity-attribute-value モデルにとって良い状況に見えます。

基本的に、すべてのエントリ (Competition_id、おそらく日付など) を構成する標準フィールドを持つ CompetitionEntry (エンティティ) テーブルがあり、次に CompetitionEntry_id、属性、および値を持つ CompetitionEntryAttribute テーブルがあります。おそらく、テンプレート属性を持つ別のテーブルも必要になるでしょう。新しいエントリを作成するための各コンテスト。

残念ながら、格納できるデータ型は 1 つだけであり、おそらく大きな nvarchar である必要があります。もう 1 つの欠点は、EAV データベースに対するクエリが難しいことです。

もう 1 つのオプションは、競技会ごとに 1 つのテーブルを作成することです (おそらく、競技会作成の一部としてコードで) が、競技会の数によっては、これは非現実的な場合があります。

于 2012-05-07T02:58:48.053 に答える