我之前就SQL Server问过这个问题:Complicated SQL Query--finding items matching multiple different foreign keys
基本上,我需要能够找到符合多个标准的产品。我有一个场景,我需要找到符合多个类别的产品,并且可以在多个发票中找到。
解决方案是一组相当复杂的联盟,相当于计算产品符合条件的次数,并过滤计数与标准数相匹配的项目。
; 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项目)中的这种查询?
答案 0 :(得分:1)
要使用RavenDB(或任何其他文档数据库)正确设置,需要进行心理转换。问题在于我们在处理针对SQL服务器的结构化数据时常常遇到的黑客攻击。
因此,这里的问题是您的数据是如何建模的。更确切地说 - 你最常使用它的方式;基于哪些实体定义以及如何将它们链接在一起的某些指导原则。
对于一个简单的Product对象,使用String []类别,您可以像这样查询DB:
// 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