Вы находитесь на странице: 1из 19

Nuevo Curso de Vuejs 2 Avanzado con Vuex y AdonisJs 4 Acceder ahora

+

 Uno de piera
¿Qué estás buscando?     

 Menu 

Home  Mysql  Relaciones en mysql

 Mysql, Programación Web

Relaciones en mysql
 Israel965  4 Años Ago

 FACEBOOK      

Vamos a ver lo sencillo que puede llegar a ser crear relaciones entre tablas en mysql correctamente y
saber obtener los datos de cada una de forma sencilla. En los tutoriales sobre ORMS con laravel y
codeigniter pudimos ver todos los tipos de relaciones.

Saber manejar correctamente las relaciones de una base de datos es algo fundamental para un
programador, si este trabajo no es llevado a cabo de forma correcta, seguramente cuando la aplicación
crezca lo pagaremos con creces, así que no es mala idea invertir un tiempo en aprender todo lo que
podamos al respecto.

Entendiendo las relaciones en mysql


Qué mejor que ver todos los casos posibles de relaciones que se nos pueden dar para terminar de
entenderlos de forma sencilla.

Relaciones de uno a uno


Estas relaciones existen por ejemplo en el caso de una persona y su dni, una persona sólo puede tener un
dni, y un dni sólo puede pertenecer a una persona.

Para llevar a cabo esta relación en nuestra base de datos simplemente debemos crear nuestra tabla
usuarios y nuestra tabla dnis, para hacer referencia al dni de cada usuario nos basta con crear un campo
en la tabla dnis el cuál actuará como clave foránea haciendo referencia al usuario a través de su id.

Relaciones de uno a muchos


El ejemplo perfecto para estas relaciones es entre usuarios y posts de un blog, un usuario puede tener
muchos posts, pero un post sólo puede pertenecer a un usuario, sirve lo mismo que en la relación de uno a
uno. La única diferencia entre estas dos relaciones en este aspecto, es que la clave foránea entre usuarios
y dnis puede estar tanto en la tabla usuarios con un campo id_dni como en la tabla dnis con un campo
id_usuario.

En cambio, en una relación de uno a muchos la clave foránea siempre debe estar en la tabla que hace la
relación de muchos, en este caso sería la tabla posts.

Relaciones de muchos a muchos


Este tipo de relaciones vienen a ser las más complicadas, aunque realmente no lo son, para el ejemplo
podemos decir que la relación entre usuarios y peliculas(alquileres de un videoclub), un usuario puede
alquilar muchas películas, y una película puede ser alquilada por muchos usuarios.

Estas relaciones no pueden ser llevadas a cabo con simples claves foráneas ya que necesitaríamos una
por cada registro, cosa completamente inviable. Para este tipo de relaciones debemos crear una tercera
tabla, conocida como tabla pívote, que por convención su nombre suele ser usuarios_peliculas para
nuestro caso, es decir, los nombres de las dos tablas separados por guiones.

Estas tablas deben contener como mínimo dos campos, usuario_id y pelicula_id que harán referencia a las
claves primarias de sus respectivas tablas.

La función de esta tabla es la de poder enlazar a los usuarios y las películas a través de sus claves
primarias, es decir, si tenemos un usuario con id 1 y una película con id 120 en sus respectivas tablas, para
poder unirlos, deberíamos crear un nuevo registro en la tabla usuarios_peliculas con esos datos.
Para tenerlo más claro, veamos un sencillo diagrama sobre las relaciones de las que hemos hablado y
como debemos interpretarlas en nuestra base de datos.

Para ver correctamente el diagrama pulsa sobre la imagen.

Normalización
Un proceso interesante en lo que re ere a la normalización viene a ser el evitar la duplicidad de datos en la
misma tabla, si por ejemplo tenemos teléfonos jos en nuestra tabla usuarios, puede ser que éstos sean
repetidos por los mismos miembros de un misma familia, para evitarlo, es recomendable crear otra tabla
por ejemplo llamada telefonos_ jos que contenga un campo id autoincremental y que sea clave primaria y
un campo teléfono que sea UNIQUE.

De esta forma, al registrar nuevos usuarios, en vez de guardar su teléfono en la tabla usuarios, lo que
haremos será comprobar si el teléfono existe en la tabla telefonos_ jos, y si no es así, crearemos el
registro en esta tabla.

Para relacionar el teléfono al usuario, deberemos crear una clave foránea en la tabla usuarios que haga
referencia a su teléfono, así de sencillo.

Consultas mysql para obtener registros


Obtener registros de uno a uno, datos y dni de un usuario.

