2012-07-01 18 views
20

¿Está bien tener dos claves externas en una tabla que hagan referencia a una clave principal de otra tabla?Dos claves externas que hacen referencia a la misma clave primaria

EmployeeID es una clave principal en la tabla de empleados y aparece como una clave foránea dos veces en la tabla de hojas de horas.

Habrá pocos usuarios de administración llenando las hojas de trabajo en nombre de otros empleados.

En el campo de la tabla timsheet 'TimsheetFor' tendrá employeeID de la persona que ha trabajado en proyectos y el campo 'EnteredBy' o 'FilledBy' tendrá employeeid de esa persona que ha llenado esta hoja de tiempo.

¿Cuál de las siguientes opciones es correcta?

NOTA: Las tablas muestran solo los campos que están relacionados con esta pregunta.

enter image description here

+1

Sí, está bien que tienen dos FK a la mismo pk en una mesa. – Glenn

+2

Sí - ** ¡por supuesto! ** ¿Por qué preguntas? ¿Cuál es el problema/problema que estás viendo? –

+0

Quería hacer la misma pregunta. ¡Me alegro de ser parte de este gran sitio! Gracias por responder :) –

Respuesta

3

sí, no hay problema con eso ... se puede utilizar una clave principal de una tabla en otra tabla como extranjeros tecla dos veces.

20

Me gustaría ir con opción 1. Está perfectamente bien tener dos columnas de clave foránea que hagan referencia a la misma columna de clave primaria en una tabla diferente ya que cada valor de clave foránea hará referencia a un registro diferente en la tabla relacionada.

estoy seguro opción 2 funcionaría, pero que sería esencialmente una relación de 1 a 1 entre TIMESHEET_TABLE y TIMESHEET_FILLED_BY, haciendo dos mesas innecesaria y más difícil de mantener.

De hecho, si se requieren ambos ENTERED_BYTIMESHEET_FOR y en parejas, utilizando la opción 1 tiene mucho más sentido, porque esto se hace cumplir automáticamente por la base de datos y claves externas.

+2

Soy SSS y respaldo esta respuesta :) – SSS

+0

Funciona, pero solo si ambos FK tienen Opciones de Eliminar y Actualizar a NO ACCIONAR. Si coloca "Cascade" u otras opciones, le dará un error. Tengo la misma situación en mi SQL 2008 Server, donde tengo dos tablas, Currency y CurrencyHistory. La moneda tiene IdCurrency como clave principal, y la segunda tabla tiene IdCurrency y IdCurrencyRefference, que tiene que ser la misma columna Id de la tabla de divisas. Entonces, la eliminación o actualización lo tengo que hacer desde el código, programáticamente. Eso es :) –

2

La opción 1 es la solución perfecta. Es posible definir la restricción de clave externa de la siguiente manera

primera restricción de clave foránea para la columna Timesheet_For

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

segunda restricción de clave foránea para la columna Entered_By

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1 
FOREIGN KEY (ENTERED_BY) 
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID) 
Cuestiones relacionadas