thinker_g 2015-05-29 13:24:37 13789次浏览 5条回复 1 0 0

这样一个问题:

在应用开发过程中经常会对数据库中的某些表添加created_at或updated_at字段来记录某条记录被创建和最后更新的时间戳。大家在开发时一般是用数据库内建的时间戳类型来存储呢(TIMESTAMPDATETIME之类),还是字段使用int型然后存入一个php时间戳(形如1432874587的整形)?

我先来说一下个人看法:我比较倾向于使用数据库内建的时间戳。理由:

  1. 这个是体验上比较直观的。对于线上项目,在程序出现问题的时候往往要进入数据库直接查历史数据,这时如果我们存储的是PHP时间戳的话就很不方便,你会看到一列形如乱码的字段(pia)在那儿。当你想筛选数据时,就不得不使用相关SQL函数进行时间转换。而且由于时间戳是时区无关的,有时还要手动处理时差,才能的到准确的范围,不然你直接在数据库修正数据的时候很容易有那么几个小时的用户数据躺枪,同时还有那么几小时的数据漏掉,对于用户来自于多个时区的项目这影响可能是灾难性的。
  2. 在页面上获取用户输入的时候,我相信没有哪个程序会让用户直接输入时间戳吧?绝大部分情况下程序收到的一手用户输入本质上还是一个字符串。我们在后端需要转换成时间戳再写入数据库,而且转换前的格式验证还是不能省的。

但有一次公司一个持相反观点的工程师在讨论时是这样说的:

  1. 有这样一条原则,不依赖数据库处理主要数据逻辑。由于数据库时间戳取出的时候在PHP变量内表示为字符串,会在需要计算时带来不便。在对这些字段筛选时,PHP不得不依赖于数据库查询函数来进行数据转换。
  2. 还是时区的问题,如果数据库时区配置和PHP配置不同,或者用户来自多时区,还需要根据客户端时区来处理时差。使用时间戳可以避免这些麻烦,直接对秒数进行数学计算。

想问问,大家是怎么看的?你们现在的项目中都是怎么实现的?

  • 回复于 2015-05-29 14:31 举报

    http://stackoverflow.com/questions/409286/datetime-vs-timestamp

    我是存php time(),主要是看别人都这么存的,我就这么存了。。没思考太多啊。

  • 回复于 2015-05-29 15:27 举报

    如果你查询需要经常比较时间,比如大于xx年xx月xx日xx分,小于xx年xx月xx日xx分,根据日期筛选,就用数据库的日期类型。

  • 回复于 2015-06-01 16:14 举报

    我习惯于time(),纯粹个人爱好

  • 回复于 2015-06-09 17:55 举报

    支持后者

    有这样一条原则,不依赖数据库处理主要数据逻辑。由于数据库时间戳取出的时候在PHP变量内表示为字符串,会在需要计算时带来不便。在对这些字段筛选时,PHP不得不依赖于数据库查询函数来进行数据转换。
    还是时区的问题,如果数据库时区配置和PHP配置不同,或者用户来自多时区,还需要根据客户端时区来处理时差。使用时间戳可以避免这些麻烦,直接对秒数进行数学计算。
    
    3 条回复
    回复于 2015-06-10 15:28 回复

    那如果程序出现问题有时候需要在数据库里直接筛查和校正数据时怎么处理的?

    回复于 2015-06-15 00:28 回复

    我个人也偏重后者,自己处理。原因:
    这个情况不多见,不能只是为了方便自己而放弃程序的多时区及给程序增加额外的负担,而且很多时候,可能只是开发和软件出现问题的时候才会需要进行时间戳转换。这个时候就算非常复杂的 或者超低效率的sql,没关系,只是你一个用户而已。对整体性能的影响就是执行的时间。所以。。。当然可能没有大型项目经验,说法很片面。仅仅讨论学习。

    回复于 2015-06-15 09:41 回复

    你是说在数据库里使用PHP时间戳?可是这样我感觉会增加开发复杂度, 因为我们在写程序的时候还要考虑客户端的不同时差的转换问题。其实这就是一个操作处理是我们开发时候自己写,还是交由数据库处理的问题。我感觉交由数据库处理他的内建数据结构,效率可能会高一点,不过没有实际测试过,只是感觉。

  • 回复于 2016-01-26 10:15 举报

    如果换了数据库,你那些数据还能用吗?时间戳和时区无关,想要什么格式自己就可以转,也可以在SQL查询的时候让他把时间戳自动转换成时间输出,这个数据库本来就支持,是你不会用而已!

    2 条回复
    回复于 2016-02-05 16:01 回复

    兄弟别激动,我觉得这个问题见仁见智吧,哪种方式还是要看使用场景的;而且如果真的是更换数据库,部署环境肯定提前要配置好数据库时区的呀,不然运维团队岂不是成了吃白饭的?

    回复于 2016-02-13 18:39 回复

    我公司多语言项目,确实出过时区问题,因为是多数据库主从。这个东西还是不要直接存数据库了,时间戳和时区无关比较靠谱

您需要登录后才可以回复。登录 | 立即注册