27

Tôi có bảng 1 với khóa chính user_id và bảng 2 trong đó user_id là khóa ngoại.MySQL - Sử dụng khóa ngoài làm khóa chính quá

Chỉ có 1 bản ghi cho mỗi user_id có thể tồn tại trong bảng 2 và không có bản ghi nào có thể tồn tại mà không có nó.

CÂU HỎI: Có thể user_id trong bảng 2 là cả khóa ngoài và khóa chính cùng một lúc và nếu có, ý kiến ​​hay là ưu điểm/khuyết điểm là gì?

+0

Câu hỏi tương tự (nhưng không trùng lặp): [Làm cách nào để tạo khoá ngoại cũng là khóa chính trong MySQL?] (Http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -that-is-cũng-a-primary-key-in-mysql) – naXa

Trả lời

32

Có, bạn có thể thực hiện việc này (và bạn nên, từ quan điểm thiết kế cơ sở dữ liệu).

Tuy nhiên, hãy xem xét nó có ý nghĩa gì nếu user_id là khóa chính trên bảng 2. Bạn đang có hiệu lực nói rằng mỗi hàng trong bảng 2 tương ứng với người dùng, nhưng bạn đã có bảng trong đó mỗi hàng tương ứng với người dùng: Bảng 1. Điều này đặt ra câu hỏi "tại sao sau đó bạn không đặt tất cả dữ liệu của bảng 2 vào các cột không có giá trị trong bảng 1?". Sau khi tất cả, có hai bảng có nghĩa là bạn sẽ phải thực hiện hai truy vấn để có được dữ liệu này thay vì một.

Bây giờ có một số kịch bản mà thực tế điều này có thể là một ý tưởng tốt:

  • nếu bạn có rất nhiều người sử dụng nhưng chỉ có một vài dòng trong bảng 2, có lẽ là truy vấn trên bảng 2 sẽ chỉ hiếm khi thể hiện ; đồng thời, bạn có được dung lượng lưu trữ và tốc độ sửa đổi trên bảng 1
  • có thể trong tương lai cho khóa chính của bảng 2 thay đổi, trong khi khóa ngoại vẫn còn; nếu bạn đặt tất cả dữ liệu trong bảng 1, sửa đổi này rất có thể sẽ phá vỡ mô hình cơ sở dữ liệu của bạn

Có thể là một ý tưởng hay, nhưng tùy thuộc vào các ứng dụng của bạn.

+2

Cảm ơn. Trong trường hợp của tôi đó là kịch bản đầu tiên bạn đề cập, cộng với thực tế là bảng 2 có rất nhiều cột, và cũng có các bảng 3, 4, vv có liên quan tương tự với bảng 1, vì vậy việc đặt tất cả các cột sẽ là quá nhiều. – CodeVirtuoso

+5

Một tình huống mà điều này có ý nghĩa là nếu bạn đang sử dụng [thừa kế bảng lớp] (http://stackoverflow.com/a/3579462/1709587) và bảng 2 đại diện cho một phân lớp của bảng 1. Tôi đoán đây là một đặc biệt trường hợp điểm đạn đầu tiên của bạn. –

+0

Một lý do khác để làm điều đó là nếu bạn có hai bảng khác nhau, Bảng A và Bảng B, chia sẻ các cột trong Bảng C. Ví dụ bạn có một Bảng gọi là Danh bạ, một bảng khác được gọi là Nhân viên và một người khác gọi là Người. Mọi người có firstname, lastname, vv và Contacts và Employees đều đại diện cho mọi người. –