我会发挥每个系统的优势。
聚合,加入和过滤逻辑显然属于数据层。它更快,不仅因为大多数数据库引擎有10年的优化,只是这样做,但你最小化数据库和Web服务器之间的数据移动。
另一方面,我使用的大多数DB平台具有很差的用于处理单个值的功能。事情喜欢日期格式化和字符串操作只是吸引SQL,你最好做这个工作在PHP。
基本上,使用每个系统的内容做什么。
在可维护性方面,只要将发生在哪里的事情分开是清楚的,将这些分为逻辑类型不应该产生太多问题,肯定不足以带来好处。在我看来,代码的清晰性和可维护性更多的是关于一致性,而不是把所有的逻辑放在一个地方。
Re:具体例子…
>我知道这不是你指的太多,日期几乎是一个特殊的情况。您要确保系统生成的所有日期都在Web服务器或数据库上创建。否则将导致一些阴险的错误,如果db服务器和web服务器被配置为不同的时区(我看到这种情况发生)。例如,假设您有一个createdDate列,默认值为getDate(),该值在DB插入时应用。如果你要插入一个记录,然后使用在PHP生成的日期(例如日期(“Ymd”,时间() – 3600),选择在最后一小时创建的记录,你可能不会得到你的期望。你应该这样做,我喜欢DB,因为在该示例中,它允许您使用列默认值。
>对于大多数应用程序,我会这样做在PHP。结合名字和姓氏听起来很简单,直到你意识到你需要备注,标题和中间首字母有时也有。此外,你几乎肯定会最终在一个情况下,你想要一个用户的名字,姓氏和组合称呼firstname姓。连接它们DB端意味着你最终移动更多的数据,虽然真的,它是很小。
>取决于。如上所述,如果你想单独使用它们,你最好单独把它们分开,并在需要时连接。也就是说,除非你处理的数据集是巨大的,可能有其他因素(如,你提到,可维护性)有更多的方位。
一些经验法则:
>生成增量ID应该发生在DB中。
>个人而言,我喜欢我的默认值由数据库应用。
>选择时,任何减少记录数量的操作都应由DB完成。
>它通常很好做的事情,减少数据集DB侧的大小(就像上面的字符串示例)。
>正如你所说的;排序,聚合,子查询,连接等应该始终是DB端。
>另外,我们没有谈论它们,但触发器通常是坏/必要的。
有一些核心权衡你面对这里,平衡真的取决于你的应用程序。
一些东西应该绝对 – 每次 – 总是在SQL中完成。排除一些异常(如日期事情)对于很多任务SQL可以非常笨重,可以离开你的逻辑,在方式的地方。当在代码库中搜索对特定列的引用时(例如),很容易忽略视图或存储过程中包含的那些。
性能总是一个考虑,但根据你的应用程序和具体的例子,也许不是一个大的。您对可维护性的担心,可能非常有效,以及我提到的一些性能优势非常轻微,因此请注意过早优化。
此外,如果其他系统直接访问数据库(例如,用于报告或导入/导出),您将从数据库中拥有更多逻辑中受益。例如,如果要直接从另一个数据源导入用户,则可以在SQL中实现类似电子邮件验证功能的可重用用户。
简答:取决于。 🙂