我应该如何保持服务器时间?

时间:2013-08-22 10:55:34

标签: performance node.js mongodb time coding-style

我看到人们使用date或getTime存储/获取相对于它的服务器时间和时间,这可以作为一系列字符串保存在数据库中:“July 21,1983 01:15:00”。

到目前为止,我将服务器时间存储为NOW和2013年1月1日之间的差异。这将返回一个数字值(以分钟为单位),在2013年1月1日到现在之间向下舍入,我将其作为内部服务器时间保留。

这样做的好处是:   - 查询服务器意味着一个简单的数字比较操作,同时(我做了一个有根据的猜测)比较暗示内部转换到对象和使用胖比较操作的两个日期。   - 存储大小的数量比大约25个字符的字符串更轻。   - 转换回“实际”时间是通过添加1月1日,但由于初始圆度,第二和毫秒值将丢失。

但是,其他程序员仍坚持使用字符串版本   - 作为一个人很容易阅读。   - 它是大多数语言的通用格式(特别是此项目有的nodejs,mongodb和as3)。

我不确定哪个更适合大型数据库,特别是基于多人套接字的游戏。我相信其他有实际经验的人可以解释我的问题。

哪个更好,为什么?

1 个答案:

答案 0 :(得分:1)

将它们存储为Mongo Date对象。 Mongo将日期存储为8字节的第二偏移整数[1],并以人类可读的格式显示它们。你不是要存储25个字符!

因此,所有比较都同样快。除了查询时,没有字符串解析,这是每个查询的一次性操作。

您的差异存储为4字节的int。因此,与普通的MongoDB日期存储相比,您只需保存4个字节。考虑到你的mongo对象的平均大小,这是一个非常小的节省。

考虑“自2013年1月以来的偏移”方法的所有缺点:

  • 在更新或查询时编写额外逻辑以抵消日期所花费的时间。
  • 处理因忘记抵消日期而产生的错误所花费的时间。
  • 在检查数据库输出(诊断问题时)时,手动或在脑中移动日期所花费的时间,而不是立即看到实际日期。
  • 无法在没有额外工作的情况下在MongoDB聚合中使用日期运算符(例如$ dayOfMonth,额外的工作是将日期内部转移到的投影)。

基本上,更多的代码,更多的头痛和更多的时间花费,所有在数据库中的对象上保存4个字节,通过将字段从“updated”重命名为“upd”可以保存相同的4个字节?我认为这不是一个明智的权衡。

另外, Best way to store date/time in mongodb

过早优化是万恶之源。除非你已经确定某些问题,否则不要进行优化。

1 - http://bsonspec.org/#/specification