Tablas de unión/puente Oracle SQL

Solo una pregunta rápida sobre las tablas de unión en Oracle SQL. Entiendo su funcionalidad y su papel en una relación de "muchos a muchos", pero ¿qué pasa con una relación de "uno a muchos"? Tengo dos mesas, Employees y Positions. Cada empleado solo puede ocupar un puesto, sin embargo, cada puesto puede tener muchos empleados. por ejemplo, John Doe solo puede ser un ejecutivo de ventas, sin embargo, hay 4 ejecutivos de ventas en la empresa. Así es como lo tengo codificado hasta ahora:

CREATE TABLE Positions (
position_id NUMBER(2) NOT NULL,
position_name VARCHAR2(25) NOT NULL,
CONSTRAINT pk_position PRIMARY KEY(position_id)
);

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
CONSTRAINT pk_employee PRIMARY KEY(emp_id),
CONSTRAINT fk_emp_pos FOREIGN KEY (emp_position) 
REFERENCES Position(position_id)
);

CREATE TABLE pos_emp (
position_id NUMBER(2) NOT NULL,
emp_id NUMBER(3) NOT NULL,
CONSTRAINT pk_pos_emp PRIMARY KEY(position_id, emp_id)
);

¿Es esto correcto? ¿Hay necesidad de:
un. La clave foránea en el Employee ¿mesa?
B. ¿La mesa de unión?

Quiero hacer cumplir la relación de un empleado a un rol en la tabla de empleados mientras puedo tener la relación de un rol a muchos empleados en la tabla de unión.

Esperar que esto tenga sentido

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

Las relaciones que ha establecido son una relación Muchos-Muchos. Así que si quieres uno a muchos. Entonces la forma más común es saltarse el pos_emp y tener la clave foránea directamente en Employee. Para que la tabla se vea algo como esto:

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
position_id NUMBER(2) NOT NULL,
...

EDITAR

Tengo mi tabla de empleados configurada así en mi código. ¿Será suficiente tener Position_id en la tabla Employee como clave externa para hacer cumplir que cada puesto tenga muchos empleados?

Si position_id en la Employee No permitir nullEntonces no puede agregar un empleado sin un puesto. Eso significa que si está tratando de insertar un Empleado sin un puesto, obtendrá una excepción de que la relación extranjera no se satisface.

Pero debe verificarlo en el código para que cuando agregue un empleado, position_id tenga un valor. Por lo tanto, no envíe la inserción a esa base de datos si no tiene un valor. Porque esa es una llamada innecesaria a la base de datos.

Y otro punto interesante es lo que debería pasar si quitas un Employee? ¿Deberías quitar el Employee relacionado con ese puesto? Si la respuesta es sí. Podría considerar tener una eliminación en cascada de la tabla de posiciones. De lo contrario, es posible que necesite un disparador para ello.

contestado el 04 de mayo de 12 a las 07:05

Tengo mi tabla de empleados configurada así en mi código. ¿Tendrá el Position_id en la Employee Como la tabla de claves foráneas será suficiente para hacer cumplir cada puesto que tenga muchos empleados? - adohertyd

@adohertyd: actualizó la respuesta - Arion

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.