2012-06-11 43 views
50

Tôi có bảng "Người dùng" (tên người dùng, mật khẩu) và bảng "Hồ sơ" (profileId, giới tính, ngày sinh, ...). Hiện tại tôi đang sử dụng phương pháp này: mỗi bản ghi Hồ sơ có một trường có tên là "userId" là khóa ngoài liên kết tới bảng Người dùng. Khi người dùng đăng ký, hồ sơ Hồ sơ của anh ấy được tạo tự động. Tôi nhầm lẫn với đề xuất kết bạn của tôi: để có trường "userId" là khóa ngoài và khóa chính và xóa trường "profileId". Cách tiếp cận nào tốt hơn?Có tốt không khi có khóa ngoại là khóa chính?

+2

Khuôn khổ thực thể tạo ra (với mã đầu tiên) cho zeroOrOne (và một) quan hệ một-một. Vì vậy ... có thể. Đó có phải là cách tốt nhất ... Đó là một câu hỏi khác. Nhưng nó hợp lệ. Tôi không bao giờ làm điều đó trong khi tạo cơ sở dữ liệu của riêng mình (nhưng tôi thậm chí không bao giờ nghĩ đến điều đó). –

Trả lời

66

phím nước ngoài là hầu như luôn luôn "Allow Bản sao", mà sẽ làm cho họ không phù hợp như Primary Keys. Thay vào đó, hãy tìm trường xác định duy nhất mỗi bản ghi trong bảng hoặc thêm trường mới (số nguyên tăng dần tự động hoặc GUID) hoạt động như khóa chính.

Ngoại lệ duy nhất cho điều này là các bảng có mối quan hệ một-một, trong đó khoá ngoại và khóa chính của bảng đã nối kết là một và giống nhau.

+25

Một khóa chính kết hợp bao gồm hai khóa ngoài cũng hoàn toàn tốt cho việc thực hiện nhiều mối quan hệ. – rightfold

+0

@rightfold, bạn đã lưu có thể ngày, cảm ơn. – Yahya

1

Tôi sẽ không làm điều đó. Tôi sẽ giữ profileID trọng như chính của bảng Profile

Một chìa khóa nước ngoài chỉ là một hạn chế tham chiếu giữa hai bảng

Người ta có thể lập luận rằng một khóa chính là cần thiết như là mục tiêu của bất kỳ phím nước ngoài tham khảo với nó từ các bảng khác. Khóa ngoài là một tập hợp của một hoặc nhiều cột trong bất kỳ bảng nào (không nhất thiết phải là khóa ứng viên, hãy để một mình khóa chính, của bảng đó) có thể giữ (các) giá trị được tìm thấy trong cột khóa chính của một số bàn khác. Vì vậy, chúng ta phải có một khóa chính để phù hợp với khóa ngoại. Hoặc phải không? Mục đích duy nhất của khóa chính trong khóa chính/khóa khóa ngoài là cung cấp một kết nối rõ ràng - để duy trì tính toàn vẹn tham chiếu đối với bảng "nước ngoài" chứa khóa chính được tham chiếu. Điều này đảm bảo rằng giá trị mà khóa ngoài tham chiếu sẽ luôn hợp lệ (hoặc null, nếu được cho phép).

http://www.aisintl.com/case/primary_and_foreign_key.html

+0

Có thể - nếu bạn có ràng buộc FK giữa User.UserID và Profile.UserID, thì bạn nên có chỉ mục trên Profile.UserID. Tại sao không làm cho rằng chỉ số nhóm chính trên bảng hồ sơ, tiết kiệm một chỉ số thứ hai và toàn bộ rất nhiều công việc không cần thiết cho cơ sở dữ liệu? – DaveBoltman

21

Khóa chính luôn cần phải là duy nhất, khóa ngoài cần phải cho phép các giá trị không phải duy nhất nếu bảng là mối quan hệ một-nhiều. Nó là hoàn toàn tốt đẹp để sử dụng một khóa nước ngoài là khóa chính nếu bảng được kết nối bởi một mối quan hệ một-một, không phải là một mối quan hệ một-nhiều. Nếu bạn muốn cùng một bản ghi người dùng có khả năng có nhiều hơn 1 hồ sơ liên quan đến hồ sơ, hãy đi với một khóa chính riêng biệt, nếu không gắn bó với những gì bạn có.

