2011-08-15 58 views
5

Tôi đọc ở đâu đó nói rằng mỗi bảng nên có một khóa chính để thực hiện 1NF.Mọi bảng có khóa chính không?

Tôi có bảng tbl_friendship.

Có 2 trường trong bảng: Chủ sở hữu và bạn bè.

Trường chủ sở hữu và bạn bè là khóa ngoài của trường id tăng tự động trong tbl_user.

Tbl_friendship này có khóa chính không? Tôi có nên tạo trường id gia tăng tự động trong tbl_friendship và đặt nó làm khóa chính không?

+1

Tôi nghĩ bạn đã nhầm lẫn "khóa chính" với "số nhận dạng nhân tạo" hoặc có thể là "khóa thay thế". Google cho các bài viết của Chris Date về [Hình thức bình thường đầu tiên thực sự có nghĩa là gì] (http://books.google.co.uk/books?id=y_eVBB5qdwMC&pg=PA107&dq=%22what+first+normal+form+really+means%22&hl= vi & ei = diJJTqSqKtGq8QPRi9myBg & sa = X & oi = book_result & ct = kết quả & resnum = 1 & ved = 0CC8Q6AEwAA # v = onepage & q =% 22%% 20first% 20normal% 20form% 20really% 20means% 22 & f = false) – onedaywhen

+1

** YES! ** - * Nếu không có một khóa chính, nó không phải là một bảng * (Joe Celko) –

Trả lời

5

Các khóa chính có thể áp dụng cho nhiều cột! Trong ví dụ của bạn, khóa chính phải ở cả hai cột, Ví dụ: (Chủ sở hữu, Bạn bè). Đặc biệt khi Chủ sở hữu và Bạn bè là chìa khóa nước ngoài cho người dùng thay vì tên thực tế nói (cá nhân, cột nhận dạng của tôi sử dụng quy ước đặt tên "Id" và tôi sẽ có (OwnerId, FriendId)

Cá nhân tôi tin rằng mọi bảng nên có một khóa chính, nhưng bạn sẽ tìm thấy những người khác không đồng ý.

Dưới đây là một bài báo tôi đã viết về chủ đề hình thức bình thường. http://michaeljswart.com/2011/01/ridiculously-unnormalized-database-schemas-part-zero/

+0

i mặc dù khóa chính phải có giá trị duy nhất? các trường của Chủ sở hữu và Bạn bè sẽ có nhiều giá trị trùng lặp. Thông thường tôi sẽ thiết lập các lĩnh vực chủ sở hữu và bạn bè như là chỉ số (không phải chính khóa). Là tôi đúng hay sai? – zac1987

+1

Có, tính duy nhất là thuộc tính của khóa chính. Thật bất thường khi có các hàng hoàn toàn giống nhau trong một bảng, nhưng nếu đó là yêu cầu, thì bạn có thể chọn không có khóa chính hoặc thêm cột tăng tự động như bạn đã đề xuất. –

+0

-1, không bao giờ sử dụng cột phi kỹ thuật cho khóa chính, đó sẽ là con đường đến địa ngục! Thay vào đó, hãy sử dụng khóa chính kỹ thuật như "ID", như OP được đề xuất. –

0

Bảng của bạn sẽ dễ quản lý hơn trong thời gian dài nếu bảng có khóa chính. Ít nhất, bạn cần xác định duy nhất mỗi bản ghi trong bảng. Trường được sử dụng để nhận dạng duy nhất mỗi bản ghi cũng có thể là khóa chính.

4

có mỗi bảng cần phải có một khóa chính.

có bạn nên tạo chìa khóa thay thế .. aka tự động incr trường ement pk.

Bạn cũng nên đặt "Friend" là FK thành trường tăng tự động đó.


Nếu bạn nghĩ rằng bạn sẽ "khóa lại" trong tương lai, bạn có thể muốn xem xét sử dụng khóa tự nhiên, là trường tự nhiên nhận dạng dữ liệu của bạn. Chìa khóa cho điều này là trong khi mã hóa luôn sử dụng các định danh tự nhiên, và sau đó bạn tạo các chỉ mục duy nhất trên các khóa tự nhiên đó. Trong tương lai nếu bạn phải tái quan trọng bạn có thể, bởi vì ux của bạn đảm bảo dữ liệu của bạn là nhất quán.

Tôi sẽ chỉ làm điều này nếu bạn hoàn toàn phải làm, bởi vì nó làm tăng độ phức tạp, trong mã và mô hình dữ liệu của bạn.

+0

Tôi có thể biết Khóa ngoại của "Bạn" phải tham chiếu đến trường id tăng tự động từ tbl_user hoặc tbl_friendship? Nếu tbl_friendship, tại sao? – zac1987

3

Nó không phải là rõ ràng từ mô tả của bạn, nhưng là chủ sở hữu và người bạn khóa nước ngoài và có thể chỉ có một mối quan hệ giữa bất kỳ cặp nhất định? Điều này làm cho hai cột chính nước ngoài trở thành một ứng cử viên hoàn hảo cho một khóa chính tự nhiên.

Một tùy chọn khác là sử dụng khóa thay thế (cột tăng thêm tự động như bạn đã đề xuất). Hãy xem here để có một cuộc thảo luận chuyên sâu.

+0

-1, không bao giờ sử dụng cột phi kỹ thuật cho khóa chính, đó sẽ là con đường đến địa ngục! Thay vào đó, hãy sử dụng khóa chính kỹ thuật như "ID", như OP được đề xuất. –

+0

@Tamasz Nurkiewicz, tôi đã cập nhật câu hỏi của mình để làm rõ. Cảm ơn. – zac1987

+0

Tôi có thể biết cách tạo hai khóa ngoại như một khóa chính không? Tôi có nghĩa là làm thế nào để đặt chúng trở thành một khóa chính? – zac1987

2

Khóa chính cũng có thể là thứ trừu tượng. Trong trường hợp này, mỗi tuple (chủ sở hữu, bạn bè), ví dụ: ("Dave", "Matt") có thể tạo thành một mục duy nhất và do đó là khóa chính của bạn. Trong trường hợp đó, sẽ hữu ích nếu không sử dụng tên, nhưng các khóa tham chiếu đến một bảng khác. Nếu bạn đảm bảo rằng các bộ dữ liệu này không thể có bản sao, bạn có khóa chính hợp lệ.

Vì lý do xử lý, có thể hữu ích khi giới thiệu khóa chính đặc biệt, như trường tự động gia tăng (ví dụ:trong MySQL) hoặc sử dụng một chuỗi với Oracle.

1

Để tuân thủ 1NF (không hoàn toàn bị ảnh hưởng khi định nghĩa 1NF), có, bạn phải có khóa chính được xác định trên mỗi bảng. Điều này là cần thiết để cung cấp tính duy nhất của mỗi bản ghi.

http://en.wikipedia.org/wiki/First_normal_form

Nói chung, bạn có thể tạo một khóa chính bằng nhiều cách, một trong số đó là phải có một cột auto-increment, một là phải có một cột với GUID, một là phải có hai hoặc nhiều các cột sẽ xác định một hàng duy nhất khi được kết hợp với nhau.

0

Có mọi bảng nên có (ít nhất một) khóa. Các hàng trùng lặp trong bất kỳ bảng nào là không mong muốn vì nhiều lý do để đặt ràng buộc vào hai cột đó.

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