NHibernate-有效搜索分层数据的标准



假设我们有一个这样的对象模型:

public class Category
{
    public virtual Category Parent { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Category> Children { get; protected set; }
}
public class Product
{
    public virtual string Name { get; set; }
    public virtual Category Category { get; set; }
    public virtual decimal Price { get; set; }
}

在数据库方面,关系将通过多对多关系表来实现,因此数据模式将类似于以下内容:

Category
=================
Id int PK
Name varchar(50)
Parent_Id int FK
Product
=================
Id int PK
Name varchar(50)
Price money
ProductToCategory
=================
Product_Id int PK
Category_Id int PK

现在让我们假设在类别树中有一个分支,看起来像这样:

  • 食物
    • 螺母
      • 腰果
      • 花生
      • 山核桃
    • 面包
      • Rye
      • 小麦
      • 白色

假设我们的产品可能只分配了一个子类别,那么是否可以构建一个Criteria,将类别为Food的所有产品返回到数据库,只需一次命中,而不使用CTE?

或者,考虑到不会有大量的类别,将完整的类别映射加载到内存中并构建标准,以便它搜索产品where Category_Id in (...),并且列表是根据内存中的树构建的,这会更好吗?

您必须使用CTE才能做到这一点。我想不出一个SQL查询可以在不使用的情况下加载一个层次类别的所有产品,更不用说让NHibernate为您做这件事了。

或者,考虑到不会有大量的类别,将完整的类别映射加载到内存中并构建标准,以便它搜索category_Id在(…(中的产品,并且列表是从内存树中构建的,这会更好吗?

是的。如果没有太多数据,并且这是一种选择,那么这是最简单、最快、维护成本低、最不复杂的方法

最新更新