0

特定のオブジェクト (製品など) の 1 つのテーブルとその動的属性の 1 つのテーブルを含むモデルからクエリを実行するには、支援が必要です。

、などの属性を持つと、、などのChocolate属性を持つを格納できるとしましょう。 PriceColorWeightCarEngineGearsColor

私の例では、次の列を持つ Products というテーブルがあります。

 Id (Int),   
 Name (NVarchar)

dynamicAttributes次の列で呼び出される別のテーブルがあります。

Id (int)               -- of the attribute
ProductId (int)        -- of the specific product
AttributeType (int)    -- enum with the following values ("Color", "Price","Height", "Width".... )
StringValue -- of the product
IntValue -- of the product
DoubleValue -- of the product
BooleanValue -- of the product

クライアントから属性コードのリストとその値のリストを取得します。

各属性の値の型 (boolean、string、int) を取得できます。

アプリからこのモデルをクエリするための最良のオプションは何ですか?

動的 SQL のみ ? Pivot キーワードを使用していますか?

4

1 に答える 1

1

他の人が指摘しているように、多くのPIVOTクエリを実行することは非常に非効率的であり、PIVOTを使用するSQLクエリを記述してデバッグするのは面倒です。

別の方法は、データベースからデータを保存された方法で、つまり複数の行にフェッチして戻すことです。次に、データベースアクセスレイヤーにコードを記述して、行を単一のオブジェクトインスタンスにマッサージし、データベース行ごとにオブジェクトに1つの属性を追加します。これは、MartinFowlerのすばらしい本Patternsof EnterpriseApplicationArchitectureではテーブルモジュールパターンと呼ばれています。

再利用可能な方法でDBALコードを作成することに時間を費やすと、アプリ内の後続のコードがEAVテーブルに格納されているオブジェクトを簡単に読み取って保存できるようになる可能性があります。

しかし、ええ、私は他のコメンテーターに同意します。 私は一般的にEAVデザインを使用することに反対しています。EAVがデータベースの慣習を破る方法を補うためのコードを書くには、多くの作業が必要です。私はあなたがあなたの時間ともっと良いことをしていると思います!

代替案については、以下を参照してください。

于 2012-11-22T21:42:49.923 に答える