Relaciones entre tablas

Iniciado por Tlecoatl, 23 Abril 2011, 06:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Tlecoatl

Hola! hace un poco tiempo unos me comentaron que para hacer una relacion de uno a muchos se podria utilizar una tabla intermedia basada en los ids de las tablas a relacionar:

La tabla cliente se relaciona con la tabla telefono con la llave foranea de esta.

En el ejemplo que me exponian estas tablas se relacionaban con una tercera...

CLIENTE con su id--------------TABLA INTERMEDIA con dos columnas ID CLIENTE y ID TELEFONO-----------------------y la tabla TELEFONO con su id...

me comentaron que esto permitia hacer consultas un poco mas rapido...pero aun no termino de comprenderlo.....

Si alguien me pudiera explicar, o poner un ejemplo lo agreadeceria mucho. Gracias ;)

Kase

consultas mas rapido no
si tienes los sig
cliente  60 datos
telefono 120 datos
telefonocliente 100 datos

un select * from cliente, telefono,telefono cliente
tendria que multiplicar 60 x 120 x 100

si tubieras solo
cliente 60
telefono 60
tendrias que multiplicar solo 60 x 60

la diferencia es que
el primer modelo te permite que un cliente tenga varios telefonos o  varios clientes tengan un solo telefono

el segundo  modelo te limita  dependiendo de donde esta la clave foranea : por ejemplo si la clave foranea esta en telefono, un telefono acepta un cliente, pero un cliente puede tener varios telefonos,
y alrreves con la clave foranea en cliente, un cliente solo puede tener un telefono pero un telefono puede tener varios clientes

asi que no te complikes la existencia y usa el primer modelo

telefono x cliente x telefonocliente

donde
telefono {idtelefono primary key, mas datos}
cliente {idcliente primarykey, mas datos}
telefonocliente{idtelefono clave foranea, idcliente clave foranea}

y la consulta te keda algo asi como

Citarselect *
from telefono, cliente, telefonocliente
where  telefono.idtelefono = telefonocliente.idtelefono
and cliente.idcliente = telefonocliente.idcliente

si no recuerdo mal, puede expresar un natural join si tienen los mismos nombres. pero asi como te lo exprece no puedes errarle..

y es posible optimizar consultas con consultas anidadas =p
eso me lo enseño un maestro que tiene doctorado en bases de datos
pero no es para mortales

Tlecoatl


Novlucker

#3
La pregunta es, ¿tendrás teléfonos que no serán de clientes? Porque si la respuesta es no, entonces tendrás dos tablas y no tres

Por otra parte, muchos desaconsejan el uso de NATURAL JOINS, ya que sin querer puedes terminar con el producto cartesiano de las tablas

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

cassiani

Buena explicación la de Kase, esa tabla intermedia lo que te permite es crear una relacion de muchos a muchos entre las dos tablas.

No es necesaria la tabla intermedia si rigurosamente tu caso es:
muchos clientes comparten un mismo número de telefono.. o muchos números de teléfonos seran usados por un mismo cliente.

Si el caso es que muchos clientes pueden usar diferentes números de teléfonos, ya la relación sería de muchos a muchos.

[u]nsigned

No se si viene la caso, pero por que no agregar 'telefono' como un campo a la tabla cliente?  :P

Si la relacion es 1:1 simplemente declaras el campo 'telefono' como UNIQUE.

Saludos!!

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

Novlucker

CitarHola! hace un poco tiempo unos me comentaron que para hacer una relacion de uno a muchos se podria utilizar una tabla intermedia basada en los ids de las tablas a relacionar:

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Nakp

eh? de uno a muchos con una tabla extra? eso es de muchos a muchos como si un cliente tuviese varios telefonos y un telefono le perteneciera a varios clientes :P asi que no :xD te han engañado jaja
Ojo por ojo, y el mundo acabará ciego.