1

Tùy thuộc vào doanh nghiệp và hệ thống.

Nếu userId của bạn là duy nhất và sẽ là duy nhất mọi lúc, bạn có thể sử dụng userId làm khóa chính của mình. Nhưng nếu bạn muốn mở rộng hệ thống của mình, nó sẽ làm mọi thứ trở nên khó khăn. Tôi khuyên bạn nên thêm một khóa nước ngoài trong bảng người dùng để tạo mối quan hệ với hồ sơ bảng thay vì thêm một khóa ngoại trong hồ sơ bảng.

4

Thường được coi là thực hành không tốt để có mối quan hệ 1-1. Điều này là do bạn chỉ có thể có dữ liệu được biểu diễn trong một bảng và đạt được kết quả tương tự.

Tuy nhiên, có những trường hợp bạn không thể thực hiện những thay đổi này cho bảng mà bạn đang tham chiếu. Trong trường hợp này, không có vấn đề gì khi sử dụng khóa Foreign làm khóa chính. Nó có thể giúp đỡ để có một khóa tổng hợp bao gồm một tự động tăng thêm khóa chính duy nhất và khóa ngoài.

Tôi hiện đang làm việc trên một hệ thống nơi người dùng có thể đăng nhập và tạo mã đăng ký để sử dụng với ứng dụng. Vì lý do tôi sẽ không đi vào tôi không thể chỉ cần thêm các cột cần thiết cho bảng người dùng. Vì vậy, tôi đang đi xuống một lộ trình một với một bảng mã.

+2

Tôi đồng ý với bạn chủ yếu là có nhiều lợi thế để có tất cả dữ liệu trong cùng một bảng với các cột bổ sung. Mặc dù w.r.t này .. "bạn chỉ có thể có dữ liệu được biểu diễn trong một bảng và đạt được cùng một kết quả" ..: có một bảng riêng biệt có thể hữu ích, ví dụ ở đây nếu mục bảng hồ sơ là tùy chọn. Ví dụ: mỗi khách hàng của ngân hàng có thể không có đăng ký ngân hàng qua internet. Trong trường hợp đó, bảng đăng ký IB có thể được sử dụng để hạn chế các bảng khác có các bản ghi con bổ sung. Một lần nữa, ở đây nó có thể được thực hiện với một PK mới cho bảng đăng ký IB cũng. – Teddy

+1

@Teddy Tương tự như vậy, tôi chủ yếu đồng ý với những gì bạn nói. Tuy nhiên, trong câu hỏi ban đầu, họ ghi "... hồ sơ hồ sơ của anh ấy được tạo tự động ..." ngụ ý rằng bảng Hồ sơ không phải là tùy chọn. Trong trường hợp bảng hồ sơ là tùy chọn thì có thể có bảng riêng dưới dạng bảng riêng biệt. Nhưng sau đó một lần nữa, họ chỉ có thể sử dụng các cột nullable trong cùng một bảng. – Tshsmith

+1

Sử dụng một bảng thứ hai riêng biệt, chúng tôi có thể ngăn chặn mục nhập trong bảng thứ ba chỉ được phép cho những người có mục nhập trong bảng thứ hai. – Teddy

0

Vâng, một chìa khóa nước ngoài có thể là một khóa chính trong trường hợp của 1-1 mối quan hệ giữa các bảng

1

Vâng, đó là hợp pháp để có một khóa chính là một chìa khóa nước ngoài. Đây là cấu trúc hiếm, nhưng nó áp dụng cho:

  • mối quan hệ 1: 1. Hai bảng không thể hợp nhất thành một vì các quyền và đặc quyền khác nhau chỉ áp dụng ở cấp bảng (tính đến năm 2017, một cơ sở dữ liệu như vậy sẽ là lẻ).

  • mối quan hệ 1: 0,1. Hồ sơ có thể hoặc không tồn tại, tùy thuộc vào loại người dùng.

  • hiệu suất là một vấn đề và thiết kế hoạt động như một phân vùng: bảng hồ sơ hiếm khi được truy cập, được lưu trữ trên một đĩa riêng biệt hoặc có chính sách tích trữ khác so với bảng người dùng. Sẽ không có ý nghĩa nếu lưu trữ gạch chân là cột.

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