![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Casimiro y Luis Fernando:
Bueno, en todo caso no solo sería a mi a quien tienen que convencer de que estoy equivocado, sino a Holger Klemt (creador de IBExpert, y reconocido desarrollador e impulsor de Firebird). Por cierto, tengo aquí a la mano el correo que recibí de IBExpert KG (empresa de Holger Klemt), invitando a las conferencias que se llevarán a cabo del 11 al 13 de Noviembre de 2010 en Bremen, Alemania. Entre las diferentes conferencias que se van a impartir hay una en particular que me llama la atención: Holger Klemt: Part-time foreign keys: using flexible triggers to replace declarative foreign keys (Holger Klemt: Llaves Foráneas de Tiempo Parcial: usando disparadores flexibles para reemplazar la declaración de Llaves Foráneas). Se aproxima la fecha y mis finanzas no andan muy bien.... además de que mi esposa y yo estamos esperando a nuestro tercer bebé... bueno ... tal vez.... para la próxima vez... Sería interesante si alguien del foro pudiera ir y nos platicara mas, no solo lo de esta conferencia en particular, si no de todas las que van a presentar. Saludos, Gerardo Suárez Trejo. P.D. Si gustan les puedo avanzar dicho correo para que no crean que hablo solo por hablar, o mejor aún, entren a la página de IBExpert y cerciórence por uds mismos que no hablo mentiras. Saludos nuevamente.... Última edición por Gallosuarez fecha: 19-10-2010 a las 02:37:36. |
|
#2
|
|||
|
|||
|
Respondiendo a Gallosuarez, claro que se pueden manejar la integridad referencial via triggers pero implica el que se definan indices para asuntos de rendimiento.
Hay algunos casos en los que ciertas tablas no son buena idea crearlas aún en aras de la flexibilidad en la parametrización de aplicaciones, por ejemplo, crear una tabla para "estado civil" sabiendo que los valores para dicha tabla son pocos y dificlmente cambian. Algunos desarrolladores crean la tabla "estado civil" y crean una llave foranea para el campo"empleado"."estado_civil". Hay un tema que se llama la "selectividad", lo ideal es que por cada valor clave de la tabla maestro haya una distribución de registros en la tabla detalle, por ejemplo, un campo "empleado"."codigo_ciudad" podría tener esa distribución, pero un campo "cliente"."sexo" no lo tendria porque por cada sexo ('M'masculino,'F'emenino, 'I'ndeterminado (se presentan algunos casos donde al bebe no se le puede dictaminar su sexo, caso hermafrodita)) la distribucion de registros es 50% y 50%, una llave foránea en este caso puede ser una mala decisión y consultas cuya clausula where hagan referencia a este campo no serían tan eficientes. Una solución es crear una tabla para conservar este tipo de valores, en algunos casos utilizo algo como esto:
y se crean triggers para el caso "cliente"."sexo" que verifiquen la existencia de valores en esa tabla. En lo personal, si una lista de valores que puede contener un campo es menor o igual que 20 datos los mando a la tabla anterior, si es mayor de 20 lo mando a una tabla y le creosu respectiva llave foránea. Para ampliar la cosa tendriamos que irnos al campo de las desnormalizaciones pero saldriamos del interes de este hilo.
__________________
Luis Fernando Buelvas T. |
|
#3
|
|||
|
|||
|
Hay una página que sigo desde hace muchos años dela cual he aprendido muchísimo, su formato no es muy bonito pero su contenido es la más alta calidad.
http://www.tdan.com/ Esta publicación es mensual, pueden entrar a "Search" para consultar artículos. Hay buenas referencias para diseño de bases de datos, normalización y desnormalizacón.
__________________
Luis Fernando Buelvas T. |
|
#4
|
||||
|
||||
|
Cita:
![]() Cita:
Con cada clave foránea que se añade la probabilidad de que exista un ciclo aumenta... y déjame decirte que en términos estadísticos por cada 2 claves foráneas en una tabla pueden llegar a esperarse 1 ciclo. Para tu ejemplo, es posible esperar cerca de 4 potenciales ciclos entre esas dos tablas y otras restantes. Cita:
Un mal diseño es un mal diseño, y no hay integridad que se salve de ésto. Se puede tener males diseños aún con pocas claves foráneas e incluso logrando un diseño lo más simple posible en donde en promedio las tablas "detalles" sólo cuenten con 1 clave foránea. Y también se pueden tener malos diseños con tablas con más de una clave foránea. Pero es mucho más fácil meter las dos patas cuando tenemos más relaciones y más claves foráneas entre menos tablas. No pasa tanto por la perfomance sino de un adecuado equilibrio de normalización de la base de datos. La teoría de integridad referencial es una teoría fuerte y funciona a la perfección... que una tabla esté tan múltiple relacionada llevará a que el motor aplique controles redundantes y que se ramificarán por las tablas dependientes, y si... afectará a la perfomance... aunque a nuestros ojos sabiendo el poder de Firebird nos resultará, en ocasiones, despreciable. ¿Si la teoría satisface un adecuado vínculo con una clave es necesario añadir otras más, con otras entidades, y que éstas también lleven a la peligrosidad de llevar hacia un ciclo de dependencia mutua? El ejemplo que expones a mi modo de ver es para un caso de desnormalización que de normalización. Los casos de desnormalización, como bien lo indica su nombre salen de los esquemas normales y si hay que llevarlo a la práctica debe ponerse en su debido equilibrio. El ejemplo que pones invita a pensar a romper las reglas normales... re-adaptando el diseño es posible eliminar entre un 1/3 y la mitad de todas las claves foráneas de esa tabla. Aún así, los casos para el común de los mortales las reglas normales son más que suficientes y garantizan una actividad mucho más llevadera, sana, simple y segura. Cita:
Para la gran amplísima mayoría de las situaciones y las actividades cotidianas en donde se requiera de bases de datos con el esquema basado en las claves foráneas (las justas y necesarias) y las reglas de integridad referencial se consigue un diseño robusto, estable y seguro. No creo que Holger Klemt esté en contra de las claves foráneas... si las claves foráneas no fueran útiles, como lo parecieras vender la idea, hace tiempo que se habrían eliminado y estaríamos trabajando en otros esquemas. ¿Digo no? Saludos, Última edición por Delphius fecha: 19-10-2010 a las 04:46:58. |
|
#5
|
||||
|
||||
|
Estamos hablando, supongo, de "casos normales", y lo normal es usar una clave foránea, pongamos un simple ejemplo:
tabla personas (idPersona, nombre, domicilio, pais, sueldo); tabla paises (idPais, nombre); Lo normal es que exista una relación entre idPais (tabla paises) y pais (tabla personas). Nos evitamos asignar una persona a un país inexistente, nos evitamos borrar un país que tiene asignado alguna persona, etc. eso es lo normal, ¿o acaso estamos hablando de otra cosa y no me he enterado? ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#6
|
||||
|
||||
|
Llaves foráneas utilizando disparadores ...
Señores:
Trato de contestar (en forma apretada) a todos los compañeros. Cita:
Cita:
Cita:
Cita:
, ¿donde está la línea divisoria entre los "casos normales" y los que no lo son. Permíteme abundar en esto, hace algún tiempo un compañero del foro preguntaba sobre la necesidad de tener un campo computado pero que al mismo tiempo fuera como un procedimiento almacenado. Tal vez les sorprenda a algunos (tal vez no), pero se puede hacer que un campo computado sea el resultado de un procedimiento almacenado (comprobado hasta la versión 2.1, no se si se pueda hacer en la 2.5). Bueno, no se si esto resolvía el problema del compañero, pero bajo tu óptica (y la de algunos otros compañeros del foro), no lo podríamos utilizar porque no es una solución "normal", aunque esto nos resolviera el problema (ojo, mis preceptos al momento de diseñar la base de datos es que primero está la seguridad y la estabilidad y después viene el desempeño), es decir todo lo demás es válido teniendo como base estos preceptos (con esto no quiero decir que las cosas se hagan de esta manera, lo que quiero decir es que esto me ha funcionado a mi y a lo mejor le podría ser útil a alguién mas) . Menciono otro caso: ¿cuantos de nosotros (hablando a nivel foro) ha utilizado el RDB$DB_KEY para hacer actualizaciones masivas [mas de 200 mil registros] en tablas maestro detalle? Lo "común" (cambiando el término propositivamente por el de "normal"), es utilizar lo que todos nosotras ya sabemos hacer. Sin embargo, esta herramienta es una maravilla y, en nuestro caso, nos permitió bajar el tiempo de ejecución de una actualización de 2:09 hrs a 7 segundos. Por último, el utilizar llaves foraneas de tiempo parcial utilizando disparadores (creo que es la mejor solución a la que ha llegado Holger Klempt y un servidor por separado, aunque les puedo asegurar que la solución que él va a presentar será mucho mas elegante y robusta), es obvio puesto que él es un viejo zorro de mar (expresión que nosotros utilizamos para decir que alguíen es poseedor de una gran y basta experiencia), y yo soy apenas un pobre aficionado. Por cierto, permítanme explicar un poco mas: al desactivar las llaves foraneas en forma temporal solo cuando uno lo desee (al principio las habíamos eliminado, sin embargo despues nos percatamos que se pueden solo desactivar y con esto no perdiamos ningún de las grandes beneficios que éstas nos otorgan), se traduce en gran beneficio en inserciones, actualizaciones y eliminaciones masivas, sin que esto perjudique o afecta de otra manera a nuestra base de datos. Con todo lo anterior contesto de forma implicita a Neftali y a todos los demás. Bueno es todo por el momento, espero que nada de esto sea un debate inutil. Tambien espero que algunos se animen a probar otras técnicas de programación, aunque salgan de lo "comun" y de lo "normalmente" prestablacido (tomando siempre en cuanta los preceptos antes mencionados para evitar cualquier problema a futuro) Saludos, Gerardo Suárez Trejo Última edición por Gallosuarez fecha: 19-10-2010 a las 21:12:17. |
|
#7
|
||||
|
||||
|
Bueno, pero lo que quiero decir, aprovechando el ejemplo de Neftalí, es que no se van a quitar los frenos para que corra más.
Evidentemente, cuanto más cosas, más lento (mejor dicho: menos rápido), pero no vale la pena quitarle los frenos, ponerle ruedas de bicicleta, etc. Puestos a aumentar el rendimiento, podemos crear sólo una tabla con 3 campos y no insertar más de 10 registros, ya verás lo rápida que es la base de datos cuando se hagan consultas ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Problemas con llaves foraneas | jcrg666 | MySQL | 1 | 01-04-2010 00:41:36 |
| Maneja llaves foraneas , problemitas! | richardxxx | Varios | 1 | 07-11-2008 22:42:03 |
| LLaves foraneas... | Luis Castillo | SQL | 2 | 13-11-2005 18:45:34 |
| Llaves Foraneas | RainFall | MySQL | 1 | 26-07-2004 04:19:28 |
| Llaves foraneas en BDD distintas | StartKill | Firebird e Interbase | 7 | 31-01-2004 01:14:01 |
|