Tôi nghĩ chuỗi thời gian UTC như 2011-01-26 21:41:09 +0000
có thể không sao vì chúng sắp xếp chính xác nếu chúng được sử dụng trong khóa chế độ xem nhưng lưu trữ múi giờ (ví dụ: 2011-01-26 16:41:09 -0500
) sẽ làm cho tài liệu dễ đọc hơn. Chuyển đổi ngày thành một số nguyên epoch dường như ít hấp dẫn nhất từ một quan điểm dễ đọc, nhưng có lẽ tốt nhất cho hiệu suất (hoặc nó tạo sự khác biệt?). Thực hành được đề nghị ở đây là gì?Cách tốt nhất để lưu trữ datetimes (dấu thời gian) trong CouchDB là gì?
Trả lời
Thời gian là một thứ một chiều. Dấu thời gian cộng với múi giờ là hai chiều, mô tả một điểm trong thời gian và một vị trí. Khung nhìn Couch là một chiều (nhưng không phải là plugin GeoCouch), vì vậy lưu trữ trong một khu vực chung (UTC) là khôn ngoan.
Có lẽ định dạng chứng minh tương lai nhất là chuỗi tự nhiên sắp xếp theo trình tự thời gian. Có lẽ định dạng thuận tiện nhất như vậy là kết quả đầu ra JSON2:
> a = new Date();
Thu Jan 27 2011 18:40:52 GMT+0700 (ICT)
> JSON.stringify(a)
"2011-01-27T11:40:52.280Z"
Bạn có thể lưu trữ ngày của bạn bao giờ bạn muốn *, đó là cách bạn xuất chúng vào quan điểm của bạn là quan trọng.
* Miễn là Date.parse() có thể đọc nó.
Có giải pháp tốt ở đây: Sorting Dates in CouchDB Views
Tôi thích sử dụng mili giây kể từ thời điểm cuối cùng. Bạn có thể con số này ra với:
new Date().valueOf()
Bạn có thể tạo một ngày mới từ mili giây với:
var milliseconds = new Date().valueOf();
var date = new Date(milliseconds);
Tôi muốn tạo ra một cái nhìn nơi timestamp (trong mili giây) là b chìa khóa/c phân loại là siêu dễ dàng theo cách đó.
Ngoài ra, tôi nghĩ việc sử dụng các số nguyên hiệu quả hơn chuỗi, ít nhất là khi làm việc với dữ liệu ngoài CouchDB.
Nếu bạn chỉ sử dụng Bản đồ bên cạnh Bản đồ giảm hơn những đề xuất này có lẽ là tốt. Tuy nhiên, nếu bạn muốn làm giảm kết quả (_count, _stats, _sum), thì tôi khuyên bạn nên phát ra ngày tháng của bạn dưới dạng mảng để bạn có thể sử dụng group_level. Ví dụ: nếu bạn phát ra (doc.date.split ('-')) trên một chuỗi ngày được định dạng như "2011-02-14", thì bạn có thể trả về _count's (ví dụ) mỗi ngày, tháng, và năm bằng cách sử dụng group_level = 3, 2 và 1 tương ứng.
Bạn có thể lọc thêm dữ liệu bằng cách thêm dữ liệu không có ngày vào đầu khóa. Ví dụ: nếu bạn đã xuất ra tên Twitter, khóa của bạn có thể trông giống như ["bigbluehat", "2011", "02", "14"] và giảm của bạn có thể trả về tổng số tất cả các tweet cho người dùng "bigbluehat" cũng như thống kê cho người dùng đó trong ngày, tháng và năm.
Nếu bạn không sử dụng mặt giảm của sự vật, thì các khóa dựa trên chuỗi có thể tốt.
Bất kể tôi đang sử dụng loại lưu trữ dữ liệu nào, tôi thường muốn một dấu thời gian trong đó làm trường, trong đó tôi sẽ bao gồm một trường cho ngày được tạo và sau đó là trường được cập nhật mà tôi có thể thay đổi khi tài liệu thay đổi.
Tôi thích phương pháp "giây từ thời đại" thường xuyên hơn là "mili giây từ thời đại" chỉ đơn giản là để brevety.
Math.round(new Date().getTime()/1000)
thực hiện thủ thuật cho tôi.
Về mặt khả năng đọc, tôi muốn lưu trữ dưới dạng số nguyên để so sánh dễ dàng và sử dụng giao diện người dùng để hiển thị nó một cách độc đáo.
Không nghi ngờ Unix timestamp là cách tốt nhất để lưu trữ thời gian trong bất kỳ hệ thống nào. Tôi có thể nói với bạn từ một nền tảng trong robot, nơi thời gian là quan trọng. – msysmilu
Dấu thời gian Unix thường là một cách hay, nhưng có nhiều trường hợp không phải. Ví dụ, nếu bạn sử dụng các dấu thời gian Unix trên một máy tính thế chấp 32 bit, bạn sẽ có một thời gian xấu khi thế chấp chạy qua 2038, khi các dấu thời gian của Unix hết. –
+1 tuy nhiên tôi vẫn đề xuất định dạng JSON2 từ câu trả lời của tôi, vì dấu thời gian có thể nằm trong ID tài liệu mà chúng tôi không thể kiểm soát cách xuất nó. (Lưu trữ nhật ký là một tình huống mà tôi đã nhìn thấy rất nhiều dấu thời gian ngay trong '_id'.) – JasonSmith