2013-03-04 2 views
2

각기 다른 특성을 가진 각 문서로 일반 문서 워크 플로 시스템을 개발 중이지만 동일한 개요를 공유하고 동일한 워크 플로를 진행합니다.인덱싱 된 뷰가있는 SQL EAV 구조

그래서 모든 새로운 문서 유형에 대한 표를 만드는 대신 어떤 연구와 투쟁을 거친 후에 문서 속성에 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 
+0

대다수/모든 문서 유형에 대해 하나의 문서 표를 사용할 것을 고려 했습니까? 각 문서 유형이 다른 모든 속성과 완전히 다른 속성 집합과 관련되어 있지 않으면 EAV보다 더 나은 해결책이 될 수 있습니다. –

+0

예, 공유 속성을 포함하는 원본 테이블을 가지고 있습니다. 그러나 새로운 문서 유형을 모두 추가하면서 잠시 동안 동적 인 것으로 결정했습니다. –

답변

3

우선은 Best Practices for Semantic Data Modeling for Performance and Scalability을 읽습니다. 선택한 경로에 많은 함정이 있습니다.

는 인덱싱 된 뷰에 관해서는, 제한 MINMAX이 매우 명시 적으로 금지되어 Creating Indexed Views에서 설명되어 있습니다. 이유가 설명 된 이유 Why can't indexed views have a MAX() aggregate?

+0

나는 내가 길을 비틀 거릴 수있는 많은 것이있다. 그러나 나는 아직 포기하지 않았다, 나는 그것에 기회를 줄 것이다 :) P –