Сопоставление элементов с несколькими внешними ключами в RavenDB - PullRequest
0 голосов
/ 17 июля 2011

Я задавал этот вопрос ранее относительно SQL Server: Сложный запрос SQL - поиск элементов, соответствующих нескольким различным внешним ключам

По сути, мне нужно иметь возможность находить продукты, которые соответствуют нескольким критериям,У меня есть сценарий, в котором мне нужно найти продукты, которые соответствуют каждой из нескольких категорий и встречаются в нескольких счетах.

Решение было довольно сложным набором союзов, который сводится к подсчету количества совпадений продукта скритерии и фильтрация для элементов, количество которых соответствует количеству критериев.

 ; with data (ID, Count) as (
      select pc.ProductID, count(*) from ProductCategories pc (nolock)
           inner join @categoryIDs /*table valued param*/ c on c.ID = pc.CategoryID
      union all
      select ip.ProductID, count(*) from InvoiceProducts ip (nolock)
           inner join @invoiceIDs i on i.ID = ip.InvoiceID 
 )
      select d.ID from data d
           group by d.ID
           having sum(d.Count) = @matchcount

Но сейчас я рассматриваю поставщика NoSQL.Итак, мой вопрос: как мне создать индексную функцию для соответствия запросу такого типа в RavenDB (или каком-либо другом проекте NoSQL)?

1 Ответ

1 голос
/ 18 июля 2011

Для правильной настройки с помощью RavenDB (или любой другой БД документов) требуется умственный сдвиг.Проблема заключается в хакерских атаках, которые мы все использовали при работе со структурированными данными на SQL-сервере.

Следовательно, вопрос здесь в том, как моделируются ваши данные.Чтобы быть более точным - как вы собираетесь использовать его чаще всего;исходя из этого, существуют определенные рекомендации по определению сущностей и их связыванию.

Для простого объекта Product со строкой [] категорий вы можете запросить БД следующим образом:

   // Query on nested collections - will return any product with category "C#"
    products = from p in session.Query<Product>()
               where p.Categories.Any(cat => cat == "C#")
               select c;

Вы можете добавить столько предложений Where, сколько захотите.Индекс будет создан автоматически для вас, но рекомендуется использовать статические индексы, когда вы остановились на модели.

Подробнее по этой теме:

http://ayende.com/blog/4801/leaving-the-relational-mindset-ravendbs-trees

https://github.com/ravendb/docs

...