首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自DB的分层数据--加入还是不加入

来自DB的分层数据--加入还是不加入
EN

Stack Overflow用户
提问于 2010-12-30 14:19:54
回答 5查看 891关注 0票数 1

我正试图为这个问题找到一个干净有效的解决方案,但不知何故我被困住了。

琐事:

-ASP.Net C#应用程序(.Net 3.5)

-MS-SQL Server 2005

数据是这样的:

类别->模板->实例

类别可以包含多个模板。

模板可以包含多个实例。

这3中的每一个都有一个类,并有一个包含大量列的相应的数据库表。

我希望将一个完整的类别从数据库加载到一个C#类别类对象中,包括所有相关的模板和实例对象。

我现在有两个选择:

1)对所有三个表进行连接,并同时读取所有数据。

on :数据库端的速度要快得多,所有信息都在一个查询中。

缺点:我传输大量冗余数据,因为在每一行中,每个实例都有相同的类别和模板数据。

示例(简化):

代码语言:javascript
复制
CategoryID | CategoryName | TemplateID | TemplateName | InstanceID | InstanceName  
1 | FirstCategory | 1 | FirstTemplate | 1 | FirstInstance   
1 | FirstCategory | 1 | FirstTemplate | 2 | SecondInstance  
1 | FirstCategory | 1 | FirstTemplate | 3 | ThirdInstance  
1 | FirstCategory | 1 | SecondTemplate | 4 | FourthInstance  

2)分别对每个表进行查询,首先收集分类数据,然后用类别ID对相关模板数据进行查询等。

the :直观的程序,在代码端更容易处理,不获取冗余数据。

缺点:对服务器的多个查询,可能比较慢。

这里最好的方法是什么?我错过了选择吗?

解决方案1似乎有更好的效果,但在我看来是“不干净”的。我必须从一大串数据行中获取一个类别的数据。

如果选择解决方案1,那么获取类别和模板数据的最佳方法是哪一种?

从第一个数据行读取它,并在值更改后创建一个新实例?

做某种分组吗?

提前感谢!这个问题让我头疼好几天了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-30 18:29:57

我现在正在做的一个项目中使用实体框架。在某些情况下对其进行分析时,它确实使用了选项1,并带着冗余数据返回表。因此,微软似乎选择了这种方法,而且他们拥有整个堆栈,因此大概知道如何对这个确切的问题做出正确的决定。

在某些情况下,可能有一些启发式的方法决定使用选项2,但我还没有在我的分析中看到它。此外,我从未见过EF在一个查询中返回多个结果集。

票数 1
EN

Stack Overflow用户

发布于 2010-12-30 15:16:03

还有第三种选择:对每个表执行“select*”,然后在内存中进行连接。您可以使用LINQ进行一些懒惰的评估:

代码语言:javascript
复制
  class Category
  {
    public int CategoryId { get; set; }
    public List<Template> Templates
    {
      get
      {
        return Repository.Templates.Where(t => t.CategoryId == this.CategoryId).ToList();
      }
    }
  }

编辑:您可以对模板/实例关系使用相同的逻辑:

代码语言:javascript
复制
  class Template
  {
    public int CategoryId { get; set; }
    public int TemplateId { get; set; }
    public List<Instance> Instances
    {
      get
      {
        return Repository.Instances.Where(i => i.TemplateId == this.TemplateId).ToList();
      }
    }
  }
票数 1
EN

Stack Overflow用户

发布于 2010-12-30 16:02:32

假设:您使用的是ADO /存储过程,并且您有一个规范化的数据结构。

您可以从一个存储过程调用返回3个结果集。

代码语言:javascript
复制
1) select c.* from category c where c.id = @categoryId

2) select t.* from templates t
    join category c on t.categoryid = c.id 
    where c.id = @categoryId

3) select i.* from Instance i
    join templates t on i.templateid = t.id  
    join category c on t.categoryid = c.id
    where c.id = @categoryId

并使用sqldatareader.read()和sqldatareader.Nextresult()顺序地通过sqldatareader填充对象

它确实取决于您返回的数据的大小,以及您是否使用基于集的数据检索或类似于上面的类似内容的请求这些数据的频率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4563314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档