Principales respuestas
importancia de relacionar tablas en el gestor sql

Pregunta
-
hola aca con una pregunta..
pero no llendo a los libros.. si no a sus experiencias...
pues hay muchos colegas que no relacionan sus tablas..
pero cual es la diferencia entre hacerlas y no hacerlas
Performance? integridad de datos , consistencia..
que tanto se gana, que tanto se pierde
Saludos....
QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..
martes, 19 de agosto de 2014 6:16
Respuestas
-
Cuando hablas de "relacinar las tablas", deduzco por el contexto que lo que quieres decir es "definir los Foreign Key entre las tablas".
¿Cuál es la ventaja principal? La integridad de datos. Gracias a la foreign key el servidor garantiza que no metes en un campo un valor que no existe en otro sitio donde obligatoriamente debería existir. Por ejemplo, si tienes una tabla de Pedidos puedes establecer un Foreign Key a la tabla de Clientes, de forma que el código de cliente que se introduce en el pedido siempre sea el de un cliente existente. Así garantizas que con independencia de los errores que puedan existir en uno o varios de los programas cliente que acceden a la base de datos, nunca podrá ocurrir que se grabe un pedido cuyo cliente no existe.
Como ventaja secundaria, muchas herramientas de desarrollo son capaces de leer estas "relaciones" y proporcionarte de manera automática su seguimiento desde la parte cliente, con lo que se facilita el desarrollo de las aplicaciones.
Las Foreign Keys NO mejoran el rendimiento, al contrario en ciertas ocasiones lo perjudican porque el servidor tiene que cerciorarse del cumplimiento de las relaciones cuando se insertan, borran o modifican datos. En la mayor parte de las aplicaciones, suele merecer la pena esta pequeña carga adicional, es decir, es mayor el beneficio de la integridad de los datos que el pequeño coste en el que se incurre para mantener dicha integridad.
- Propuesto como respuesta Jesús López martes, 19 de agosto de 2014 19:30
- Marcado como respuesta Miguel.Vazquez.MSDNModerator jueves, 21 de agosto de 2014 15:27
martes, 19 de agosto de 2014 19:01 -
A parte de lo que muy bien te ha dicho Alberto las restricciones de clave externa pueden ayudar a realizar ciertas operaciones como la eliminación. Me explico, imagina que tienes una tabla de pedidos y una tabla de detalles de pedido. Normalmente querrás que cuando elimines una fila de la tabla pedidos se eliminen también las filas relacionadas en la tabla de detalles de pedido. Esto puede realizarse automáticamente si estableces el borrado en cascada cuando creas la clave externa. Si no estableces el borrado en cascada entonces la clave externa es un pequeño inconveniente para eliminar un pedido, porque no podrás eliminar un pedido si tiene detalles de pedidos relacionados. En este caso tendrías que eliminar primero los detalles de pedido y luego el pedido.
No siempre es conveniente activar el borrado en cascada en las relaciones. Precisamente para evitar que se eliminen filas de forma automática. Por ejemplo imagina que tienes una tabla de Pagos donde se especifica el tipo de tarjeta de crédito en la que se realiza el pago y una tabla tipos de tarjetas de crédito. Seguramente no querrás que se eliminen los pagos hechos con un determinado tipo de tarjeta de crédito al eliminar el tipo de tarjeta de crédito, más bien querrás que no sea posible eliminar un tipo de tarjeta de crédito si hay pagos hechos con ella.
No siempre se puede establecer un borrado en cascada en una clave externa, eso depende de la complejidad de las relaciones implicadas. Un ejemplo es cuando se modela un árbol en una tabla por medio de listas de adjacencia, o sea la tabla tiene una columna que referencia a la fila padre y es una clave externa. En estos casos no se puede establecer borrado en cascada y añadir la clave externa hace muy difícil eliminar un nodo del árbol, porque habría que empezar eliminando los nodos hoja e ir subiendo y eliminando niveles hasta alcanzar el nodo en cuestión. En estos casos yo prefiero crear la clave externa desactivada. Prefiero tener la clave externa por documentar de alguna manera la relación, pero no quiero que se fuerce la clave externa por lo difícil que hace eliminar un nodo.
- Marcado como respuesta Miguel.Vazquez.MSDNModerator jueves, 21 de agosto de 2014 15:28
martes, 19 de agosto de 2014 19:44
Todas las respuestas
-
Cuando hablas de "relacinar las tablas", deduzco por el contexto que lo que quieres decir es "definir los Foreign Key entre las tablas".
¿Cuál es la ventaja principal? La integridad de datos. Gracias a la foreign key el servidor garantiza que no metes en un campo un valor que no existe en otro sitio donde obligatoriamente debería existir. Por ejemplo, si tienes una tabla de Pedidos puedes establecer un Foreign Key a la tabla de Clientes, de forma que el código de cliente que se introduce en el pedido siempre sea el de un cliente existente. Así garantizas que con independencia de los errores que puedan existir en uno o varios de los programas cliente que acceden a la base de datos, nunca podrá ocurrir que se grabe un pedido cuyo cliente no existe.
Como ventaja secundaria, muchas herramientas de desarrollo son capaces de leer estas "relaciones" y proporcionarte de manera automática su seguimiento desde la parte cliente, con lo que se facilita el desarrollo de las aplicaciones.
Las Foreign Keys NO mejoran el rendimiento, al contrario en ciertas ocasiones lo perjudican porque el servidor tiene que cerciorarse del cumplimiento de las relaciones cuando se insertan, borran o modifican datos. En la mayor parte de las aplicaciones, suele merecer la pena esta pequeña carga adicional, es decir, es mayor el beneficio de la integridad de los datos que el pequeño coste en el que se incurre para mantener dicha integridad.
- Propuesto como respuesta Jesús López martes, 19 de agosto de 2014 19:30
- Marcado como respuesta Miguel.Vazquez.MSDNModerator jueves, 21 de agosto de 2014 15:27
martes, 19 de agosto de 2014 19:01 -
A parte de lo que muy bien te ha dicho Alberto las restricciones de clave externa pueden ayudar a realizar ciertas operaciones como la eliminación. Me explico, imagina que tienes una tabla de pedidos y una tabla de detalles de pedido. Normalmente querrás que cuando elimines una fila de la tabla pedidos se eliminen también las filas relacionadas en la tabla de detalles de pedido. Esto puede realizarse automáticamente si estableces el borrado en cascada cuando creas la clave externa. Si no estableces el borrado en cascada entonces la clave externa es un pequeño inconveniente para eliminar un pedido, porque no podrás eliminar un pedido si tiene detalles de pedidos relacionados. En este caso tendrías que eliminar primero los detalles de pedido y luego el pedido.
No siempre es conveniente activar el borrado en cascada en las relaciones. Precisamente para evitar que se eliminen filas de forma automática. Por ejemplo imagina que tienes una tabla de Pagos donde se especifica el tipo de tarjeta de crédito en la que se realiza el pago y una tabla tipos de tarjetas de crédito. Seguramente no querrás que se eliminen los pagos hechos con un determinado tipo de tarjeta de crédito al eliminar el tipo de tarjeta de crédito, más bien querrás que no sea posible eliminar un tipo de tarjeta de crédito si hay pagos hechos con ella.
No siempre se puede establecer un borrado en cascada en una clave externa, eso depende de la complejidad de las relaciones implicadas. Un ejemplo es cuando se modela un árbol en una tabla por medio de listas de adjacencia, o sea la tabla tiene una columna que referencia a la fila padre y es una clave externa. En estos casos no se puede establecer borrado en cascada y añadir la clave externa hace muy difícil eliminar un nodo del árbol, porque habría que empezar eliminando los nodos hoja e ir subiendo y eliminando niveles hasta alcanzar el nodo en cuestión. En estos casos yo prefiero crear la clave externa desactivada. Prefiero tener la clave externa por documentar de alguna manera la relación, pero no quiero que se fuerce la clave externa por lo difícil que hace eliminar un nodo.
- Marcado como respuesta Miguel.Vazquez.MSDNModerator jueves, 21 de agosto de 2014 15:28
martes, 19 de agosto de 2014 19:44