2013-12-11 3 views
1

EAV 데이터를 검색하는 가장 좋은 방법은 무엇입니까? 이 테이블에 저장된 12 개의 필드가 주어지면, "Jones"의 성 및 "Springfield"의 City 및 "1"의 상태와 같이 이들의 조합을 검색 할 수 있어야합니다. 모든 입력란을 채울 수있는 검색 양식이 있습니다.엔티티 속성 값 데이터 검색

은 분명히 최종 버전은 좀 더 역동적 수 있지만 여기에 지금까지있어 무엇 :

SELECT DISTINCT Utility.ClientSearch.ClientId AS ClientId, 
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City 
FROM Utility.ClientSearch 
LEFT OUTER JOIN Utility.ClientSearch AS cs1 
    ON cs1.ClientId = Utility.ClientSearch.ClientId 
    AND cs1.FieldName = 'LastName' 
LEFT OUTER JOIN Utility.ClientSearch AS cs2 
    ON cs2.ClientId = Utility.ClientSearch.ClientId 
    AND cs2.FieldName = 'City' 
WHERE (cs1.FieldValue = 'Jones') 
    AND (cs2.FieldValue = 'Springfield') 

그것은 거의 만 기록에 대해 빠른 것 같다,하지만 난이 있는지 알고 싶습니다 가장 효율적인 방법, 또는 더 나은 것이 있다면.

EAV는 좋은 생각이 아니지만 제 신청서가 아닙니다. 난 다른 누군가의 응용 프로그램 주위에 쿼리 래퍼를 작성하고 있습니다. 나는 응용 프로그램이나 데이터 구조를 제어 할 권한이 없다.

답변

0

왜 3 번 자위를해야하는지 잘 모르겠지만 첫 번째 표는 목적을 달성하지 못합니다. 당신의 표는 성능 문제를보고 시작하는 것이 너무 커지면, 된 ClientID

에 테이블 분할에

SELECT DISTINCT cs1.ClientId AS ClientId, 
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City 
FROM Utility.ClientSearch AS cs1 
INNER JOIN Utility.ClientSearch AS cs2 
    ON cs1.ClientId = cs2.ClientId 
WHERE cs1.FieldName = 'LastName' 
    AND cs1.FieldValue = 'Jones' 
    AND cs2.FieldName = 'City' 
    AND cs2.FieldValue = 'Springfield' 

보면