2012-07-01 79 views
20

Điều này có được phép có hai khóa ngoài trong một bảng tham chiếu một khóa chính của bảng khác không?Hai khóa ngoài tham chiếu cùng một khóa chính

EmployeeID là khóa chính trong bảng nhân viên và xuất hiện dưới dạng khóa ngoại trừ hai lần trong bảng timesheet.

Sẽ có rất ít người dùng quản trị điền bảng tính thay mặt cho các nhân viên khác.

Trong trường bảng thời gian 'TimsheetFor' sẽ có employeeID của người đó đã làm việc trên các dự án và trường 'EnteredBy' hoặc 'FilledBy' sẽ có nhân viên của người đã điền bảng chấm công này.

Tùy chọn nào sau đây là đúng?

GHI CHÚ: Bảng chỉ hiển thị những trường có liên quan đến câu hỏi này.

enter image description here

+1

Vâng, nó không quan trọng để có hai fk đến cùng một pk trong một bảng. – Glenn

+2

Có - ** tất nhiên! ** Tại sao bạn hỏi? Vấn đề/vấn đề bạn đang gặp phải là gì? –

+0

Tôi muốn hỏi cùng một câu hỏi. Tôi rất vui vì tôi là một phần của trang web tuyệt vời này! Cảm ơn bạn đã trả lời :) –

Trả lời

3

có, không có vấn đề với điều đó ... bạn có thể sử dụng một khóa chính của một bảng trong bảng khác như chính nước ngoài hai lần.

20

Tôi sẽ sử dụng tùy chọn . Nó là hoàn toàn tốt để có hai cột chính nước ngoài tham chiếu cùng một cột khóa chính trong một bảng khác nhau vì mỗi giá trị khóa ngoài sẽ tham chiếu một bản ghi khác nhau trong bảng có liên quan.

Tôi chắc chắn phương án 2 sẽ làm việc, nhưng bạn về cơ bản sẽ có một mối quan hệ 1-to-1 giữa TIMESHEET_TABLETIMESHEET_FILLED_BY, làm hai bảng không cần thiết và khó khăn hơn để duy trì.

Thực tế, nếu cả hai số ENTERED_BYTIMESHEET_FOR được yêu cầu theo cặp, sử dụng tùy chọn 1 có ý nghĩa hơn vì cơ sở dữ liệu và khóa ngoại được thực thi tự động.

+2

Tôi là SSS và tôi xác nhận câu trả lời này :) – SSS

+0

Nó hoạt động, nhưng chỉ khi cả hai FK có Xóa và Cập nhật Tùy chọn thành KHÔNG CÓ HÀNH ĐỘNG. Nếu bạn đặt "Cascade", hoặc các tùy chọn khác, nó sẽ cho bạn một lỗi. Tôi có tình hình tương tự trên SQL 2008 Server của tôi, nơi tôi có hai bảng, tiền tệ và tiền tệHistory. Tiền tệ có IdCurrency là khóa chính, và bảng thứ hai có IdCurrency và IdCurrencyRefference, mà phải là cùng một cột Id từ bảng Currency. Vì vậy, xóa hoặc cập nhật tôi phải làm điều đó từ mã, lập trình. Đó là nó :) –

2

Tùy chọn 1 là giải pháp hoàn hảo. Bạn có thể xác định ràng buộc khoá ngoại như sau

1 ràng buộc khoá ngoại cho cột Timesheet_For

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable 
FOREIGN KEY (TIMESHEET_FOR) 
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID) 

2 ràng buộc khoá ngoại cho cột Entered_By

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1 
FOREIGN KEY (ENTERED_BY) 
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID) 
Các vấn đề liên quan