2014-11-20 24 views
8

Đối với một mô hình trong cơ sở dữ liệu của tôi, tôi cần lưu trữ khoảng 300 giá trị cho một trường cụ thể. Điều gì sẽ là những hạn chế, trong điều khoản của hiệu suấtđơn giản trong truy vấn, nếu tôi sử dụng Postgres cụ thể ArrayField thay vì một bảng riêng biệt với mối quan hệ một-nhiều?Django Postgres ArrayField vs mối quan hệ một-nhiều

Trả lời

8

Nếu bạn sử dụng một trường mảng

  • Kích thước của mỗi hàng trong DB của bạn sẽ là một chút lớn như vậy, Postgres sẽ được sử dụng rất nhiều nhiều bảng bánh mì nướng (http://www.postgresql.org/docs/9.5/static/storage-toast.html)
  • Mỗi khi bạn nhận được hàng, trừ khi bạn sử dụng cụ thể defer (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#defer) trường hoặc loại trừ nó khỏi truy vấn qua only hoặc values hoặc thứ gì đó, bạn trả chi phí tải tất cả các giá trị đó mỗi khi bạn lặp lại trên hàng đó. Nếu đó là những gì bạn cần thì hãy là vậy.
  • Lọc dựa trên các giá trị trong mảng đó, trong khi có thể sẽ không đẹp như vậy và ORM của Django không làm cho nó rõ ràng như đối với các bảng M2M.

Nếu bạn sử dụng M2M

  • Bạn có thể lọc dễ dàng hơn trên những giá trị liên quan
  • Những lĩnh vực được hoãn lại theo mặc định, bạn có thể sử dụng prefetch_related nếu bạn cần chúng và sau đó nhận được ưa thích nếu bạn muốn chỉ một tập hợp con của các giá trị đó được tải
  • Tổng dung lượng trong DB sẽ cao hơn một chút với M2M do khóa và các trường id bổ sung
  • Chi phí của các lần tham gia trong trường hợp này hoàn toàn không đáng kể vì chìa khóa.

Cá nhân tôi muốn nói với bảng M2M, nhưng tôi không biết ứng dụng cụ thể của bạn. Nếu bạn đang làm việc với một lượng lớn dữ liệu, nó có khả năng đáng để lấy một bộ dữ liệu đại diện và thử nghiệm cả hai phương pháp với nó.

Các vấn đề liên quan