SQL Server - Campo llave de tablas con el mismo nombre

 
Vista:

Campo llave de tablas con el mismo nombre

Publicado por Arnoldo Martinelli (2 intervenciones) el 10/10/2008 06:13:57
Saludos amigos!

Quisiera obtener ayuda sobre la siguiente situación: En una base de datos, de SQL Server 2005, existen alrededor de 6 tablas cuyo nombre de la llave primaria es el mismo en todas, esto se hizo con el fin de que a la hora de relacionar dichas tablas (en otra tabla) no se tuvieran que crear 5 campos nulos (uno por cada llave de estas) a la hora de crear una nueva tupla, ya que esta tabla, donde se relacionan, tiene un crecimiento exponencial. Otro dato, a la hora de crear la tabla de relación se crean 6 llaves foráneas (evidentemente). Ahora bien, resulta que en el momento de insertar datos en la tabla de relación se produce un error de verificación de existencia de una de las llaves foráneas, es decir, el sql verifica que el código introducido exista en la tabla cuya llave foránea es la primera que se insertó al crear la tabla de relación (en consecuencia lo hará con todas, en el orden de inserción de las llaves foráneas, hasta dar con la que si posea este código).

Una posible solución es eliminar las relaciones de estas tablas y dejar el campo que representa la llave primaria de las mismas, sin embargo, esto trae como consecuencia de que se puede perder la integridad de la BD, ya que a este nivel se podría insertar datos falsos o erróneos, no sucede así a nivel de aplicación.

La pregunta es, existe alguna forma en que se pueda verificar la existencia de ese valor en alguna de las tablas a la hora de insertar, esto a nivel de BD, sin que se usen Triggers (ya que su uso no es permitido)? Al tener este problema, implica necesariamente un mal diseño de la BD? Se inclumple la normalización (se requiere cumplir cona la 3ra. Forma Normal)?

Muchas gracias por la ayuda que puedan brindarme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Campo llave de tablas con el mismo nombre

Publicado por Isaias (3308 intervenciones) el 10/10/2008 19:58:22
Entiendo que hay SEIS tablas y que en cada una de ellas existe una PRIMARY KEY con el mismo nombre en las seis.

Hasta ahi me queda claro.

Lo que no entiendo es eso de las relaciones, ¿Son relaciones entre ellas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Campo llave de tablas con el mismo nombre

Publicado por Arnoldo Martinelli (2 intervenciones) el 11/10/2008 19:33:22
Ok, primero que nada muy agradecido con Isaias por el interés mostrado.

Te explico, existe una tabla donde se relacionan todas (las seis tablas mencionadas), por ejemplo, tenemos las seis tablas: T1, T2, T3, T4, T5 y T6, cada una posee su Primary Key, el cual, en las seis tablas se llama IdTabla (el mismo nombre en las seis). Ahora bien, existe otra tabla denominada T7 que se relacciona con cada una de las seis tablas, esto lo hace por medio de una relación (otra tabla) denominemosla TR, ante esta situación, la PK de T7 se encuentra dentro de TR (como llave foránea) y la PK de las tablas T1, T2, T3, T4, T5 y T6 también se encuentra como llave foránea dentro de TR (este sería sólo un campo dentro de TR, debido a que se llama igual en las seis tablas), aquí es donde se inicia el problema, ya que sí por ejemplo deseo insertar una tupla dentro de TR relacionando T7 con la tabla T3, el sql va a verificar la existencia de la FK de T3, pero verifica dicha existencia primero en T1 y luego en T2, evidentemente se está cayendo al verificar en T1, pues el valor de esta FK no se encuentra dentro de dicha tabla (sólo estaría en T3, pues es la que deseo relacionar). Esto se pensó así, pues como mencioné la tabla TR posee un crecimiento exponencial y si las tablas T1, T2, T3, T4, T5 y T6 tuvieran el PK con un nombre distinto, implica que dentro de TR existan seis campos, de los cuales 5 serían nulos, esto por tupla y si se dice que Tr posee un crecimiento exponencial, con el tiempo se estaría desperdiciando mucho espacio.

Ante esto, sé que una posible solución sería eliminar las relaciones de las seis tablas con TR, en su lugar se ingresa un atributo, dentro de TR, quer sirva para almacenar el valor de la llave de alguna de las seis tablas. El problema de esta solución es que se pierde integridad referencial a nivel de BD, pues algún malicioso podría introducir una tupla con información falsa (específicamente este campo). También creo serviría crear un Trigger de inserción, para que verifique la existencia de este atributo dentro de alguna de las seis tablas, sin embargo, este no se puede crear, por disposiciones administrativas. Entonces, mi duda es si existe alguna otra forma de poder relacionar estas seis tablas en TR, pero manteniendo el Pk con igual nombre, o bien, alguna forma de verificar la existencia del valor de es PK dentro de alguna de las seis tablas, a la hora de insertar?

Muchas gracias por la ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Campo llave de tablas con el mismo nombre

Publicado por Isaias (3308 intervenciones) el 13/10/2008 19:10:18
Te agradezco al ampliacion de tus relaciones, pero sigo sin entender, ¿si me mandaras el script de creacion de tus tablas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar