【问题标题】:Should I get all database table fields if I don't really need them?如果我真的不需要它们,是否应该获取所有数据库表字段?
【发布时间】:2013-10-22 21:49:44
【问题描述】:

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

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

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

员工 ID、名字、姓氏

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

附言。前段时间我问了一个尚未真正回答的问题: Should a class have string fields for values from SQL JOIN from dictionary tables 如果你能看看它并分享你的想法,我会很高兴。 谢谢。

【问题讨论】:

  • 如果你想提高一个问题的个人资料,你应该在它上面开一个赏金。但是,您的另一个问题没有明确的答案 - 这确实是一个见仁见智的问题,因此很可能在此基础上关闭。

标签: c# sql


【解决方案1】:

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

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

【讨论】:

  • 第一段比第二段好。
  • 如果这是对数据库运行的唯一查询,那么答案是“不,只获取所需的 3 个字段”
  • 如果您需要另一个具有不同字段的查询,请编写一个。
【解决方案2】:

我是否应该总是从 db 中获取所有字段,比如说填写我的所有字段? 类字段,还是我需要的那些?

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

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

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

附带说明:-

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

【讨论】:

  • 不幸的是,您的答案最终变得非常模糊。你实际上是在说“是的,不,也许,随便。”
  • 或者,换句话说,OP问他应该做A还是B,你说是。
【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您需要考虑与您已实施的架构达成的合同约定。让我解释一下……

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-09
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          • 2011-08-14
          • 2012-11-17
          • 2012-09-14
          • 1970-01-01
          • 2020-04-26
          相关资源
          最近更新 更多