1

我有一个 Employee 类,它有一些字段:

EmployeeID、FirstName、LastName、Age、Rank

我想从数据库中获取所有员工并在 ComboBox 中打印他们的姓名,所以我真正需要的是:

员工 ID、名字、姓氏

我的问题是:我是否应该始终从 db 获取所有字段,比如说填充我所有的类字段,或者只是我需要的那些?

PS。伙计们,前段时间我问了一个尚未真正回答的问题: 如果一个类具有来自字典表中 SQL JOIN 值的字符串字段, 如果您可以看一下并分享您的想法,我会非常高兴。谢谢。

4

6 回答 6

3

我是否应该始终从 db 获取所有字段,比如说填写我的所有类字段,还是只填写我需要的字段?

是的。你应该得到你想要的!

不要从表中获取所有列,因为这对您来说是不必要的。

即使您从表中取出所有列并且如果您不使用它们,那也没有用,而且您正在增加 SQL Server 的工作量。

附带说明:-

这也可能取决于您的需要,即,如果您想减少数据库命中的数量,那么您可以一次获取所有记录。所以简而言之,它可能取决于您访问数据库的频率。

于 2013-10-22T21:52:50.310 回答
3

直截了当的答案是“不,你应该只获取你需要的字段。”

但总有一个权衡,你是否希望同一张表的不同视图有或多或少的重复代码。这取决于您获取数据的频率、行数、字段的大小。

于 2013-10-22T21:54:42.740 回答
2

一般来说,客户端-服务器编程更好的方法是只将需要的数据从服务器发送到客户端,所以对你的问题的一般回答是:“你应该只从数据库中获取需要的字段,这将减少网络流量和数据包解析时间”

但是,如果您使用的是 DAO 方法,即代码中的每个对象都显示来自数据库的表 - 您必须获取所有内容,因为您需要完全初始化的对象

矛盾?不,如果你想保留你的 DAO 对象,但只获取需要的数据,你需要有 2 个对象:

  1. FullEmployeeInfo - 此对象将包含数据库中的所有字段,此对象将在数据库更新/完整信息呈现期间使用
  2. PartialEmployeeInfo - 此对象将只有部分字段,不会用于更新 DB 中的数据,它只是只读对象

因此,为了在组合框中快速选择和显示,您将使用第二个查询,它只返回部分信息

于 2013-10-22T21:56:39.180 回答
1

通常最好只获取您需要的数据 - 减少您获取的数据量会减少获取数据所需的时间,从而提高性能。这也意味着您的应用程序对更改更具弹性(例如,如果您将 Age 替换为 DOB,则假设您请求了所有字段,则需要将应用程序从采用名为 Age 的整数更新为采用名为 DOB 的日期 - 如果您只要求那些你需要(即不是年龄/出生日期)改变不会影响你。

也就是说,如果您正在填充一个类,那么一次获取所有列可能是个好主意 - 因为如果该类包含所有这些信息,那么它可能会在以后的某个时间被访问,而不是获取单个列作为它们是必需的,一个预先提取然后从缓存中提取数据总体上会更快。

因此,这是一个根据您期望应用程序的使用方式来权衡性能影响和任何其他关注因素(例如维护工作)的情况。没有一揽子规则;仅关于哪些因素会影响您的决定的指南。

于 2013-10-22T21:58:14.377 回答
1

我的观点 如果这是您唯一一次使用此类 Employee 数据并且您永远不需要表的所有值,那么有两种查看方法更快但是如果您将在程序的其他地方使用这些值,那么我将选择所有值,因为稍后您可能必须更改或创建一个新值才能获得您需要的值。我个人喜欢让一个班级做 2 个工作评估员然后有 2 个班级。

于 2013-10-22T22:02:28.040 回答
1

您需要考虑您在合同中同意的与您实施的架构的约定。让我解释...

这取决于您使用什么作为数据传输机制。

如果您使用的是 ADO 数据表,那么只需获取您需要的数据。消费者期待一个数据表,并且应该测试它期待的列是否存在。请注意,这在合同上是不合理的 - 可能会遗漏一列,您将收到运行时错误。列可以交换,您可能会导致运行时错误。

但是,如果您正在填充数据对象,那么您需要获取所有内容。这是因为您已通过合同同意向该对象的使用者提供该数据对象中应包含的所有数据。当然,这意味着您必须考虑数据对象的设计——它们不应该只是镜像数据表或从中提取数据的视图。如果数据源是 80 列宽,并且您无法重构该数据源,那么您应该考虑拥有数据对象的轻量级和重量级版本,并且仅在必要时使用重量级版本。

您还应该考虑您在任何时候检索的行数 - 您是否非常有选择性,或者您是否抓取了所有内容,包括您永远不会使用的行?

于 2013-10-22T22:05:08.413 回答