PgSQL
1 SELECT u.nombre,u.direccion,d.numero
2 FROM usuarios u
3 INNER JOIN dnis d
4 ON u.id = d.id_usuario
5 WHERE u.id = 1
Obtener registros de uno a muchos, datos de un usuario y sus posts.

PgSQL
1 SELECT u.nombre,u.direccion,p.titulo,p.contenido
2 FROM usuarios u
3 INNER JOIN posts p
4 ON u.id = p.id_usuario
5 WHERE u.id = 1

Finalmente, para obtener los datos entre una relación de muchos a muchos debemos hacer la siguiente
consulta.

PgSQL
1 SELECT u.nombre,u.direccion,p.titulo
2 FROM usuarios u
3 INNER JOIN peliculas_usuarios pu
4 ON u.id = pu.id_usuario
5 INNER JOIN peliculas p
6 ON pu.id_pelicula = p.id
7 WHERE u.id = 1

Si te ha sido útil el post puedes utilizar los botones de las redes sociales para ayudarme con mi trabajo :D.

Si te ha parecido interesante, no lo dejes aquí


visítanos en cursosdesarrolloweb.es

Tenemos cursos sobre desarrollo web y móvil actualizados donde utilizamos las últimas
tecnologías.

 Ver los cursos disponibles

 FACEBOOK      

POSTS RELACIONADOS
Detectar links en AngularJS, el ltro Cómo añadir una carpeta helpers o
linky libraries a nuestros proyectos en laravel
4
 Israel965  14 Septiembre, 2013
 Israel965  11 Agosto, 2013

Sparks y autenti cación con oauth2 en Instalación de Python y Django en


codeigniter windows
 Israel965  13 Enero, 2013  Israel965  22 Febrero, 2014

Curso Javascript: Funciones Datatables en laravel 4


 Israel965  14 Diciembre, 2014  Israel965  6 Diciembre, 2013
Api de Twitter 1.1 en php Simpli ca tu javascript con Underscore
 Israel965  27 Diciembre, 2014  Israel965  28 Febrero, 2015

Codeigniter tiene un nuevo hogar Crear campos dinámicamente con


jquery y codeigniter
 Israel965  17 Octubre, 2014
 Israel965  27 Enero, 2013

Eventos en AngularJS, $broadcast,


$emit y $on
 Israel965  24 Enero, 2015

Habilitar el header Authorization con


htaccess
 Israel965  14 Octubre, 2016

20 COMENTARIOS

Emilio V.
Hola Israel…
Estuve probando hacer las consultas desde un modelo_pelicula_usuario.php de codeigniter y me
funcionaron todos; sin embargo cuando traté de hacer una búsqueda pasando un id de
peliculas_usuarios en una funcion, para obtener datos de las tablas usuarios y peliculas…me
parece un error en la sintaxis…
mi funcion es la siguiente:
function nd($id) {
$this->db->select(‘peliculas_usuarios.* , usuarios.nombre as nombre, peliculas.titulo as titulo’);
$this->db->from(‘peliculas_usuarios, usuarios, peliculas’);
$this->db->where(‘peliculas_usuarios.id’, $id);
$registro = $this->db->get();
return $registro->result();
}
hasta aquí funciona…pero cómo hago para obtener los datos añadiendo en el where:
and peliculas_usuarios.usuario_id = usuarios.id and peliculas_usuarios.pelicula_id = peliculas.id

israel965
Hola Emilio,
El ejemplo que te dejé en este tutorial obtiene en el segundo desplegable la
información que necesitas con la id del carro a través de la tabla pivote, espero que lo
puedas solventar, de otra forma, te recomiendo que hinques los codos con lo que te
está dando problemas, saludos y suerte.

Emilio V.
Muchas gracias!!!

israel965
No hay de que, espero que lo resuelvas sin más problemas.

samuel
buenas tardes, mira tengo un problema, como puedo hacer para que  cuando me logeo con un numero de
cédula  me cargue los datos del id de ese número, por que si le pongo where =1 solo me carga los datos
del primer id y no me carga los siguientes

israel965
Hola,
Si no me pones un poco más en contexto no puedo saber que necesitas, no sé tu
estructura de tablas ni sus relaciones.

aracesa
En este ejemplo de las pelis: tengo una consulta importante
Imagina q teniendo tus 5 tablas, tengo 2 tablas más:
tabla6 productora (con id_productora, nombre_productora) que tienen una relacion muchos a
muchos con películas, por lo q creamos otra tabla pivote:
tabla7 peliculas_productora (con id_pelicula, id_productora)

