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

Definir tablas con relaciones many-to-many

Estas en el tema de Definir tablas con relaciones many-to-many en el foro de Mysql en Foros del Web. Buenas, estoy haciendo una base de datos para una aplicación, pero tengo una duda que no se resolver. En mi base de datos, a parte ...
  #1 (permalink)  
Antiguo 29/03/2014, 14:06
 
Fecha de Ingreso: diciembre-2008
Mensajes: 116
Antigüedad: 15 años, 3 meses
Puntos: 0
Definir tablas con relaciones many-to-many

Buenas, estoy haciendo una base de datos para una aplicación, pero tengo una duda que no se resolver. En mi base de datos, a parte de otras tablas, tengo estas 3:
Usuario, con campos como id, user, password
Rol, con id, nombre
Departamento, con id, nombre, email

Pues bien, tengo relaciones muchos a muchos entre Usuario y Rol, es decir, un Usuario puede tener varios roles, y un Rol lo puede tener varios usuarios.
También tengo la misma relación entre Usuario y Departamento. La teoría dice que debería crear 2 tablas intermedias, Usuario-Rol y Usuario-Departamento, pero con esta estructura solamente, soy incapaz de impedir que un usuario tenga 2 roles distintos en el mismo departamento.

Había pensado una tabla, con 3 campos, uno por id de las tablas, pero soy incapaz de poner las claves, ya sean UNIQUE, PRIMARY o INDEX, correctamente.

Saludos.
  #2 (permalink)  
Antiguo 31/03/2014, 01:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Definir tablas con relaciones many-to-many

El problema es este

Cita:
2 roles distintos en el mismo departamento
o

2 veces el mismo rol en un departamento?


Usuarios
idUsu
....

Departementos
idDep
....

Perfiles
idPerfil

RelUsuDepPerf
idRel
idUsu
idDep
idPerfil

Ahora debes definir un indice único compuesto de los tres identificadores (idUsu,idDep,idPerfil), idRel será la PK. Podrias no poner esa PK simple y definir una PK compuesta de los tres campos (idUsu,idDep,idPerfil), con lo que ya tendrías el indice unico. Yo prefiero la PK simple, pero el modelo relacional puro diria que es incorrecta.

https://dev.mysql.com/doc/refman/5.0...ate-index.html


Código MySQL:
Ver original
  1. CREATE UNIQUE INDEX index_usu_dep_rol ON RelUsuDepPerf (idUsu,idDep,idPerfil);

Este indice evita que alguien tenga el mismo rol varias veces en el mismo departamento pero puede tener mas de un rol en el mismo departameto, si solo se puede tener un rol en un departamento quita el tercer campo

Código MySQL:
Ver original
  1. CREATE UNIQUE INDEX index_usu_dep ON RelUsuDepPerf (idUsu,idDep);
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/03/2014 a las 01:59

Etiquetas: tablas
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 19:38.