【发布时间】: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
【问题讨论】: