【发布时间】:2010-12-30 14:19:54
【问题描述】:
我正在尝试为这个问题找到一个干净且高效的解决方案,但不知何故被卡住了。
琐事:
-ASP.Net C# 应用程序 (.Net 3.5)
-MS-SQL Server 2005
数据如下所示:
类别 -> 模板 -> 实例
一个类别可以包含多个模板。
一个模板可以包含多个实例。
这 3 个中的每一个都有一个类和一个对应的包含很多列的数据库表。
我想将数据库中的完整类别加载到 C# Category 类对象中,包括所有相关的模板和实例对象。
我现在有两个选择:
1) 对所有 3 个表进行连接,并一次读取所有数据。
优势:在数据库方面要快得多,一个查询中的所有信息。
缺点:我传输了大量冗余数据,因为在每一行中,每个实例都有相同的类别和模板数据。
示例(简化):
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的相关模板数据等。
优势 :直观的方法,在代码方面更容易处理,不会获取冗余数据。
缺点:对服务器的多个查询,可能更慢。
去这里最好的方式是什么?我错过了一个选项吗?
解决方案 1 似乎具有更好的性能,但对我来说它看起来“不干净”。我必须从一大堆数据行中获取某个类别的数据。
如果我选择解决方案 1,获取类别和模板数据的最佳方式是什么?
从第一个数据行读取它并在值更改后创建一个新实例?
进行某种分组?
提前致谢!这个问题让我头疼了好几天。
【问题讨论】:
-
我很困惑,如果您使用选项#1,为什么会有冗余数据?如果您以外部类 Category 仅包含内部类的 ID 或主键的方式组织类,则它不是冗余数据。对于大多数 ORM,我使用的正是它的完成方式。
-
也许这个简化的例子有误导性:在选项 #1 中,完整的类别和模板数据(不仅是 ID 和名称)将包含在每一行中。因此,为每个不改变的实例多次获取信息是非常多余的。
-
我需要类别和模板的信息来用数据填充类,但是如果我按照选项 #1 加入,我会为每个实例行多次使用它。示例:类别 ID |类别名称 |分类位置 |类别XYZ |模板ID |模板名称 |模板位置 |模板XYZ |实例ID |实例名称 | ...
-
这两种关系是 1:N 还是 N:M 的可能性?
-
其实Category和Template的关系是N:M。为了简化起见,我将其省略了,因为当我仅获取 1 个特定类别的数据时,它并没有真正影响问题。但是,如果要获取所有类别的数据,则必须考虑这一点。
标签: c# asp.net sql database hierarchical-data