У нас есть проблема с нашей структурой данных в SQL Server, поскольку мы упорядочиваем по вычисляемому полю.Имея это в виду, нам было интересно, можно ли будет использовать Map Reduce для подготовки индексов, чтобы наши ответы были быстрыми - особенно в RavenDB.
К вашему сведению - я спрашивал об этом ранее на DBA и получил несколько отличных ответов, но хотелрассмотреть этот другой подход:
Я попытаюсь привести пример - это не моя структура таблицы - я просто пытаюсь обрисовать проблему, чтобы найти решение ...
Person Id, Name
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