¿Podría relacionar mi tabla6 productora, con tu tabla pivote pelicula_usuario? Para obtener
directamente el id de la productora en la tabla película usuario y poder consultar más facilmente
el nombre de la productora de una peli?
Si no puedo hacer esa relación, como podría obtener una consulta para obtener tuplas usuario,
pelicula, productora ?
Gracias

verenice

buenas noches es que necesito traer los datos es que tengo una consulta que me inserta los
datos de un formulario pero en la ubicacion no necesito que me traiga el departamento y la
ciudad pero no me funciona la consulta por favor me puedes ayudar gracias te lo agradesco.
select usu.cedula,
concat(usu.primer_nombre,usu.segundo_nombre) as nombres ,
concat(usu.primer_apellido,usu.segundo_apellido) as apellidos ,
concat(vl1.nombre_valor) as gen ,
usu.telefono,usu.e_mail , pf.nombre_per l , vl.nombre_valor,
concat(ubi.id_ubicacion, ubi.nombre_ubica) AS ubica,
concat(v.nombre_ubica) as dep
from tbl_usuario as usu
inner join tbl_per l as pf on usu.per l_id=pf.id_per l
inner join tbl_valor as vl on usu.area_empresa=vl.id_valor and vl.id_valor=area_empresa
inner join tbl_valor as vl1 on usu.genero=vl1.id_valor and vl1.id_valor=genero
inner join tbl_ubicacion as ubi on usu.ubicacion_id=ubi.id_ubicacion
inner join vieubicacion as v ON ubi.depende_ubica=v.id_ubicacion WHERE ubi.depende_ubica
order by v.nombre_ubica, ubi.nombre_ubica;

israel965
Hola,
Sin saber la estructura de tu base de datos no puedo hacer nada.

alexander
con que programa general las relaciones de las tablas que se ve en la gura donde dice el texto
Para tenerlo más claro, veamos un sencillo diagrama sobre las relaciones de las que hemos
hablado y como debemos interpretarlas en nuestra base de datos.

israel965
Con workbench.

Fred
Saludos Israel.
Soy un asiduo visitante a tu página. Es la primera vez que hago un comentario y debo
agradecerte por todo el material que compartes y lo claro de tus explicaciones, he aprendido
mucho aquí.
He iniciado un proyecto usando php (Codeigniter como framework.) y mysql. La parte del
framework va bien pero no puedo decir lo mismo de la parte de mysql. He realizado un diagrama
de db con workbench pero al momento de hacer inserciones en tablas relacionadas de N:M no
se como hacerlas.
He buscado sobre el tema pero sigo sin dar con la solución a mi problema por lo que comienzo a
sospechar que las relaciones no son correctas. Paso a explicar la situación:
La aplicación necesita llevar el registro de actas penales de un destacamento militar. Del acta se
debe almacenar: el/los funcionario/s actuante/s, el scal, la procedencia, el ente que lo recibe,
el/los imputado/s, el/los cargos imputados (ellos le llaman retenciones) y otras cosas más…
Tengo las tablas funcionarios, imputados, retenciones en una relación N:M con actas. Esto me a
generado las tablas actas_has_funcionarios, actas_has_imputados, actas_has_retenciones.
Lo que no se hacer es insertar los valores en las tablas intermedias. Sé que la tabla actas
debería tener contenido antes de realizar la inserción en las intermedias.
Es más fácil si ves lo que he hecho:
Te dejo un link con la imagen del diagrama
y otro con el diagrama (Workbench), en caso de que necesites ver más detalles
¿Están correctas las relaciones con las actas? en caso a rmativo ¿cómo inserto los registros en
las tablas intermedias sin antes tener datos en la tabla actas?
Ya estoy agradecido por toda la ayuda que me has dado con tus tutoriales y lo estaré más si
puedes aclararme estas dudas de novato en mysql.

Fernando
Saludos Israel, muy buen tuto que has compartido, tengo una duda, como puedo obtener de
forma gra ca o en script la relacion entre tablas, es decir, yo deseo saber si la tablaA se
relaciona con Tabla1, Tabla2… TablaN y mediante que campos y su tipo de relación (1:1, 1:n n:1,
n:n). Gracias, espero  puedas ayudarme.

fabian
Hola tengo una pregunta y estoy muy confundido, he visto en muchos ejemplos que la tabla
muchos a muchos se realiza con la clave primaria de cada tabla sin asignarle un campo id
adicional, pero también he visto ejemplos con este tipo de relación como lo realizas en este
ejemplo en la relación muchos a muchos ¿Cual seria la mejor opción y porque? muchas graciass

