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

Relacion uno a uno

Estas en el tema de Relacion uno a uno en el foro de Mysql en Foros del Web. Hola gente!! ¿¿Como puedo hacer una relación 1 a 1?? Os cuento mi diagrama de base de datos un poco simplificado. Tengo una tabla Repartidor,otra ...
  #1 (permalink)  
Antiguo 17/04/2009, 15:28
 
Fecha de Ingreso: abril-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Relacion uno a uno

Hola gente!!

¿¿Como puedo hacer una relación 1 a 1?? Os cuento mi diagrama de base de datos un poco simplificado. Tengo una tabla Repartidor,otra Posición GPS y otra DirecciónDestino. Quiero relacionar:

- 1 a 1 Repartidor con PosicionGPS
- 1 a 1 DirecciónDestino con PosicionGPS

Me han comentado que ponga claves foráneas a ambos lados de la relación 1 a 1. Es decir,qe haga lo siguiente:

Repartidor... id_repartidor,id_posiciongps

DireccionDestino.... id_direccionDestino,id_posicionGPS

Hasta aquí tendría relaciones 1 a N. Para hacer de 1 a 1:

PosicionGPS: id_posiciongps,id_direcciondestino,id_repartidor

Lo que me choca de esto es que en PosicionGPS,va a estar vacío o id_direcciondestino o id_repartidor... Por ello,no se si hay alguna otra forma de hacer esto...Algo como hacer que id_posiciongps no pueda repetirse en Repartidor y en DireccionDestino.

Alguien sabe cómo hacer esto,o si voy bien encaminada??

Muchas gracias y saludillos
  #2 (permalink)  
Antiguo 17/04/2009, 16:23
 
Fecha de Ingreso: noviembre-2004
Mensajes: 92
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Relacion uno a uno

¿y por que no usas una sola tabla?
  #3 (permalink)  
Antiguo 17/04/2009, 16:45
 
Fecha de Ingreso: abril-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Respuesta: Relacion uno a uno

Hola y antetodo gracias por responder . Hombre,una sola tabla podría hacer,pero quedaría bastante peor estructurado. Es decir,en el caso qe he propuesto podría añadir latitud y longitud (atributos de PosicionGPS) a DireccionDestino y a Repartidor. Pero tengo otras tablas con bastantes atributos (x ejemplo DatosPersonales del Repartidor),que si los metiera en Repartidor haría de la BD un embolao difícil de manejar...

De veras no hay alguna forma de hacer relaciones 1 a 1??
  #4 (permalink)  
Antiguo 17/04/2009, 20:43
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Relacion uno a uno

Hola
Si deseas hacer una relación 1:1 declara al campo id_posiciongps con la propiedad unique, esto hará que los valores del campo no se repitan.

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #5 (permalink)  
Antiguo 18/04/2009, 20:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Relacion uno a uno

Si lo que deseas es etablacer una relación 1:1 entre dos tablas la regla de transformación es simple: En una relación 1:1, una de las tablas lleva un campo FK referido a la PK de la otra tabla.
¿Cuál lleva la FK y cuál es la PK. Bueno, precisamente la regla dice que en el caso de la relación 1:1 eso es indistinto. Puedes ponerlo en cualquiera, mientras no lo pongas en las dos al mismo tiempo (no tienes idea de cuántos lo hacen y luego se encuentran que no pueden borrar registros de ninguna tabla...).
La idea sería que la PK será siempre la tabla más importante, y la FK la llevará la tabla que conceptualmente sea dependiente. Un ejemplo sería Persona - Documento. Lo primordial aquí es la Persona, que sólo puede tener un documento y un documento debe pertenecer a una sola persona. La FK debe ir en Documento, porque jerarquicamente una entidad Persona es siempre más importante. ¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 20/04/2009, 09:30
 
Fecha de Ingreso: abril-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Respuesta: Relacion uno a uno

Gracias chicos por vuestras respuestas.

<Genetix> creo qe es la opción más sencilla que tengo. ¿¿Pero cómo selecciono que la columna sea Unique??

<gnzsoloyo> no te entiendo muy bien. Lo que me comentas creo que es más para hacer una relación 1 a N,no? Porque Cómo haces que la FK no pueda repetirse en la tabla de referencia,por mucho que en su tabla de origen sea la clave principal y no pueda repetirse en ella?

saludos y gracias
  #7 (permalink)  
Antiguo 20/04/2009, 10:16
 
Fecha de Ingreso: abril-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Respuesta: Relacion uno a uno

<Genetix> Gracias,creo que ya he encontrado la opción Unique no estaba demasiado escondida jejeje...

Resumo lo que hay que hacer por si puede ser de utilidad xara otros:

1º Crear una foreign key en tu tabla y asociarla a la tabla de referencia correspondiente. En mi caso,en Repartidor he creado una nueva columna id_posiciongps y he añadido una foreign key,llamada FK_repartidor_1. Como tabla de referencia de la foreign key seleccionaría posiciongps (en Column escribo id_posiciongps,que es el campo que acabo de crear,y en Ref_Column selecciono id_posiciongps,que es la que procede de la tabla posiciongps).

2º Una vez creada la foreign key,seleccionamos la pestaña Indices,justo al lado de Foreign key. Seleccionamos nuestra foreign key (FK_repartidor_1 en mi caso) y en Index Kind seleccionamos UNIQUE.

Como resultado,tenemos en Repartidor una foreign key (id_posiciongps) cuyo valor no puede repetirse. De esta forma cada repartidor queda relacionado unívocamente con una posiciongps.

Saludos y gracias

nadiuskiss

PD: me han comentado que también era posible creando un "Trigger",aunqe no lo he probado
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 17:02.