2010-07-20 43 views
13

Nếu tôi có mối quan hệ giữa hai bảng (cả hai bảng đều có khóa chính của riêng mình) thì nên hướng dẫn quyết định của tôi về bảng nào lưu trữ khóa ngoại? Tôi hiểu rằng bản chất của mối quan hệ có thể là vấn đề (một, một, nhiều, nhiều, nhiều, không hướng, hai hướng), và có thể là các mẫu truy cập quan trọng. Một cách có hệ thống để đưa ra quyết định đó là gì?Tôi nên lưu trữ khóa ngoại ở đâu?

+2

"Cách có hệ thống để đưa ra quyết định đó là gì?" "hiểu rằng bản chất của mối quan hệ có thể là vấn đề". Chính xác. Bản chất của mối quan hệ quan trọng. Tôi không nhận được câu hỏi. Bạn có muốn biết làm thế nào để xác định đó là phụ thuộc vào khác? –

+0

[Tài liệu MySQL của khóa ngoại] (https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html#idm139680617903472) cung cấp một ví dụ đơn giản về mối quan hệ giữa 2 phụ huynh bảng: 'customer',' product' và một bảng con: 'product_order'. Trong ví dụ đó 'product_order' là bảng con chứa các khóa ngoài. –

Trả lời

18

Bảng nào là đứa trẻ trong mối quan hệ?
Trả lời rằng, và bạn biết bảng nào cần cột khóa ngoài, tham chiếu khóa chính [thường] của cha mẹ. Đó là một mối quan hệ một-nhiều ...

Một nhiều người sẽ yêu cầu bạn thêm một bảng thứ ba, sử dụng các phím từ cả hai bảng làm khóa chính.

+3

... và nếu không có mối quan hệ con/cha/mẹ. nó có thể là rất nhiều trong một bảng tham gia. – Wrikken

+5

Hoặc đó là một mối quan hệ một-một và OP nên tự hỏi tại sao nó được chia thành hai bảng ở nơi đầu tiên. – Allan

+1

@Wrikken, @Allan: Điểm tuyệt vời, cả hai bạn. –

1

Khóa ngoài chỉ đơn giản là trường trong một bảng đề cập đến trường khóa của bảng khác. Nó không phải là hoàn toàn quan trọng để xác định lĩnh vực quan trọng nước ngoài như vậy. Đó là, bạn không cần phải thêm một cách rõ ràng các khóa NGOẠI HỐI ... TÀI LIỆU THAM KHẢO ràng buộc vào bảng cho nó là một khóa ngoại. Khi bạn nối hai bảng với nhau, khóa chính của bảng cha sẽ được đặt bằng khóa ngoài của bảng con. Cho dù là không khóa chính là khóa ngoại.

Trong mối quan hệ một-nhiều, FK tiếp tục ở phía "nhiều". Nó không thể đi về phía "một" bởi vì đó là nơi PK đi và định nghĩa của khóa chính bao gồm việc không cho phép trùng lặp.

Nếu bạn có mối quan hệ nhiều-nhiều, bạn sẽ cần phải làm việc lại các bảng để bạn kết thúc với hai mối quan hệ một-nhiều và bảng phân giải trung gian.

7

"Một cách mang tính hệ thống để đưa ra quyết định đó là gì?"

Có vẻ như có hai lựa chọn: Mặt "Một" là FK ở "Nhiều bên" hoặc Mặt "Nhiều" có FK ở bên "Một".

Hãy thực sự tìm kiếm các lựa chọn.

  • Tất cả các hàng của bên "Nhiều" có thể dễ dàng tham chiếu một hàng ở bên "Một".

  • Hàng một ở bên "Một" không bao giờ có thể tham chiếu TẤT CẢ các hàng ở bên "Nhiều".

Chỉ có một kỹ thuật hoạt động: "Nhiều" bên có FK thành "Một" bên.

Chỉ có một lựa chọn triển khai thực tế. Không có "quyết định".

+3

Nói tóm lại: đó là vấn đề về cardinality. Nếu bạn có mối quan hệ nhiều-một, khóa phải nằm ở phía 'nhiều'. Nếu nó là một-có-một, ở phía 'một'. Nếu nó là nhiều-nhiều, bạn cần một bảng trung gian. Nếu đó là một-một, bạn có thể tự do lựa chọn. – reinierpost

0

Giống như primary key, một foreign key cũng là một loại constraint được đặt trên một hoặc nhiều cột trong bảng.

foreign key thiết lập liên kết giữa các cột chính và cột có liên quan trong bảng khác. (Bạn cũng có thể liên kết các cột khóa ngoài với các cột trong cùng một bảng.)

Bảng chứa khóa ngoài được coi là bảng con và bảng tham chiếu khóa ngoài là bảng cha.

điểm chính

  1. Các foreign key phải tham khảo một khóa chính hoặc hạn chế duy nhất, mặc dù tài liệu tham khảo có thể được trên cùng một bảng hoặc trên một bảng khác nhau
  2. Một foreign key cũng phải có cùng số cột là số cột trong ràng buộc tham chiếu và các kiểu dữ liệu phải khớp giữa các cột tương ứng.
  3. Không giống như Primary key, Foreign key cột có thể chứa NULL giá trị.
Các vấn đề liên quan