동일한 기본 키를 참조하는 두 개의 외부 키
한 테이블에 다른 테이블의 기본 키를 참조하는 외부 키가 두 개 있어도 괜찮습니까?
직원ID는 직원 테이블의 기본 키이며 타임시트 테이블에서 외부 키로 두 번 나타납니다.
다른 직원을 대신하여 타임시트를 채우는 관리자는 거의 없을 것입니다.
타임시트 테이블 필드에 'TimsheetFor'에 직원이 있습니다.프로젝트 및 'EnteredBy' 또는 'FilledBy' 필드에서 작업한 사람의 ID는 이 타임시트를 작성한 사람의 직원 ID입니다.
다음 중 올바른 옵션은 무엇입니까?
참고: 표에는 이 질문과 관련된 필드만 표시됩니다.
저는 옵션 1로 하겠습니다.각 외부 키 값은 관련 테이블의 다른 레코드를 참조하므로 동일한 기본 키 열을 참조하는 두 개의 외부 키 열은 다른 테이블에 있어도 괜찮습니다.
옵션 2가 효과적일 것이라고 확신하지만, 당신은 본질적으로 사이에 1대 1의 관계를 맺을 것입니다.TIMESHEET_TABLE
그리고.TIMESHEET_FILLED_BY
두 개의 테이블을 불필요하게 만들고 유지하기가 더 어렵습니다.
사실 둘 다라면ENTERED_BY
그리고.TIMESHEET_FOR
는 쌍으로 필요하며, 옵션 1을 사용하는 것이 데이터베이스 및 외부 키에 의해 자동으로 시행되기 때문에 훨씬 더 의미가 있습니다.
옵션 1은 완벽한 솔루션입니다.외부 키 제약 조건을 다음과 같이 정의할 수 있습니다.
타임시트_열에 대한 첫 번째 외부 키 제약 조건
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable
FOREIGN KEY (TIMESHEET_FOR)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
Entered_By 열에 대한 두 번째 외부 키 제약 조건
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1
FOREIGN KEY (ENTERED_BY)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
네, 그건 문제없습니다...다른 테이블에 있는 한 테이블의 기본 키를 외래 키로 두 번 사용할 수 있습니다.
다음과 같은 질문:
SELECT t.EMPLOYEE_ID, a.NAME as TimeSheetFor, b.NAME as EnteredBy
FROM timesheet t
JOIN employee a ON t.timesheet_for =a.employee_id
JOIN employee b ON t.entered_by = b.employee_id
이 쿼리를 사용하면 원하는 결과를 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/11284428/two-foreign-keys-referencing-the-same-primary-key
'programing' 카테고리의 다른 글
npm 모듈의 모든 버전을 나열하는 방법은 무엇입니까? (0) | 2023.05.23 |
---|---|
C#에서 예외를 다시 적용하는 올바른 방법은 무엇입니까? (0) | 2023.05.23 |
편집기에서 재생할 때 Xcode Simulator 애니메이션이 매우 느림 (0) | 2023.05.23 |
IEnumberable 또는 Array 중 어떤 것을 선호해야 합니까? (0) | 2023.05.23 |
lodash를 사용하여 개체를 어레이로 변환 (0) | 2023.05.23 |