2

各ドキュメントが異なる属性を持つ一般的なドキュメント ワークフロー システムを開発していますが、それらは同じアウトラインを共有し、同じワークフローを通過します。

そのため、新しいドキュメント タイプごとにテーブルを作成する代わりに、いくつかの調査と闘争の後、ドキュメント属性の EAV 構造を使用することにしました。その短所は認識していますが、これを達成するための便利な方法は他にないと思います。私ですか?!!

とにかく、私は EAV 構造http://eav.codeplex.com/の codeplax サンプルを使用しました。データベース内の各 EAV「オブジェクト」ごとにビューを作成し、通常のテーブルとして簡単に照会できます。

パフォーマンスを向上できるように、もう少し進んでビューにインデックスを付けることにしました。ここに問題があります。

  • SCHEMABINDING : 渡されました

  • 左結合: 合格

  • MIN 集計関数: を渡すことができませんでした!

ビューにインデックスを付けたり、インデックス付きの結果を取得したりできる方法はありますか!??

最後のビュー クエリは次のとおりです。

        CREATE VIEW [dbo].[vComputer1]
    WITH SCHEMABINDING 
    AS
    SELECT       
O.ObjectID, MIN(O.Name) AS Name, 
MIN(CASE WHEN V.AttributeID = 4 THEN V.Value ELSE NULL END) AS Make, 
MIN(CASE WHEN V.AttributeID = 5 THEN V.Value ELSE NULL END) AS  Model, 
MIN(CASE WHEN V.AttributeID = 6 THEN V.Value ELSE NULL END) AS Type,  
MIN(CASE WHEN V.AttributeID = 7 THEN V.Value ELSE NULL END) AS CPU, 
MIN(CASE WHEN V.AttributeID = 8 THEN V.Value ELSE NULL END) AS Drive,  
MIN(CASE WHEN V.AttributeID = 9 THEN V.Value ELSE NULL END) AS Video, 
MIN(CONVERT(INT, CASE WHEN V.AttributeID = 10 THEN V.Value ELSE NULL END))  AS RAM,
 MIN(CASE WHEN V.AttributeID = 11 THEN V.Value ELSE NULL END) AS Optical,
 MIN(CASE WHEN V.AttributeID = 12 THEN V.Value ELSE NULL END) AS Battery,
 MIN(CASE WHEN V.AttributeID = 13 THEN V.Value ELSE NULL END) AS Screen, 
 MIN(CASE WHEN V.AttributeID = 14 THEN V.Value ELSE NULL END) AS OS,
 MIN(CASE WHEN V.AttributeID = 15 THEN V.Value ELSE NULL END) AS PurchaseDate
    FROM            dbo.Object AS O INNER JOIN
                             dbo.Value AS V ON ISNULL(V.ObjectID, 1) = O.ObjectID INNER JOIN
                             dbo.Category AS C ON ISNULL(C.CategoryID, 2) = O.CategoryID
    WHERE        (C.Name = 'Computer')
    GROUP BY O.ObjectID
4

1 に答える 1

3

最初に行う必要があるのは、パフォーマンスとスケーラビリティのためのセマンティックデータモデリングのベストプラクティスを読むことです。選択したパスには多くのトラップがあります。

インデックス付きビューに関しては、制限はインデックス付きビューの作成で文書化されています。ここで、MINおよび MAXは非常に明示的に禁止されています。インデックス付きビューにMAX()集計を設定できない理由で説明されている理由。

于 2013-03-04T09:59:40.373 に答える