¿Es una mala práctica dar a todas las demás tablas una relación (redundante) con la tabla Company para simplificar mis consultas SQL?
Sí, en absoluto, ya que significaría actualizar cada relación redundante al actualizar el cliente de relaciones con la empresa o sección a la empresa, y si pierde una actualización, ahora tiene una base de datos llena de redundancia. Es una mala desnormalización.
Si su objetivo es simplemente simplificar su SQL, considere el uso de vistas para "llevar adelante" los datos primarios. Aquí está una vista que tira Company_id en contrato, por Join a través del cliente:
create view contract_customer as
select
a.*,
b.contract_id, b.company_id
from
contract a
join customer b on (a.customer_id = b.customer_id);
Esta unión es simple, pero ¿por qué repetir una y otra vez? Escríbelo una vez y luego use la vista en otras consultas.
Muchos (pero no todos) RDBMS pueden incluso optimizar la unión si no coloca columnas del cliente en la lista de selección o en la cláusula de la consulta en función de la vista, siempre que haga contract.customer_id tener una restricción de integridad referencial de clave externa en customer.customer_id. (En ausencia de tal restricción, no se puede omitir la combinación, porque entonces podría existir un contrato.customer_id que no existía en el cliente. Como nunca querrá ese, tendrá que agregue la restricción de clave externa)
El uso de la vista logra lo que desea, sin el tiempo invertido de tener que actualizar las tablas secundarias, sin el espacio adicional de hacer que las filas secundarias sean más anchas agregando la columna redundante (y esto realmente comienza importar cuando tiene muchas filas, ya que cuanto más ancha sea la fila, menos filas caben en la memoria a la vez), y lo más importante, sin la posibilidad de datos incoherentes cuando el padre se actualiza pero los niños no.
La palabra "relación" no significa lo que aparentemente pretendía que significara. Una * relación * en el modelo de base de datos relacional corresponde a lo que la mayoría de la gente llama una tabla. No tiene nada que ver con las relaciones entre los datos en diferentes tablas. – sqlvogel
Sí, tienes razón. Lo he corregido – svenwltr
@SvenWalter actualice la pregunta con la tabla en un bloque de código ('
') ya que el archivo de imagen externo ya no está disponible. Comparto el dolor de no tener las tablas adecuadas en SE (los desarrolladores están empeñados en nunca hacerlo disponible), pero al menos podemos emularlos con bloques de código en lugar de depender de herramientas externas. – ADTC