Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Es correcto una FK con valores NULL?

Estas en el tema de Es correcto una FK con valores NULL? en el foro de Mysql en Foros del Web. Buenas, Me gustaría saber si es correcto que tenga una tabla user_personal que tiene una FK hacia la tabla provincias con campos NULL (sin valor) ...
  #1 (permalink)  
Antiguo 06/10/2010, 13:56
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Es correcto una FK con valores NULL?

Buenas,

Me gustaría saber si es correcto que tenga una tabla user_personal que tiene una FK hacia la tabla provincias con campos NULL (sin valor)

La cuestión es que para registrarse en la web no es obligatorio indicar la provincia, (sí el pais) por lo que muchas veces la provincia de la tabla user_personal deberá estar vacio/NULL sin ninguna relación.



Es posible? está mal diseñado? aparece un circulo en la linea de relación que une las dos tablas...

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 06/10/2010, 14:02
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Es correcto una FK con valores NULL?

No estoy 100% seguro eh, pero yo diria que NULL es como un valor más, MYSQL no tendrá problema a la hora de crear el indice y "agrupar" los NULL como si fuese otro valor cualquiera.

Obviamente esto en indices secundarios, sino se lia parda xD
  #3 (permalink)  
Antiguo 06/10/2010, 14:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Es correcto una FK con valores NULL?

Si es posible. Y para tu caso me parece un buen diseño.

Mira esto
http://dev.mysql.com/doc/refman/5.0/...nstraints.html
en la parte donde se puede establecer la propiedad set null al momento de declarar la constraint.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 06/10/2010, 14:24
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Es correcto una FK con valores NULL?

Cita:
Iniciado por huesos52 Ver Mensaje
Si es posible. Y para tu caso me parece un buen diseño.

Mira esto
http://dev.mysql.com/doc/refman/5.0/...nstraints.html
en la parte donde se puede establecer la propiedad set null al momento de declarar la constraint.

saludos
Leyendo la doc, no me queda del todo claro como debo actuar :S

"InnoDB rechaza cualquier operación INSERT o UPDATE que intente crear un valor de clave foránea en una tabla hija sin un valor de clave candidata coincidente en la tabla padre"

Pero luego dice

"SET NULL: Borra o actualiza el registro en la tabla padre y establece en NULL la o las columnas de clave foránea en la tabla hija. Esto solamente es válido si las columnas de clave foránea no han sido definidas como NOT NULL. MySQL 5.0 soporta tanto ON DELETE SET NULL como ON UPDATE SET NULL"

Debo definir la tabla user_preferencias asignandole el set null??

Esta es mi definición actual, la debería cambiar según la doc de mysql?

Código SQL:
Ver original
  1. CREATE TABLE `tbl_user_personal` (
  2.   `user_id` INT(10) UNSIGNED NOT NULL,
  3.   `user_name` VARCHAR(30) COLLATE utf8_spanish_ci NOT NULL,
  4.   `user_mail` VARCHAR(45) COLLATE utf8_spanish_ci NOT NULL,
  5.   `user_birthday` DATE NOT NULL,
  6.   `user_sexo` CHAR(1) COLLATE utf8_spanish_ci NOT NULL,
  7.   `user_pais` SMALLINT(5) UNSIGNED NOT NULL,
  8.   `user_provincia` INT(10) UNSIGNED DEFAULT NULL,
  9.   KEY `fk_user_personal_user` (`user_id`),
  10.   KEY `fk_user_pais` (`user_pais`),
  11.   KEY `fk_tbl_user_personal_tbl_provincias1` (`user_provincia`),
  12.   CONSTRAINT `fk_user_personal_user` FOREIGN KEY (`user_id`) REFERENCES `tbl_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  13.   CONSTRAINT `fk_user_pais` FOREIGN KEY (`user_pais`) REFERENCES `tbl_paises` (`pais_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  14.   CONSTRAINT `fk_tbl_user_personal_tbl_provincias1` FOREIGN KEY (`user_provincia`) REFERENCES `tbl_provincias` (`provincia_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

Muchas gracias de antemano
  #5 (permalink)  
Antiguo 06/10/2010, 14:29
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Es correcto una FK con valores NULL?

el apartado que te dije leyeras, era para que te dieras cuenta que esto es soportado siempre y cuando el campo sea declarado como null.

si un usuario no pone una provincia que corresponda, puedes enviarle un null y no hay problema. Lo del borrado o actualizada ya es decisión tuya.

otra opción, es tener un registro con codigo que se llame 'No asignado' y cuando el usuario no diligencie dicho campo, por defecto tome este valor que está previamente localizado en la tabla.

se entiende?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 06/10/2010, 15:16
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Es correcto una FK con valores NULL?

Cita:
Iniciado por huesos52 Ver Mensaje
el apartado que te dije leyeras, era para que te dieras cuenta que esto es soportado siempre y cuando el campo sea declarado como null.

si un usuario no pone una provincia que corresponda, puedes enviarle un null y no hay problema. Lo del borrado o actualizada ya es decisión tuya.
Buenas huesos52,

Si estoy en lo cierto (sino corrígeme por favor) tal y como la tengo ahora ya le envía el NULL gracias a esta declaración no?
`user_provincia` int(10) UNSIGNED DEFAULT NULL,

no tengo que tocar nada más no?


Respecto a esta opción:

Cita:
Iniciado por huesos52 Ver Mensaje
otra opción, es tener un registro con codigo que se llame 'No asignado' y cuando el usuario no diligencie dicho campo, por defecto tome este valor que está previamente localizado en la tabla.
se entiende?
Creo que te refieres a que a esta declaración

`user_provincia` int(10) UNSIGNED DEFAULT NULL,

En lugar de poner DEFAULT NULL ponga "No asignado", pero la declaración de esta columna es un INT. Por lo que entiendo que se trataría de tener un registro en la tabla provincia llamado "No asignado" por ej con el provincia_id XX
y en la declaración poner

`user_provincia` int(10) UNSIGNED DEFAULT XX,

Muchas gracias de antemano
  #7 (permalink)  
Antiguo 06/10/2010, 15:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Es correcto una FK con valores NULL?

Correcto.

Lo que te digo del no asignado, es que puedes tener un codigo (999 por ejemplo) que siempre se relacione a aquellos valores que no son llenados y que al ser encontrados, se entienda que es un valor para aquellas llaves que no tienen designado una provincia.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 06/10/2010, 15:49
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Es correcto una FK con valores NULL?

Cita:
Iniciado por huesos52 Ver Mensaje
Correcto.

Lo que te digo del no asignado, es que puedes tener un codigo (999 por ejemplo) que siempre se relacione a aquellos valores que no son llenados y que al ser encontrados, se entienda que es un valor para aquellas llaves que no tienen designado una provincia.

saludos
Muchas gracias huesos52

Creo que escogeré la opción de establecer un código para la opción de ninguna provincia seleccionada, en lugar de dejar la FK nula.

Etiquetas: correcto, null
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:59.