Access - duda relacionar varias tablas

 
Vista:
sin imagen de perfil

duda relacionar varias tablas

Publicado por franxiscu (2 intervenciones) el 29/01/2017 16:12:39
Hola buenas tardes,

Tengo una duda sobre como relacionar varias tablas. Explico un poco lo que quiero relacionar:

- Tabla Usuario: nombre_usuario(clave primaria)

- Tabla Equipo: nombre_equipo (clave primaria), nombre_usuario (clave foránea que hace referencia a nombre_usuarios de la tabla Usuario)

Con esta relación, consigo que un usuario pueda tener más de un equipo.

Tabla Grupo: nombre_grupo (clave primaria)

Lo que quiero hacer es que en un grupo puedan haber muchos equipos, pero estos equipos tienen que ser de usuarios distintos, es decir, dentro de un grupo no puede haber dos equipos del mismo usuario.

Yo he pensado en hacer una relación de las tres tablas de la siguiente manera:

Tabla Equipos_grupos: (nombre_grupo, nombre_usuario, nombre_equipo). La clave primaria seria compuesta, es decir, formada por nombre_grupo y nombre_usuario (así me aseguro que un usuario no pueda tener más de un equipo en un mismo grupo). Luego lo que yo creo que tendría que hacer para controlar que el equipo de un usuario exista es hacer que nombre_equipo y nombre_usuario sea clave foránea compuesta que haga referencia a la combinación nombre_equipo y nombre_usuario de la tabla Equipo).

No se si esto sería así... pero yo lo intento relacionar en Access pero me muestra un error en el momento de crear la relación. Algún experto me puede dar su opinión?

Muchas gracias y un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

duda relacionar varias tablas

Publicado por Neckkito (1157 intervenciones) el 29/01/2017 19:08:55
Hola!

Desde mi punto de vista creo que en tu planteamiento hay varios errores de concepto. Te comento:

1.- Si tu tabla Equipo tiene la estructura que señalas automáticamente estás diciendo que el equipo será único. ¿Qué significa eso? Pues que no podrás poner dos registros así, por ejemplo,
PC / Ana
PC / Luis
Dado que en el segundo registro, al repetir PC, estarías infringiendo la clave principal. Eso te obligaría a tener que escribir el registro así:
PCAna / Ana
PCLuis / Luis
Para poder introducir esos registros.

Si damos por válida esta solución el primer campo ya te estaría creando una clave principal única, por lo que no habría necesidad de recurrir a claves compuestas.

2.- Para poder asignar, en la tabla Equipos_grupos, varios registros, necesitarías añadir un campo [Id] autonumérico para que te permitiera realizar la entrada de varios registros y poder relacionar con el resto de tablas. No hay inconveniente en crear un campo calculado para que te dé una clave compuesta, pero, ojo, bastaría con el grupo y el equipo (dado que en el punto 1 hemos dicho que el equipo, al ser único, ya llevaría implícita la identificación del usuario).

¿Qué problema tenemos? Pues que los campos calculados no tienen la propiedad de configurar valores únicos ni de permitir o no duplicados.

Eso implica que por la misma estructura de tus tablas no podrías controlar, directamente desde las tablas, la existencia o no de duplicados.

¿Qué solución tenemos? Pues que la información se debería introducir a través de formulario y controlar o no la existencia de duplicados a través de código, sirviéndose para ello o bien del valor de los campos grupo y equipo, con lo cual no necesitaríamos construir una clave compuesta, o bien a través de la clave compuesta, si la queremos tener, para ver si esa clave compuesta ya existe. En cualquier caso, insisto, el control de duplicados iría a través de código VBA.

Espero haberte podido clarificar un poco las dudas.

Un saludo,

Neckkito
http://bit.ly/neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

duda relacionar varias tablas

Publicado por Fco Javier (2 intervenciones) el 29/01/2017 19:34:17
Hola Neckkito,

Antes de nada, gracias por la respuesta!

Sobre el punto 1, es realmente lo que quiero. Quiero que cada equipo sea único (me refería a equipos de fútbol "virtuales" del tipo ligas fantásticas, etc.)

Con lo cual tendríamos la siguiente relación: Usuario 1 ---------- 0..* Equipos

De esta manera unos posibles registros serian:

user1, equipo1
user2, equipo2
user3, equipo3

Mi problema viene al querer que en cada grupo puedan haber diferentes equipos, pero que estos equipos sean de distinto usuario (es decir, un usuario no puede competir con dos equipos suyos en el mismo grupo).

De esta manera, se crearía una relación ternaria 1:1:1 entre las tablas Usuario, Equipos, Grupos, donde la clave primaria estaría formada por los atributos que forman la clave primaria de dos tablas cualesquiera (por ejemplo,nombre_usuario y nombre_grupo).

