2012-02-09 3 views
2

계산 된 필드로 주문할 때 SQL Server의 데이터 구조에 문제가 있습니다. 이를 염두에두고 맵 축소를 사용하여 RavenDB 내에서 특히 응답을 원활하게 유지할 수 있도록 인덱스를 준비 할 수 있는지 궁금합니다.내 데이터 구조와 쿼리가 RavenDB에서 실행 가능합니까?

참고 - 나는 이전에 DBA에 요청하고 멋진 답을 가지고 있지만 다른 접근 방식을 고려하고 싶었 :

가 내가 시도하고 예를 줄 것이다

-이 내 테이블 구조되지 않습니다 - 나는 단순히 시도하고를

사람 ID, 이름

BrothersNames ID, 이름

SistersNames ID, 이름 ... 해결책을 찾기 위해 문제를 간략하게 설명

PersonBrothers이 PersonId (테이블 조인),

PersonSisters을 (테이블 조인) PersonId, SisterNameId

OK BrotherNameId - 그래서이 데이터베이스는 작은 나라에서 모든 사람을 보유하고 상상한다. 데이터베이스에는 이름에 대한 통계를 찾을 수 있도록 모든 사람의 형제 자매 이름이 ​​기록되어 있습니다 (사람을 형제 또는 자매에게 연결하지 않음 - 이름 만 표시).

분명히 많은 이름이 공유되어 현재 SQL Server에서 조인 테이블이 이것을 표준화합니다.

내가 원하는 것은 한 사용자를 데리고 형제의 이름과 자매의 성냥과 일치하는 숫자를 시스템의 다른 모든 사용자와 비교 한 다음 그 두 가지 일치를 함께 추가하고 그 내림차순으로 정렬하는 것입니다. 따라서 가장 많은 형제와 자매의 이름을 가진 사용자 목록을 얻을 수 있습니다.

저는 10 대 성냥에만 관심이 있지만 상위 10 개 경기를 해결하기 위해 전체 결과를 얻어야한다고 생각합니다.

실제 데이터에는 백만 명의 형제 또는 밀리언 자매가있을 수 있습니다. 이것이 성능 문제를 일으키는 곳입니다.

 { "Name": "a", "Brothers": ["b","c"] } 

그런 다음 인덱스를 할 수 있습니다 당신이 할 수있는 일

select p.id, matches 
FROM Person p 
LEFT JOIN 
    (
     SELECT 
     COUNT(*) AS Matches, 
     pbn.PersonId 
     FROM PersonBrothersNames pbn 
     INNER JOIN Brothersnames bn on pbn.BrothernameId =bn.Id 
     inner join PersonBrothersName otherpbn on otherpbn.BrothernameId = bn.Id 

     WHERE pbn.PersonId= @PersonId and pbn.PersonId <> otherpbn.personid 
     GROUP BY pbn.PersonId 

    ) As BrothersNamesJoin ON BrothersNamesJoin.Person = p.Id 

답변

2

이 같은 것입니다

내가 형제의 일치를 계산하고있어 어떻게 내가 자매를 위해 동일한 작업을 수행 이 번들처럼 더 비슷하게 사용하여 유사한 형제 이름을 가진 다른 사람들을 검색 할 수 있습니다. 네, 그것은 당신을 위해 그들을 순위 것입니다.

+0

한 명에게 150 만 명의 형제가있을 수 있습니다 (실생활에서는 불가능 함). – Victoria

+0

예, 동일한 방식으로 처리하지 않기 때문입니다. 유사점 벡터를 비교합니다. –

+0

항상 그렇듯이 테스트를해야합니다. 나는 그것을 1.5 밀로 테스트하지는 않았지만 많은 양의 데이터로 테스트를했다. –

관련 문제