2012-12-12 41 views
21

Tôi đang lập mô hình mối quan hệ nhiều-nhiều, trong đó mối quan hệ chỉ được truy cập hầu hết từ một phía. Nó giống như một hệ thống phân cấp, được truy cập từ trên xuống và không phải là cách khác.Bảng nối tiếp với mảng khóa ngoài?

Khảo sát có và thuộc về nhiều Câu hỏi có và thuộc về nhiều câu trả lời.

Cả hai mối quan hệ phải là nhiều-nhiều vì một câu hỏi tương tự có thể được tái sử dụng trên các khảo sát khác nhau và cùng một câu trả lời trong nhiều câu hỏi. Đây là một yêu cầu.

Việc triển khai M2M chuẩn sẽ sử dụng hai bảng giao nhau, surveys_questionsquestions_answers. Thay vào đó, tôi đang suy nghĩ về việc sử dụng mảng số nguyên của PostgreSQL để lưu trữ question_ids trong Khảo sát và answer_ids trong Câu hỏi.

Chúng tôi có thể sử dụng toán tử ANY để truy vấn tất cả các hàng khớp với mảng khóa ngoài.

Chúng tôi sẽ truy vấn tất cả các cuộc điều tra bằng câu hỏi của họ và câu trả lời của câu hỏi bằng cách sử dụng SQL như thế nào?

Làm cách nào chúng tôi có thể khớp thứ tự của các hàng được trả lại với mảng khóa ngoại? I E. sử dụng question_ids = [1,2,3] được đảm bảo trả lại các hàng câu hỏi theo thứ tự 1, 2, 3.

Làm thế nào để hiệu suất hoạt động tốt hơn so với bảng nối (giả sử chỉ mục thích hợp, bất kể chúng có thể là gì)?

Bạn có đề xuất điều này không? Có một số tài nguyên về mô hình hóa M2M như thế này không?

Cập nhật

Có một đề nghị để thêm toàn vẹn tham chiếu cho mảng phím nước ngoài để PostgreSQL 9.3, nhưng nó đã không nhận được bao gồm: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/

SO câu hỏi về giữ gìn trật tự sử dụng ngoại quan trọng mảng PostgreSQL JOIN with array type with array elements order, how to implement?

+0

bạn nói nhiều với nhiều người, nhưng điều này nghe có vẻ như một đến nhiều; nhiều người có nghĩa là mỗi cuộc khảo sát liên quan đến một số câu hỏi và mỗi câu hỏi liên quan đến một số khảo sát, nhưng điều đó nghe có vẻ kỳ quặc, chắc chắn, cách bạn phrased nó 'has-many' thường đồng nghĩa với một đến nhiều (nhiều-to -many thường được gọi là 'có-và-thuộc-nhiều') – SingleNegationElimination

+0

@TokenMacGuy: Xin lỗi vì sự nhầm lẫn. Các câu hỏi có thể tái sử dụng được trên các khảo sát và câu trả lời qua các câu hỏi làm cho các mối quan hệ nhiều-nhiều. Tôi sẽ thay thế nhiều mối quan hệ với HABTM. – randomguy

Trả lời

7

Sử dụng phương pháp tiếp cận bảng tiếp giáp. Phương thức mảng không đủ tiêu chuẩn mà bạn phải đặt câu hỏi về số lượng nó sẽ hoạt động, trong khi phương thức kia hoàn toàn tiêu chuẩn.

+4

bảng nối có thể chậm hơn đáng kể so với mảng mặc dù. xem https://gist.github.com/joevandyk/031cf5812bd656887623 –

+0

Có, đôi khi có hiệu suất đạt được từ phương thức mảng. Có một câu hỏi lớn về việc liệu nó có giữ tất cả các tình huống hay không và một trong những vấn đề chính là việc thêm/xóa một liên kết mới yêu cầu sửa đổi trên hàng dài (phiếu giảm giá, ví dụ) thay vì chèn/xóa của một hàng duy nhất và một khóa trên bảng phiếu thưởng. –

+0

Đồng ý! Nếu bạn không muốn sửa đổi bảng phiếu thưởng trên mỗi lần chèn, bạn có thể có bảng coupons_products_array (coupon_id, product_ids []) thay thế. Nhưng điều đó có thể trở nên ngớ ngẩn. –

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