处理数据库查询或代码中的数据

时间:2010-03-19 15:48:43

标签: sql

当您在代码或查询中执行数据操作时,如何确定执行数据操作的哪一方?

例如,当您需要以特定格式显示日期时。您是直接在SQL查询中检索所需的格式还是检索日期,然后通过代码对其进行格式化?

什么可以帮助您决定:性能,最佳实践,SQL与代码语言的偏好,任务的复杂性......?

7 个答案:

答案 0 :(得分:6)

在所有条件相同的情况下,我更喜欢在代码中进行任何操作。我尽可能地将数据作为原始数据返回,以便更大的消费者可以使用它。如果它非常专业,可能是一个报告,那么我可能会在SQL端进行操作。

我喜欢在SQL端进行操作的另一个实例是它是否可以基于集合进行。

如果它没有设置,并且涉及循环,那么我将在代码中进行操作。

基本上让数据库尽其所能,否则在代码中执行。

答案 1 :(得分:3)

格式化是一个UI问题,它不是“操纵”。

答案 2 :(得分:3)

我的答案与其他人相反。

如果您要在应用程序的多个位置或单独的应用程序中应用相同的格式化逻辑(对于计算逻辑也是如此),我会将格式封装在数据库内的视图中,从视图中选择。您无需隐藏原始数据,也可以使用原始数据。但是通过将逻辑放入数据库视图,您可以轻松地在模块和应用程序之间实现一致的格式化。

例如,Customer表将具有一个关联视图CustomerEx,其中包含一个MailingAddress派生列,该列将根据需要格式化地址的各个部分,组合城市,州和zip以及压缩空白行等。我的应用程序代码针对地址的CustomerEx视图进行SELECT。如果我使用Apt#字段扩展我的数据模型或处理国际地址,我只需要更改该单个视图。我不需要更改,甚至不需要重新编译我的应用程序。

答案 3 :(得分:2)

我永远不会(永远)在查询中指定任何格式。这取决于消费者决定如何格式化。除批量操作外,所有数据操作都应在客户端完成。

答案 4 :(得分:1)

如果它只是格式化并且不一定需要是相同的格式,我会在应用程序中执行此操作,这可能会更快地执行此操作。

然而,最快的格式是只进行一次的格式化,所以如果它是我想要使用的标准格式(比如将美国电话号码显示为(###)### - ####)然后我将以该格式将数据存储在数据库中(这仍然可能涉及应用程序代码,但插入时不是选择)。如果您可能需要为报告重新格式化一百万条记录,则尤其如此。如果您有多种格式,您可能会考虑计算列(我们有一个用于全名,一个用于lastname,firstname和我们的原始数据是firstname,middlename,lastname,suffix)或触发器来保存数据。一般来说,如果您可以将数据保存在适当的数据类型中,以便进行需要进行的实际操作,例如datemath或常规数学货币值,我会说您需要将数据存储起来。

答案 5 :(得分:0)

在日期列的情况下,我会在数据库中保存完整日期,当我返回它时,我在代码中指定了我想如何向用户显示它。这样,您可以忽略时间部分,甚至可以在数据网格中显示时更改日期部分的顺序,例如:mm / dd / yyyy,dd / mm / yyyy或仅mm / yyyy。

答案 6 :(得分:0)

关于我在查询中唯一可能在代码中完成的事情是将日期时间转换为用户的时区。

MySQL的CONVERT_TZ()函数易于使用且准确。我将所有日期时间存储在UTC中,并在用户的时区中检索它们。夏令时规则发生变化。这对于客户端应用程序尤其重要,因为依赖于本机库依赖于用户已更新其操作系统的事实。

即使对于服务器端代码,例如Web服务器,我只需要更新几个表来获取最新的时区数据,而不是更新服务器上的操作系统。

除了这些类型的问题之外,最好将大多数功能分发到应用程序服务器或客户端,而不是使数据库成为瓶颈。应用程序服务器比数据库服务器更容易扩展。

如果你可以编写存储过程或可能以大数据集开头的东西,做一些廉价的计算或简单的迭代来返回单个行或值,那么在服务器上执行它以保存发送可能是有意义的电线上的大型数据集。那么,如果处理成本低廉,为什么不让数据库返回你需要的呢?