2013-08-22 18 views
0

我看到人們使用date或getTime存儲/獲取服務器的時間和時間,它可以保存在數據庫中,作爲各種字符串:「1983年7月21日01:15:00」。我應該如何保持服務器時間?

到目前爲止,我將服務器時間存儲爲NOW與2013年1月1日之間的差異。這將返回一個數值(以分鐘爲單位),在2013年1月1日至現在爲止,我將其作爲內部服務器時間。

這樣做的好處是: - 查詢服務器意味着一個簡單的數字比較操作,同時(我作出一個有教育的猜測)比較兩個日期意味着內部轉換爲對象和使用脂肪比較操作。 - 存儲一定數量的大小比~25個字符的字符串更輕量級。 - 轉換回「真實」的時間是2013年1月1日增加,但由於初始圓度,秒和毫秒值丟失。

但是,其他同行的程序員堅持認爲使用字符串版本 - 作爲一個人很容易閱讀。 - 它是大多數語言的通用格式(尤其是此項目所具有的nodejs,mongodb和as3)。

我不確定哪個更適合大型數據庫,特別是對於基於多人插座的遊戲。我相信其他有這方面實際經驗的人可以對我的問題有所瞭解。

那麼哪個更好,爲什麼?

+1

並將其作爲UTC以及使您的應用程序TZ知道,這樣你有真正的國際化。我真的會與你一直在談論的程序員爭辯......數據庫存儲的數據不應該是人類可讀的,這就是爲什麼你要製作應用程序 – Sammaye

+0

那麼爲什麼不把它們存儲爲2013年1月1日之間的差異呢?這樣兩個日期都在同一個時區。實際上所有的差異都在同一時區日期之間。 – Discipol

+0

@Discipol如果你將它們存儲爲int並且它們將是未來證明,那麼對該部分沒有任何反應,但任何其他日期都應該是日期時間對象,字符串日期是死亡跪拜,我接管了很多系統那些已經犯了這些錯誤... – Sammaye

回答

1

將它們存儲爲Mongo Date對象。 Mongo將日期存儲爲8字節的第二偏移整數[1],並以人類可讀的格式顯示它們。你不存儲25個字符!

因此,所有的比較都一樣快。除了查詢時,沒有字符串解析,每個查詢都是一次性操作。

您的差異存儲爲4個字節的整數。所以你只需要在普通的MongoDB日期存儲上保存4個字節。考慮到您的mongo物體的平均尺寸,這是非常小的節省。

考慮你的「偏移自2013年1月」方法的所有缺點:

  • 時間花在編寫額外的邏輯,以抵消日期更新或查詢時。
  • 花時間處理因忘記補償日期而產生的錯誤。
  • 檢查數據庫輸出時(診斷問題時)手動或頭腦中移動日期的時間,而不是馬上看到實際日期。
  • 無法在沒有額外工作的情況下在MongoDB聚合中使用日期操作符(例如$ dayOfMonth,額外的工作是將內部日期轉移到內部的投影)。

基本上,更多的代碼和更多的頭痛和花費更多的時間,一切以節省數據庫中的對象,其中相同的4個字節可以通過重新命名字段保存4個字節的「更新」到「UPD」?我不認爲這是一個明智的折衷。

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

過早的優化是所有罪惡的根源。除非你確定某件事情是個問題,否則不要進行優化。

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

相關問題