israel965
Hola Fabian,
Realmente la mejor opción es crear una pk que esté formada por los dos campos de
la tabla, ningún registro se va a repetir así que es ideal, aunque ambas formas pueden
trabajar perfectamente.
Saludos.

David
Holaa
Tengo una duda demasiado grande con la relación muchos a muchos
tengo una tabla de vehículos y conductores con sus datos respectivos y una tabla pivote
(intermedia) de vehí_cond.
Con php y html cada una tiene una interfaz ejemplo: una vista para registros de vehículos y
conductores, pero la verdad no tengo experiencia ni tampoco tengo una idea clara para que
interactue la tabla pivote.
he estado pensando en colocar en la interfaz de registro de conductores un select multple que
recoga los vehículos pero la verdad no estoy muy seguro ,quedaria in nitamente agradecido si
me ayuda con una sugerencia muchas gracias por todo.

la verdad estoy muy agradecido por los tutoriales de esta página


he aprendido demasiado.
israel965
Hola David,
Te recomiendo tres formularios, uno para vehículos, otro para conductores, y otro
donde tengas dos campos de selección, uno con los vehículos y otro con los
conductores, para el ejemplo dejamos vacío el desplegable de conductores, cuando
seleccionas un vehículo en el desplegable de conductores aparecen todos aquellos
que no están relacionados con ese vehículo, una vez tengas la selección hecha
simplemente deberás guardar las ids en la tabla pívote.
Para realizar las consultas te puedes apoyar en las del ejemplo, sólo tendrás que
adaptarla a tus necesidades.

Saludos y espero que te sirva.

david
Muchisimas gracias por su aporte es de gran ayuda, lo implementare y mil gracias era un tema
que me tenia pensando mucho estos días Gracias …..

David
Holaa gracias implemente el sistema y me funciono perfectamente
pero tengo otra duda y es esta
Tengo 3 tablas una para vehículos y otra para documentos están relacionadas a través de
muchos a muchos
Vhículos tiene
(Id, placa, modelo, color, tipo, motor)
Documentos tiene
(Id, tipoDocumento)
Y la tabla pivote tiene
(id_vehi,id_doc,noDoc,fecha_exp,fecha_ven,emisor)
la tabla documentos tiene los siguentes registros
{1,SOAT…2,TARJETA OP…. 3,POLIZA…..}
Tengo una vista que realiza la inserción, actualizació, y elimina los vehículos
Pero como puedo hacer para insertar en la tabla pivote para que se relacione con los
documentos
que pena molestarlo otra vez, pero se me complica mucho a insetar en la tablas pivotes en php y
no se como hacer la vista de la tabla pivote Graciasss…

victor becerra cerdan


ola buenos tardes nesesito conectar dos tblas en mysql mediante consola una relacion de uno a
uno cual es el codigo para aserlo

NEWSLETTER UNODEPIERA

Recibe cada semana las últimas


entradas del blog y mucho más en tu
correo

Dirección de correo electrónico:

Tu dirección de correo electrónico

Suscribirme

SÍGUEME EN LAS REDES


SOCIALES

    

ANGULAR 5 + FIRESTORE

CURSO DE LARAVEL 5.5


CURSO DE CODEIGNITER 4

CURSO DE ANGULAR 2 && 4

CURSO DE IONIC 3 DESDE 0

NODE.JS Y EXPRESS.JS
DESDE 0 A EXPERTO
POSTS RECIENTES

Cambiar el
document.title en
Vuejs 2 de …
 29 Enero, 2018

Validar componentes
anidados en Vuejs 2
con …
 22 Enero, 2018

Convertir Promesas en
Observables
 21 Enero, 2018

Laravel 5 IDE Helper


 21 Enero, 2018

Desarrollar Helpers en
Laravel 5
 21 Enero, 2018

CURSO COMPLETO DE
LARAVEL 5
CURSO EXPRESS DE LUMEN 5

CURSO AVANZADO DE
LARAVEL 5 Y VUE.JS 2

CURSO DE VUE.JS 2

DESARROLLO DE
APLICACIONES CON REACTJS
APLICACIONES NATIVAS CON
REACT NATIVE

CURSO DE REACTJS Y REDUX

CURSO DE PHP 7 AVANZADO


DESARROLLO PROFESIONAL
PHP

CURSO COMPLETO DE
WORDPRESS

CURSO DE CODEIGNITER 3

CURSO DE PHALCON 3
CURSO DE TOTAL.JS

CURSO DE JQUERY
COMPLETO

CURSO DE SOCKETIO CON


NODEJS
Uso de cookies

Uno de piera Copyright © 2018.
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la
aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR

Вам также может понравиться