PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Django + Postgres + Chuỗi thời gian lớn

Nếu tôi hiểu đúng suy nghĩ của bạn, bạn đang cân nhắc lưu trữ chuỗi thời gian trong PostgreSQL, một bản ghi chuỗi thời gian trong một hàng cơ sở dữ liệu. Đừng làm vậy.

Một mặt, vấn đề là lý thuyết. Cơ sở dữ liệu quan hệ (và tôi nghĩ rằng hầu hết các cơ sở dữ liệu) dựa trên tiền đề của tính độc lập của hàng, trong khi các bản ghi của một chuỗi thời gian được sắp xếp theo thứ tự vật lý. Tất nhiên, chỉ mục cơ sở dữ liệu cung cấp một số thứ tự cho các bảng cơ sở dữ liệu, nhưng thứ tự đó có nghĩa là để tăng tốc độ tìm kiếm hoặc trình bày kết quả theo thứ tự bảng chữ cái hoặc theo một số thứ tự khác; nó không bao hàm bất kỳ ý nghĩa tự nhiên nào đối với trật tự đó. Bất kể bạn đặt hàng theo cách nào, mỗi khách hàng đều độc lập với các khách hàng khác và việc mua hàng của mỗi khách hàng độc lập với các lần mua hàng khác của họ, ngay cả khi bạn có thể nhận chúng hoàn toàn theo thứ tự thời gian để hình thành lịch sử mua hàng của khách hàng. Sự phụ thuộc lẫn nhau của các bản ghi chuỗi thời gian mạnh hơn nhiều, điều này làm cho cơ sở dữ liệu quan hệ không phù hợp.

Trong thực tế, điều này có nghĩa là không gian đĩa được sử dụng bởi bảng và các chỉ mục của nó sẽ rất lớn (có thể lớn hơn 20 lần so với việc lưu trữ chuỗi thời gian trong tệp) và việc đọc chuỗi thời gian từ cơ sở dữ liệu sẽ rất chậm, giống như một lệnh. có độ lớn chậm hơn so với lưu trữ trong tệp. Nó cũng sẽ không mang lại cho bạn bất kỳ lợi ích quan trọng nào. Có thể bạn sẽ không bao giờ thực hiện truy vấn "cung cấp cho tôi tất cả các bản ghi chuỗi thời gian có giá trị lớn hơn X". Nếu bạn cần một truy vấn như vậy, bạn cũng sẽ cần một đống phân tích khác mà cơ sở dữ liệu quan hệ chưa được thiết kế để thực hiện, vì vậy, bạn vẫn sẽ đọc toàn bộ chuỗi thời gian vào một số đối tượng.

Vì vậy, mỗi chuỗi thời gian nên được lưu trữ dưới dạng tệp. Nó có thể là một tệp trên hệ thống tệp hoặc một đốm màu trong cơ sở dữ liệu. Mặc dù thực tế là tôi đã thực hiện cái sau, tôi tin cái trước là tốt hơn; trong Django, tôi sẽ viết một cái gì đó như thế này:

class Timeseries(models.model):
    name = models.CharField(max_length=50)
    time_step = models.ForeignKey(...)
    other_metadata = models.Whatever(...)
    data = models.FileField(...)

Sử dụng FileField sẽ làm cho cơ sở dữ liệu của bạn nhỏ hơn và giúp bạn dễ dàng thực hiện các bản sao lưu gia tăng của hệ thống. Việc tìm kiếm các lát cắt trong tệp cũng sẽ dễ dàng hơn, một điều có lẽ không thể hoặc khó với một đốm màu.

Bây giờ, loại tệp nào? Tôi khuyên bạn nên xem xét những con gấu trúc. Đó là một thư viện python để phân tích toán học có hỗ trợ chuỗi thời gian và nó cũng phải có một cách để lưu trữ chuỗi thời gian trong tệp.

Tôi đã liên kết ở trên với một thư viện của tôi mà tôi không khuyên bạn nên sử dụng; một mặt nó không làm những gì bạn muốn (nó không thể xử lý độ chi tiết tốt hơn một phút, và nó có những thiếu sót khác), và mặt khác nó đã lỗi thời - tôi đã viết nó trước gấu trúc và tôi định chuyển đổi nó để sử dụng gấu trúc trong tương lai. Có một cuốn sách, "Python để phân tích dữ liệu", của tác giả gấu trúc, mà tôi thấy vô giá.

Cập nhật (2016): Ngoài ra còn có InfluxDB. Chưa bao giờ sử dụng nó và do đó tôi không có ý kiến, nhưng nó chắc chắn là thứ bạn cần kiểm tra nếu bạn đang tự hỏi làm thế nào để lưu trữ chuỗi thời gian.

Cập nhật (2020-02-07): Ngoài ra còn có TimescaleDB, một phần mở rộng cho PostgreSQL.

Cập nhật (2020-08-07): Chúng tôi đã thay đổi phần mềm của mình (một lần nữa) để nó lưu trữ dữ liệu trong cơ sở dữ liệu bằng cách sử dụng TimescaleDB. Chúng tôi đã thành thạo PostgreSQL và thật dễ dàng để học một số TimescaleDB. Lợi thế cụ thể quan trọng nhất là chúng tôi có thể thực hiện các truy vấn như "tìm tất cả các vị trí có lượng mưa> 50mm trong vòng 24 giờ vào năm 2019", một điều sẽ rất khó khăn khi lưu trữ dữ liệu trong các tệp phẳng. Một ưu điểm khác là kiểm tra tính toàn vẹn — trong nhiều năm, chúng tôi đã có một vài chuỗi thời gian có các hàng trùng lặp vì ít lỗi ở đây và ở đó. Những mặt hạn chế cũng rất đáng kể. Nó sử dụng nhiều hơn 10 lần dung lượng ổ đĩa. Chúng tôi có thể cần phải thay đổi chính sách sao lưu PostgreSQL của mình vì điều đó. Nó chậm hơn. Có thể mất một giây để truy xuất chuỗi thời gian với 300 nghìn bản ghi. Điều này là ngay lập tức trước đây. Chúng tôi cần triển khai bộ nhớ đệm để truy xuất chuỗi thời gian, điều này không cần thiết trước đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi khóa chính từ số nguyên sang nối tiếp?

  2. Có thể thay đổi thứ tự tự nhiên của các cột trong Postgres không?

  3. Cách tạm dừng việc thực thi một câu lệnh trong PostgreSQL

  4. Postgres KHÔNG trong mảng

  5. Cần tìm gì nếu Bản sao PostgreSQL của bạn đang bị trễ