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

时间:2013-10-22 21:49:45

标签: c# sql

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

  

EmployeeID,FirstName,LastName,Age,Rank

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

  

EmployeeID,FirstName,LastName

我的问题是:我是否应该始终从db获取所有字段,让我们说填写我所有的课程字段,或者只填写我需要的字段?

PS。伙计前段时间我问过一个尚未真正回答的问题: Should a class have string fields for values from SQL JOIN from dictionary tables 如果您可以看一看并分享您的想法,我会非常高兴。 感谢。

6 个答案:

答案 0 :(得分:3)

  

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

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

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

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

旁注: -

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

答案 1 :(得分:3)

海峡前线的答案是“不,你应该只取你需要的田地。”

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

答案 2 :(得分:2)

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

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

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

  1. FullEmployeeInfo - 此对象将包含来自DB的所有字段,此对象将在数据库更新/完整信息显示期间使用
  2. PartialEmployeeInfo - 此对象只有部分字段,而不会用于更新数据库中的数据,它只是只读对象
  3. 所以,为了在组合框中快速选择和显示,你将使用第二个查询,它只返回部分信息

答案 3 :(得分:1)

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

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

因此,根据您对应用程序的预期使用情况来衡量性能影响和任何其他关注因素(例如维护工作量)。没有一揽子规则;只考虑哪些因素会影响您的决定。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

这取决于您使用的数据传输机制。

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

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

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