De esta manera unos posibles registros serian:

user1, grupo1, equipo1
user2, grupo1, equipo2

El problema viene es que creo que además tendría que crear una clave foránea compuesta entre nombre_usuario y nombre_equipo ya que si no, se podría dar este caso erróneo:

user1, grupo1, equipo1
user3, grupo1, equipo1

Como se puede comprobar el último registro cumple las condiciones de clave primaria (ya que user3, grupo1 es diferente que el primer registro) pero vemos que la combinación user3, equipo1 no existe en la primera relación que hemos visto (ya que equipo1 es de user1). Con lo cual, el registro lo podría añadir a la tabla cuando realmente no debería dejarlo añadir.

Esto podría controlarlo mediante la declaración de esta relación, con las claves foráneas, etc. en cualquier SGBD ya sea Access, Mysql, etc. y no por programación?

Un saludo y muchas gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

duda relacionar varias tablas

Publicado por Neckkito (1157 intervenciones) el 30/01/2017 07:41:02
Lo que pides, desde mi punto de vista, no es posible en el sentido de que se requiere, sí o sí, de una comprobación a través de otros medios (como VBA).

La relación 1:1:1 puede darse siempre y cuando conozcas, a priori, el valor del campo de relación. Es decir, que si, por ejemplo, tienes un DNI de una persona (y ese dato lo conoces a priori) puedes tener tres tablas (una para datos fiscales, otra para datos laborales y otra para datos personales) y, a través de ese DNI, se pueden establecer relaciones 1:1 sin problemas.

En tu caso no conoces la clave a priori, sino que la vas construyendo sobre la marcha al realizar la asignación de valores posibles entre los elementos implicados.

Si utilizaras un campo calculado y ese campo calculado te creara, al tiempo que construyes el registro, una clave, y se permitiera que ese campo calculado estuviera indexado sin duplicados, tu problema se solucionaría al instante. Ahora bien, como los campos calculados no permiten indexaciones esa solución ya no es válida, y la solución que queda es controlar la duplicidad o no de la combinación de valores del registro a través de sistemas alternos, pero no por infracciones de clave.

Y si intentas forzar esas relaciones, por muy lógicas que a ti te puedan parecer, lo que consigues es lo que comentabas en tu primer mensaje: obtener un error de Access.

Quizá alguien más pudiera tener un punto de vista diferente, con lo cual le agradeceríamos sus comentarios. Por mi parte, ya te he comentado cómo lo veía yo.

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Samuel
Val: 62
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

duda relacionar varias tablas

Publicado por Samuel (43 intervenciones) el 19/09/2017 01:07:57
Hola, soy programador experto en Access y VBA he desarrollado aplicaciones y bases de datos desde hace más de 10 años.

Siempre tuviste la solución, lo que te falto fue usar un indice compuesto único, el cual te permitiera introducir solo las combinaciones que tu querías que fueran validas.

Ejemplo;
Tabla: Usuarios
Campo: UsuarioId (Primarykey)

Tabla: Equipos
Campo EquipoId (PrimaryKey)

Tabla: EquiposUsuarios
Campo: EpoUserId (PrimaruKey)
Campo: EquipoId (Foreignkey)
Campo: UsuarioId (ForeignKey)
Indice Único: (EquipoId, UsuarioId)

Tabla Grupos
Campo: GrupoId (PrimaryKey)
Campo: EpoUserId (ForeignKey)

Relacion:
1. ((EquiposUsuarios AS EU INNER JOIN Equipos AS E ON E.EquipoId = EU.EquipoId) INNER JOIN Usuarios AS U ON U.UsuarioId EU.UsuarioId)

2. (EquiposUsuarios AS EU INNER JOIN Grupos AS G ON G.EpoUserId = EU.EpoUserId)

Con este tendrías tu base de datos en la tercera forma normal por lo menos, mejorando el rendimiento, mantenimiento, esca-labilidad, coherencia y integridad de datos.

Espero que esta información te haya sido de ayuda.

NOTA; Algunas de las aplicaciones que he desarrollado han sido:

Punto de venta.
Inventarios.
Control Documental.
Sistemas Contables.
Control de Consultorio Médico.
Recetario.
Control de gastos de Obra Civil.
Control de Radio Taxis.
Control de Redes Avon.
Control de producción y fabricación.
Etc.

Pueden contactarme a los teléfonos Cel. +55 (55) 62169107, 73148182
[email protected]; Web: http://accesssolutions-webnode.com.mx/

Servicios de consultoria y desarrollo a la medida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar