如果我真的不需要它们,我应该获取所有数据库表字段吗?

本文关键字:数据库 字段 获取 我应该 真的 不需要 如果 | 更新日期: 2023-09-27 18:36:25

我有一个类员工,它有一些字段:

员工 ID、名字、姓氏、年龄、等级

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

员工 ID、名字、姓氏

我的问题是:我应该总是从 db 获取所有字段,比如说填写我所有的类字段,还是只填写我需要的字段?

伙计们前段时间我问了一个尚未真正回答的问题:一个类是否应该具有字典表中 SQL JOIN 中的值的字符串字段如果您能看一看并分享您的想法,我将非常高兴。谢谢。

如果我真的不需要它们,我应该获取所有数据库表字段吗?

向前的答案是"不,你应该只获取你需要的字段。

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

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

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

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

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

附带说明:-

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

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

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

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

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

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

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

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

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

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

您需要考虑您与已实现的体系结构签订了哪些合同协议。让我解释一下...

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

如果您使用的是 ADO 数据表,则只需获取所需的内容即可。使用者需要数据表,并应测试它期望的列是否存在。请注意,这在合同上并不合理 - 可能会错过一列,并且会收到运行时错误。列可能会被交换,并且可能会导致运行时错误。

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

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