【问题标题】:Would my data structure and querying be viable in RavenDB?我的数据结构和查询在 RavenDB 中是否可行?
【发布时间】:2012-02-09 10:05:49
【问题描述】:

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

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

我会尝试举个例子 - 这不是我的表格结构 - 我只是想概述问题以找到解决方案......

人名、姓名

BrothersNames ID、姓名

SistersNames ID、姓名

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

【问题讨论】:

    标签: mapreduce ravendb


    【解决方案1】:

    你可以这样做:

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

    然后您可以将它们编入索引,并使用“更多类似”捆绑包来搜索具有相似兄弟名字的其他人。 是的,它会为你排名。

    【讨论】:

    • 如果一个人可以拥有 150 万个兄弟(我知道这在现实生活中是不可能的),这还会以 More Like This 指数快速响应吗?
    • 是的,因为它不会以相同的方式处理这个问题。它会比较相似性向量。
    • 一如既往,您必须进行测试。我没用150万测试过,但是用大量数据测试过
    • 感谢 Ayende - 稍后会在这里测试和评论
    • 我们已尝试保存包含 150 万个条目的文档,如您的回答中所述(每个条目都很长),但 Silverlight 应用程序没有响应。这是因为 Raven 无法管理如此大的文档,还是因为 Silverlight 客户端限制?我们将尝试直接查询...
    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2014-09-10
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多