5

Imagine un esquema como tal.Accesos directos de teclas foráneas en la tabla

NOTE TABLE:   NoteID, Note, DetailedTaskID, ..... 

DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... 

WORKORDER TABLE:  WorkOrderID, ProjectID, ..... 

PROJECT TABLE:   ProjectID, ..... 

Ahora, con este esquema digamos que yo quiero para recuperar todas las notas que están asociados a un proyecto específico termino con un buen número de uniones.

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

Así que mi pregunta es la siguiente, cuando (o nunca) es conveniente agregar una columna "atajo" para una tabla (en este caso Proyectólo)?

Así que, básicamente, cambiar la tabla de nota a esto: ID de nota, nota, DetailedTaskID, Proyectólo

Respuesta

7

Respuesta corta: Nunca, jamás. respuesta

más larga: Sólo cuando:

  1. que haya determinado que el rendimiento de las uniones es inaceptable (que rara vez es cierto).

  2. Has agotado todas las alternativas menos peligrosas.

  3. que está dispuesto a absorber el trabajo adicional para mantener la redundancia de información, desnormalizada en sincronía

  4. Usted está dispuesto a aceptar el hecho de que entonces se convierte técnicamente posible que su base de datos para devolver resultados incorrectos si alguna vez deja de sincronizar las cosas.

+0

¿Podría simplemente confirmar? Cuando dices "menos peligroso", supongo que te refieres a un escenario en el que un error podría provocar que una clave foránea apunte a un proyecto y una a otro, ¿no? –

+0

Solo así. En este caso, un descuido en su código (o el código de otra persona, agregado más adelante) podría actualizar las claves foráneas en una tabla y no en la otra. O bien, podría actualizar solo algunos de los valores de claves foráneas desnormalizadas en filas en la segunda tabla, pero no en otras. O podría actualizar demasiadas filas en la segunda tabla. Y es posible que no vea estos errores de inmediato, o consistentemente, si a veces obtiene los valores de clave foránea de la tabla normalizada y, en ocasiones, de la tabla desnormalizada. Se puede hacer, pero asegúrese de tener una verdadera necesidad de hacerlo primero. –

+0

Muchas gracias por su aporte ... –

1

Lo que estamos hablando se llama una relación de clave externa. Es la base para Data Normalization. En resumen, agregaría una relación de clave externa (ProjectID) a su tabla Nota si una Nota (es decir, NoteID) pertenece a un Proyecto.

Los beneficios de hacer esto son para que pueda consultar estos datos relacionales, como esto:

select 
    Note.*, 
    Project.* 
from Note 
left join Project 
on Note.ProjectId = Project.ProjectId 

Esa consulta produciría todas las notas y los datos del proyecto (si es parte de un proyecto) que es relacionado a ello.

Cuestiones relacionadas