数据与输出格式的前端

时间:2009-07-23 13:33:57

标签: sql mysql sql-server database oracle

我已经读过(所有条件相同)PHP在算术和字符串操作操作中通常比MySQL快。在这种情况下,人们要求数据库做什么与Web服务器做什么之间划清界线?我们专门使用存储过程作为数据访问层。我的不成文规则一直是将输出格式(包括字符串操作和算术)留给Web服务器。所以我们的查询返回:

  • 未格式化的日期
  • null values
  • 没有计算值(即列“foo”和“bar”的返回值,如果需要显示值foobar,请让Web服务器计算foo * bar)
  • 没有减少子字符串的字段(除非缩短的字段非常短,我们希望在数据库级别执行此操作以减少结果集大小)
  • 两个单独的列,让前端根据需要输出

我感兴趣的是关于这是否通常是一种合适的方法的反馈,或者其他人是否知道将这些活动推送到数据库的合理性能/可维护性考虑因素。

注意:我故意将此问题标记为与dbms无关,因为我认为这是一个架构考虑因素,无论特定的dbms如何都会发挥作用。

4 个答案:

答案 0 :(得分:3)

通常,数据格式化最好在客户端完成,尤其是特定于文化的格式化。

动态旋转(即变量列)也是在客户端做得更好的一个例子

当谈到字符串操作和动态数组时,PHP比我所知的任何RDBMS强大得多。

但是,数据格式化可以使用也保存在数据库中的其他数据。比如,每行的着色信息可以存储在附加表中。

然后,您应该将颜色与数据库端的每一行对应,但将其包装到PHP侧的标记中。

经验法则是:在尽可能少的数据库往返中检索格式化所需的所有内容,然后在客户端进行格式化。

答案 1 :(得分:3)

我想就某些图层如何为其他实现旋转到位而划清界限。您很可能永远不会使用不同的RDBMS或拥有您网站的移动版本,但您永远不会知道。

数据点越正交,就越接近以该形式从数据库中释放。如果在您网站的每个理论版本上,您的值A和B都呈现为A * B,那么您的数据库应该将其作为A * B返回,并且从不计算客户端。

假设你的格式像日期一样重。有时你有短日期,长日期,英文日期...应该从数据库返回一个纯表单,然后应该用PHP格式化。

因此正交点也是相反的。数据点在其表示/显示中越动态,客户端应该处理得越多。如果字符串A始终被视为前六个字符的子字符串,则将其作为pre-substring'ed从数据库返回。如果子字符串的长度取决于某个因素,例如6个用于移动设备,10个用于您的Web应用程序,则从数据库返回较大的字符串并在运行时使用PHP对其进行格式化。

答案 2 :(得分:1)

我相信从数据库中按原样返回数据,并让它在前端进行格式化。我并不坚持宗教,但总的来说我觉得它更好,因为它提供了更大的灵活性 - 例如1个sproc可以满足不同的数据要求,每个数据都可以根据每个需求格式化数据。否则,您最终会返回多个查询,返回相同的数据,格式与数据库略有不同(从SQL Server的角度来看,从而减少执行计划缓存的好处 - 因此对性能产生负面影响)。

答案 3 :(得分:1)

将输出格式保留为Web服务器