gpt4 book ai didi

c# - 优化分类树搜索解决方案

转载 作者:行者123 更新时间:2023-12-03 17:14:19 25 4
gpt4 key购买 nike

我正在创建某种拍卖应用程序,我必须决定什么是解决这个问题的最优化方式。我使用 BL Toolkit 作为我的 OR 映射器(它有很好的 Linq 支持)和 ASP.NET MVC 2。

背景

我有多个 Category动态创建并保存在我的数据库中作为此类的表示的对象:

class Category
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}

现在每 Category对象可以关联多个 InformatonClass代表该类别中单个信息的对象,例如价格或颜色。这些类也由管理员动态创建并存储在数据库中。有一组特定的类别。代表它的类如下所示:
class InformationClass
{
public int Id { get; set; }
public InformationDataType InformationDataType { get; set; }
public string Name { get; set; }
public string Label { get; set; }
}

现在我有了第三个表,它代表它们之间的连接,如下所示:
class CategoryInformation
{
public int InformationClassId { get; set; }
public int AuctionCategoryId { get; set; }
}

问题

现在的问题是我需要继承所有类别 InformationClass在子类别中。例如,每个产品都有价格,所以我需要添加 InformationClass仅适用于我的根类别。频率信息可以添加到基本 CPU 类别中,并且它应该在派生自 CPU 类别的 AMD 和 Intel 类别中可用。

我必须知道哪个 InformationClass对象与指定的 Category 相关在我的应用程序中经常出现。

所以这是我的问题。对于这个问题,最优化的解决方案是什么?我有一些想法,但我无法决定。
  • 将所有类别从数据库加载到 Application表并每次都从该位置获取它们 - 只要类别不会经常更改,它将减少数据库请求的数量,但仍需要使用 Linq-to-Objects
  • 进行树搜索
  • 发明(我不知道是否可能)一些花哨的 Linq 查询,可以进行树搜索并获取所有信息类 ID,而不会对数据库造成太大压力。
  • 其他一些好主意?

  • 我将不胜感激每一个答案和想法。谢谢大家的指教。

    最佳答案

    听起来像是我曾经在博客上写过的一个想法的案例:

  • Tree structures and DAGs in SQL with efficient querying using transitive closures

  • 基本思路是这样的:除了 Category表,你还有一个 CategoryTC包含父子关系的传递闭包的表。它允许您快速有效地检索特定类别的所有祖先或后代类别的列表。博客文章解释了如何在每次创建、删除新类别或更改父子关系(每次最多两个查询)时使传递闭包保持最新。

    这篇文章使用 SQL 来表达这个想法,但我相信你可以将它翻译成 LINQ。

    您没有在问题中指定 InformationClass表链接到 Category表,所以我必须假设你有一个 CategoryInformation看起来像这样的表:
    class CategoryInformation
    {
    public int CategoryId { get; set; }
    public int InformationClassId { get; set; }
    }

    然后,您可以使用以下方法获取与特定类别关联的所有 InformationClasses:
    var categoryId = ...;
    var infoClasses = db.CategoryInformation
    .Where(cinf => db.CategoryTC.Where(tc => tc.Descendant == categoryId)
    .Any(tc => tc.Ancestor == cinf.CategoryId))
    .Select(cinf => db.InformationClass
    .FirstOrDefault(ic => ic.Id == cinf.InformationClassId));

    这有意义吗?有任何问题,请提出。

    关于c# - 优化分类树搜索解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482989/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com