sql >> Base de Datos >  >> RDS >> Oracle

diseño de base de datos uno a muchos a muchos

Siempre debe comenzar diseñando sus tablas en tercera forma normal (3NF). Es bastante aceptable volver a formas menores (generalmente por razones de rendimiento) siempre que comprenda y mitigue el impacto, pero comience con 3NF.

La regla (ligeramente simplificada) para recordar es que cada columna que no es clave en una tabla debe depender de:

  • la llave,
  • toda la clave,
  • y nada más que la llave,
  • "así que ayúdame, Codd":un poco de humor de DBA (y quiero decir "pequeño").

La primera pregunta es bastante simple.

Las relaciones de uno a muchos se representan mejor como una clave externa en la tabla "varios". Así que lo que propones es sensato. Te permite restringir la relación automáticamente. Si tuviera una tabla de unión separada (usada para muchos a muchos), necesitaría recurrir a "trucos" para hacer cumplir la relación de uno a muchos.

En cuanto a su segunda pregunta, debe mirar la regla "Codd" anterior y pensar:¿qué representan exactamente estas filas en cada tabla? Si una acción de elemento de trabajo es un objeto distinto de un elemento de trabajo (pueden estar relacionados pero, si no representan el mismo objeto, son distintos), deberían estar en tablas diferentes.

Además, parece que tiene una relación de uno a muchos allí (un elemento puede tener muchas acciones), por lo que deberían estar en tablas diferentes solo por ese motivo.

En cuanto a su consulta sobre la información redundante:si realmente son redundantes, deben repararse.

Usando el step_num como ejemplo, ¿qué representa esto exactamente? Si es un atributo del elemento de trabajo, no debería estar en el trabajo acción mesa en absoluto.

Se desharía de él a partir de ahí y, si quisiera saber el número de paso de una fila en la tabla de acciones de trabajo, se uniría a la tabla de elementos de trabajo usando la clave externa.

Si en cambio es un atributo de la acción de trabajo, debe eliminarlo de la tabla de elementos de trabajo ya que no tiene sentido. Es posible que tenga dos acciones, cada una con un número de paso diferente, ¿cuál sería el número de paso del elemento principal en ese caso?

Por supuesto, puede tener un distinto número de paso para ambos elementos y acciones:en ese caso, consideraría cambiar el nombre para aclarar la intención, algo así como item_step_num y action_step_num .

La conclusión es comenzar con 3NF. Si en algún momento su base de datos se ejecuta demasiado lento, entonces considerar la reversión a una forma menor. Luego puede preguntarle a otro Pregunta aquí sobre cómo reconocer y mitigar los problemas que surgen de eso (por ejemplo, la posibilidad de datos inconsistentes en dos lugares y el uso de activadores para evitar eso).