Bases de Datos - como no utilizar una clave foranea

 
Vista:
sin imagen de perfil

como no utilizar una clave foranea

Publicado por Leone (4 intervenciones) el 17/11/2015 18:51:29
Hola gente, tengo una duda simple sobre BDD's

Tengo una BDD con una relacion recursiva, es decir una entidad q se relaciona con ella misma.

Las cardinalidades de esa relacion son (1;0-1) es decir 1 a 1 opcional...

Como la relacion es 1 a 1 estoy buscando la manera de poner la clave foranea dentro de la misma tabla.

El problema es la "opcionalidad", cuando una fila nos e relaciona con otra fila, no puedo poner "null" en la clave foranea, obviamente no me lo permite, como puedo hacer?

Se me ocurren 2 maneras, pero ninguna termina de convencerme, cual es la correcta?

1) agregar una fila a la tabla que me represente el caso q no hay relkacion

2) hacer una tabla aparte para definir las relaciones

Saludos!
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
Imágen de perfil de xve
Val: 93
Bronce
Ha mantenido su posición en Bases de Datos (en relación al último mes)
Gráfica de Bases de Datos

como no utilizar una clave foranea

Publicado por xve (107 intervenciones) el 18/11/2015 08:57:11
Hola Leone, la verdad es que las claves foraneas son para ello, para que no estén vacías...

Algunas veces que me he encontrado con el mismo problema, lo que he hecho ha sido quitar la clave foranea, pero manteniendo la variable vinculante...

por ejemplo si tenemos dos tablas...

tabla 1
id
....

tabla2
id
id_tabla1

el id_tabla1, es un campo de la tabla2, pero no es una clave foranea...

No se si me he explicado bien... coméntanos, ok?
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
sin imagen de perfil

como no utilizar una clave foranea

Publicado por Leone (4 intervenciones) el 18/11/2015 20:20:19
Gracias loco, ya lo solucion, me parece q la manera mas "teoricamente correcta" es:

Tratar a las relaciones opcionales que generan estos problemas, como relaciones N a N

casi todas generan problemas, excepto 1 a 1, opcional de un solo lado (creo)

Saludos! y gracias por la respuesta
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

como no utilizar una clave foranea

Publicado por L (187 intervenciones) el 19/11/2015 19:34:16
Saludos...

Ese es uno de los casos que planteo cuando doy clases de bases de datos...

Cuando y como tener una relación intrínseca en la misma tabla...
Por supuesto la relación solo puede ser 1 a 1 y lo explico de esta manera...

Suponiendo que tengas una tabla de personas y deseas saber quienes son los padres de esa persona...

tienes que crear una relación intrínseca para esto, una clave foranea es el padre y otra clave foranea sería la madre...

es decir HAY DOS (2) RELACIONES haciendo dos claves foraneas y DOS (2) COLUMNAS PARA LOS DATOS (padre y madre)...

por supuesto... si la persona es huérfano de padre o madre o de ambos las columnas tendrán valor nulo, es decir,
debe aceptar tener valor nulo las columnas.

espero haberme explicado...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

como no utilizar una clave foranea

Publicado por Leone (4 intervenciones) el 19/11/2015 20:13:39
Te explicaste a la perfeccion, se nota q sos un buen profesor. El problema es que si intento dejar nula una de las claves foranes me tira error... es como q si o si tienen q referenciar a algo... Se me ocurria insertar una fila "vacia" para referenciar en lso casos donde no hay relación, pero no me parece correcto
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

como no utilizar una clave foranea

Publicado por Leopoldo Taylhardat (187 intervenciones) el 19/11/2015 20:20:29
Saludos...

No sé con cual BD trabajas, pero en Sql Anywhere (sybase) que es mi base de datos preferida
ya que he logrado muchas cosas que no he podido con otras, me permite tener claves foráneas nulas
(se definen como NO MANDATORIAS)...

puedes intentar de esta manera...
crear la columna primero y definirla que tenga posibilidad de valor nulo, y luego haces la creación de la clave foránea...

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

como no utilizar una clave foranea

Publicado por Leone (4 intervenciones) el 19/11/2015 22:14:45
Trabajo con MySQL, no se si se puede hacer eso con este motor. Lo que sí se, es q si creo la columna y luego agrego una constraint para hacerla clave foranea, el "alter table add constraint foreign key..." me da error si la columna tiene nulos (el mismo error q si la columna tiene datos q la tabla padre futura no tiene).

El problema lo solucione suponiendo q la relacion es 0..N a 0..N, e internamente (en el programa java) me aseguro de que la relación sea 0..1 a 0..1 (no permitiendo relacionar mas de 1 vez a cada elemento)

Cree una 3ra tabla representando la relacion, con las claves primarias de las tablas que quiero relacionar. La idea es correcta? o es algo desprolijo?

Muchisimas gracias por tu tiempo!!
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

como no utilizar una clave foranea

Publicado por Leopoldo Taylhardat (187 intervenciones) el 20/11/2015 20:28:16
Saludos...

Hay un dicho que dice.... a falta de pan, buenas son tortas...

Es una forma de solucionar la situación, no es mala la idea ya que el gestor por lo que explicas no te permite otra solución.

Suerte...
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