我的数据结构和查询在RavenDB中是否可行?

时间:2012-02-09 10:05:50

标签: mapreduce ravendb

我们在SQL Server中的数据结构存在问题,因为我们按计算字段进行排序。考虑到这一点,我们想知道是否可以使用map reduce来准备索引以保持我们的响应快速 - 特别是在RavenDB中。

仅供参考 - 我之前在DBA上问了这个问题并得到了一些很好的答案,但我想考虑这种不同的方法:

我会试着举个例子 - 这不是我的表结构 - 我只是试图勾勒出问题以便找到解决方案......

人名,姓名

BrothersNames Id,Name

SistersNames Id,Name

PersonBrothers(连接表)PersonId,BrotherNameId

PersonSisters(连接表)PersonId,SisterNameId

好的 - 所以想象这个数据库可以容纳来自一个小国家的每个人。该数据库记录了每个人的兄弟姐妹的名字(它没有将一个人映射到他们的兄弟或姐妹 - 只是他们的名字),以便我们可以找到有关姓名的统计数据。

显然很多名称都是共享的,所以目前在SQL Server中,连接表为我们规范了这个。

我想要做的是让一个用户找出兄弟姓名的匹配数量和姐妹姓名与系统中其他每个用户的匹配数量,然后将这两个匹配加在一起并按降序排序。因此,这将为我们提供一个共享兄弟姐妹姓名最多的用户列表。

我真的只对前十场比赛感兴趣,但我认为我必须得到整个结果才能计算出前十场比赛。

请注意,在我的实际数据中,一个人可以拥有一百万兄弟或一个毫升的姐妹。这是我遇到性能问题的地方。

这就是我为兄弟们计算比赛的方式,我也为姐妹们做同样的事情

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

1 个答案:

答案 0 :(得分:2)

你可以做的是这样的事情:

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

然后你可以索引它们,并使用More Like This捆绑包来搜索具有类似兄弟名字的其他人。 是的,它会为你排名。