Bạn đang có tiền với các khóa ứng cử viên có thể, vikkyhacks. Các khóa ứng viên chồng chéo là các khóa ứng viên tổng hợp (bao gồm nhiều hơn một thuộc tính) với ít nhất một thuộc tính chung. Vì vậy, các khóa ứng viên chồng chéo của bạn là NM và NO (chúng chia sẻ N).
Giải thích thêm về những điều trên, ban đầu để lại trong các ý kiến:
Tất cả các khóa ứng viên chồng chéo là các nhóm (ví dụ hai hoặc nhiều) khóa ứng viên. Điều đó có nghĩa là tiêu chí đầu tiên là mối quan hệ của bạn R
phải có nhiều hơn một khóa ứng viên (siêu khóa tối thiểu). Đối với bất kỳ khóa ứng cử viên nào được chồng lấp, mỗi khóa trong số chúng (một lần nữa hai hoặc nhiều hơn) phải đáp ứng một vài điều kiện bổ sung. 1) Cả hai phải là khóa ứng viên tổng hợp. Chúng phải bao gồm nhiều hơn một thuộc tính, do đó, một khóa giống như A
sẽ không bao giờ bị chồng chéo, nhưng AB
có thể trùng lặp với một khóa khác. 2) Các khóa tổng hợp phải chia sẻ một thuộc tính. AB
chồng chéo với AC
và BD
nhưng không CD
hoặc EF
.
Tóm lại: hai hoặc nhiều bộ thuộc tính trong đó 1) mỗi bộ là một khóa ứng cử viên (siêu khóa tối thiểu) cho mối quan hệ, 2) mỗi bộ là một khóa tổng hợp (bao gồm nhiều hơn một thuộc tính) và 3) một hoặc nhiều các thuộc tính của các khóa tổng hợp trùng với một thuộc tính của một khóa khác trong tập hợp. Vì vậy, bạn có thể loại trừ MNOP
và NOPL
trên cơ sở rằng chúng không phải là siêu khóa tối thiểu. Bạn có thể loại trừ P
và L
trên cơ sở chúng không phải là khóa tổng hợp (chúng bao gồm một thuộc tính). Bạn còn lại hai khóa NO
và NM
chia sẻ thuộc tính N
, vậy là bạn đã hoàn thành.
Thí dụ
Nó cũng có thể giúp có một ví dụ bạn thực sự có thể quấn đầu xung quanh. Lần duy nhất tôi từng thấy nơi bạn sẽ có các khóa ứng viên chồng chéo là khi bạn có 1) hai thuộc tính có chức năng xác định lẫn nhau (ví dụ: mối quan hệ một-một giữa A
và B
nơi A
có một B
và B
có một A
) và 2) các thuộc tính là một phần của khóa ứng viên tổng hợp.
Ví dụ, trong một số hệ thống, một Customer
có một CreditCard
và một CreditCard
thuộc về một Customer
. Trong bảng Cho thuê nhà, bạn nhận ra duy nhất một Rental
bằng EquipmentId
, Date
và CustomerId
. Để thuận tiện, bạn cũng đã lưu trữ CreditCard
trên bảng này.
Điều này có nghĩa là các FD sau giữ:
{CustomerId, EquipmentId, Date} -> {CreditCard}
{CustomerId} -> {CreditCard}
Nhưng vì liên kết là một đối một, các FD sau đây cũng nắm giữ:
{CreditCard} -> {CustomerId}
{CreditCard, EquipmentId, Date} -> {CustomerId}
Vì CustomerId
và CreditCard
có thể được sử dụng thay thế cho nhau để xác định duy nhất khách hàng của bạn.
Trong kịch bản trên, bạn có các khóa ứng viên chồng chéo:
{CreditCard, EquipmentId, Date}
{CustomerId, EquipmentId, Date}
Chúng chồng chéo vì chúng là các khóa tổng hợp (chúng bao gồm nhiều hơn một thuộc tính) và vì ít nhất một thuộc tính của chúng được chia sẻ (trong trường hợp này, chúng chia sẻ cả hai EquipmentId
và Date
.
Bạn nói rằng bạn không quan tâm BCNF
vào lúc này, nhưng để mang đầy đủ căn nhà này, kịch bản ở trên là lý do tại sao bạn sẽ thỉnh thoảng nhìn thấy một cái bàn ở trong 3NF
nhưng không BCNF
. Bảng trên là trong 3NF
, nhưng không BCNF
.
3NF
cho phép các FD trong đó 1) FD là tầm thường 2) bên trái của FD là khóa ứng cử viên hoặc 3) bên phải của FD là một thuộc tính khóa (một thuộc tính được sử dụng để tạo bất kỳ khóa nào). Vì CreditCard
và CustomerId
là cả hai thuộc tính chính, tất cả các FD đều đáp ứng 2 hoặc 3.
BCNF
là rất giống nhau, nhưng nó chỉ cho phép điều kiện 1 và 2 cho phép 3NF
. Vì điều kiện thứ 3 không được phép BCNF
và cả hai CID -> CC
và CC -> CID
sử dụng điều kiện 3, bảng này không có BCNF
, nhưng nó là 3NF
.
Đối với các mục đích thực tế, trường hợp này là khá hiếm và thông tin này là phạm vi. Giveaway mà bảng của bạn có vấn đề sẽ là thực tế rằng CreditCard/CustomerId
các cặp được lặp lại trên bảng của bạn. Bạn cũng có thể nhận ra rằng bảng thậm chí sẽ không tồn tại 2NF
nếu không có tình trạng hiếm gặp này trong đó phía bên phải của FD có thể là thuộc tính khóa vì CreditCard
phụ thuộc một phần vào khóa chính (nó phụ thuộc vào CustomerId
nhưng không EquipmentId
hoặc Date
.
P
,L
,NO
, vàNM
Một đủ tiêu chuẩn siêu chính là một chìa khóa ứng cử viên duy nhất nếu không có bất kỳ tập con tối thiểu. Lấy ví dụ của bạnMNOP
là siêu khóa vì tập hợp con tối thiểuP
trong nó có thể rút ra tất cả các thuộc tính khác trong mối quan hệ