Будет ли моя структура данных и запросов жизнеспособной в RavenDB? - PullRequest
2 голосов
/ 09 февраля 2012

У нас есть проблема с нашей структурой данных в 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

1 Ответ

2 голосов
/ 09 февраля 2012

То, что вы можете сделать, выглядит примерно так:

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

Затем вы можете проиндексировать их и использовать комплект «Больше похожих на это» для поиска других людей с похожими именами братьев. И да, он оценит их для вас.

...