2009-05-22 13 views
0

昨日、私は作業を始めている簡単な情報検索システムのベストプラクティスに関してthis questionと尋ねました。フィールドのプログラムによる追加を処理する方法は?

今日、私の顧客は、管理インターフェイスを使用して、後でプライマリエンティティにフィールドを追加できるかどうか尋ねました。つまり、アプリケーションでは、1つのデータベーステーブル(エンティティと呼ぶことにします)を検索できますが、これは他のオブジェクトとのさまざまな関連付けを持つことができますが、フォーカスはエンティティにあります。

今、もちろん、空が限界です、これが可能です。

この問題で私の最初の考えは二つの新しいテーブルを作成することです:

AdditionalFields(フィールド識別子PK、フィールド名、IsShownInSearchResults、およびその他のメタデータ) これは、その行はによって作成されなければならないテーブルです管理インターフェースたとえば、顧客が後で、アイカラーのエンティティを追跡する機能を追加することを望む場合、FieldNameが「アイカラー」のAdditionalFieldを作成します。

AdditionalFieldDataこれは顧客が追加された追加のフィールドのそれぞれの値にエンティティを関連付けるテーブルである(FieldDataID PK、実体識別子FKFK、たFieldValueをフィールド識別子)。たとえば、私たちの目の色の例では、フィールドが追加されたときに2つのエンティティ(EntityID 3と4)があり、新しいAdditionalFieldにFieldIDが1の場合、エンティティに関連付けられた目の色データを持たないことは有効です。顧客は次に、エンティティ3に目の色「青」を追加することを選択でき、次のようにAdditionalFieldDataに行を挿入することができます:自動生成されたPK,3,1、 "青")。

これらを簡単に検索したいので、すべての追加フィールドに文字列値が必要になるだけです。

前の質問で投稿したアプローチに従って、ユーザーが検索を実行したときの情報取得のために、次のようなクエリでLinq-To-SQLを使用します(もちろん、フィルタリングのロジックは実際にはもっと複雑):

var results = from s in db.Stuff 
       where (...existing filter logic...) || 
        s.AdditionalFieldData.Any(afd => afd.FieldName.Contains(textFilter)) 
       select s; 

だから私の質問は次のとおりです:私はこのような何かを探すようにクエリを変更でしょう

var results = from s in db.Stuff 
      where (s.Name.Contains(textFilter) || 
       s.Title.Contains(textFilter)) 
      select s; 

これは合理的ですか?私が逃したより良い解決策はありますか?私が知っておくべきこのアプローチの意味はありますか?

(私はLINQの専門家だが、ビューのデータベース設計の観点から何を示唆することは私にはちょうど良いようです私の愚かな識別子、私のためにその初期:)

答えて

1

はご容赦下さい。

私が数回使用したのは、ユーザーが管理インターフェイスで有効/無効を切り替えることができるEntitiesテーブルに定義されている「スペア」フィールドを一杯にすることです。このように(結合数が少ないため)データベースのパフォーマンスが向上しますが、必要なスペアフィールドの数を前もって選択する必要があります。ほとんどの場合、ほとんど空のテーブルが大量になります。

ああ、あなたは安全にあなたがNスペアフィールドを追加することを選択した場合、ユーザーが必要になると仮定することができN + 1 ;-)

関連する問題