2016-12-09 20 views
6

Tôi đang cố gắng tạo một DB cho ứng dụng của mình và một điều tôi muốn tìm cách tốt nhất để làm là tạo mối quan hệ một-nhiều giữa số UsersItems bảng.Hàng loạt các phần tử PostgreSQL mà mỗi khóa là một khóa ngoài

Tôi biết tôi có thể làm cho một bảng thứ ba, ReviewedItems, và có các cột là một id User và một Item id, nhưng tôi muốn biết nếu nó có thể làm cho một cột trong Users, chúng ta hãy nói reviewedItems, mà là một mảng số nguyên chứa các khóa ngoài là Items rằng User đã được xem xét.

Nếu PostgreSQL có thể thực hiện việc này, vui lòng cho tôi biết! Nếu không, tôi sẽ đi xuống tuyến đường thứ ba của tôi.

+0

Đó là một thiết kế tồi, đọc về mô hình quan hệ. Nó cũng là một faq, xin vui lòng google tiêu đề của bạn. – philipxy

+1

Đã có các bản vá để thêm tính năng này vào Postgres, xem https://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/ (2012) và https: //www.postgresql .org/message-id/CAJvoCuuEgQ% 2Bpjv02rjvQN4o9s4_H3HJMdZdQwss2b0c0-xagEw% 40mail.gmail.com (2017). Họ vẫn chưa được chấp nhận, nhưng hy vọng một ngày nào đó. –

Trả lời

7

Không, điều này là không thể.

PostgreSQL là quan hệ DBMS, hoạt động hiệu quả nhất trên các mô hình dữ liệu được chuẩn hóa đúng cách. Mảng là theo định nghĩa, chúng được sắp xếp theo thứ tự - không phải cấu trúc dữ liệu quan hệ và tiêu chuẩn SQL do đó không hỗ trợ định nghĩa các khóa ngoài trên các phần tử mảng, và cũng không phải PostgreSQL.

Tuy nhiên, bạn có thể xây dựng cơ sở dữ liệu hoàn hảo với các phần tử mảng liên kết với khóa chính trong các bảng khác. Tuy nhiên, những phần tử mảng này không thể được khai báo là khóa ngoài và do đó DBMS sẽ không duy trì tính toàn vẹn tham chiếu.

+1

Bạn _can_ xác định trình kích hoạt ràng buộc để kiểm tra điều đó. Nhưng tôi không chắc chắn nếu nó hoạt động đáng tin cậy trong mọi trường hợp. –

+0

@a_horse_with_no_name: bạn có thể đưa ra một ví dụ về 'đáng tin cậy trong mọi trường hợp' không? Bạn có nghĩa là đôi khi kích hoạt có thể thất bại? Cảm ơn. –

+1

@LuanHuynh: Tôi không nhớ chi tiết (kỹ thuật), nhưng lần cuối cùng điều này được thảo luận trong danh sách gửi thư mà ai đó đã đề cập rằng trình kích hoạt ràng buộc tương ứng có thể không bắt được tất cả các trường hợp - nhưng điều đó có thể không còn đúng nữa –

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