由菜鸟询问的BASIC对象 - 关系映射问题

时间:2009-05-11 05:08:59

标签: oop

我理解,为了提高效率,当您查询数据库时,您应该只返回所需的列,而不是更多。

但鉴于我喜欢使用对象来存储查询结果,这让我处于两难境地:

如果我只检索在特定情况下需要的列值,我只能部分填充该对象。我觉得,这使我的对象处于非理想状态,只有一些属性和方法可用。稍后,如果出现我希望重用该对象的情况,但发现新情况需要返回一组不同但重叠的列,我面临着一个选择。

我是否应该重用现有的SQL并将所选列的列添加到新情境所需的其他字段中,以便可以为两者重用相同的查询和对象映射逻辑?或者我应该创建另一个导致执行稍微不同的SQL的方法,这会导致仅填充第二个查询返回的那些对象属性?

我强烈怀疑没有神奇的答案,答案真的“取决于”情况,但我想我正在寻找一般建议。通常,我的方法是从查询表返回所有列,或者在需要时向查询添加其他列,但重用相同的SQL(和映射代码),直到性能成为问题。一般来说,我发现除非你要检索大量的行 - 我通常不会 - 在输出中添加额外列的成本不会对性能产生显着影响,并且节省了开发时间并简化了结果的API是一个很好的权衡。

但是,当性能成为一个因素时,你如何应对这种情况呢?你创建像

这样的方法吗?

Employees.GetPersonalInfo Employees.GetLittleMorePersonlInfoButMinusSalary 等等等

或者你最终会以某种方式创建一个API,其中API的用户必须指定他想要填充/返回的列/属性,从而增加复杂性并使您的API不那么友好/易于使用?

假设您想获得员工信息。通常会涉及多少个对象?

1)一个Employee对象 2)Employees集合对象,包含返回的每个Employee行的一个Employee对象 3)一个对象,例如返回的EmployeeQueries,包含诸如“GetHiredThisWeek”之类的方法,它返回一个包含0或更多记录的Employees集合。

我意识到所有这些都是非常主观的,但我正在寻找有关你发现的最适合你的建议。

3 个答案:

答案 0 :(得分:1)

我想先说明你的应用是正确的,然后在这种情况下担心性能。

您可能只是优化了您的查询,以便意识到您无论如何都不会使用该查询。创建整个应用程序可以使用的最通用的查询,然后因为您确信事情正常,请在需要时查找问题区域。

您可能不会非常需要预先提供巨大的性能。有人说懒惰的程序员是最好的程序员。不要事先使事情过于复杂,制作一个Employee对象。

如果您发现需要优化,您将创建一个方法/类,或者您的ORM库会这样做。这应该是规则的例外;只有你有理由这样做才能做到。

答案 1 :(得分:0)

  

...在输出中添加额外列的成本对性能没有明显影响......

右。我不太明白“新情况”会出现什么,但不管怎样,获取所有列而不是运行多个查询会更好(IMO)。获得比你需要的更多的列没有太多的性能损失(虽然查询将占用更多的RAM,但这不应该是一个大问题;此外,硬件便宜)。另外,你可以节省很多开发时间。

关于你问题的第二部分,这完全取决于你。举个例子,Rails采用了“可用性优先,性能最后”的方法,但这可能不是你想要的。这取决于您的需求。如果你愿意为了表现而牺牲一点可用性,那就去吧。我愿意。

答案 2 :(得分:0)

如果您在“一次一行”CRUD类型的应用程序中使用对象,那么,无论如何都要将所有列复制到您的对象中,额外的开销是最小的,并且您的对象可以真正重用于任何想要对表进行行访问的程序。

但是,如果您的SQL正在进行复杂的连接或返回大量的行,那么请精确地请求您所需的内容。你在这里得到两个性能损失,每次处理每个列都会占用cpu而没有任何好处,并且,两个大多数DBMS系统都有一套用于优化查询的技巧(例如仅索引访问),只有在指定时才能使用确切地说你想要哪些列。

在大多数情况下,没有重用问题,因为扫描/搜索过程往往特定于特定用例。