Duda base datos

XinXan

Buenas,
a ver si alguien me puede echar una mano que estoy muy espeso

Estoy planteado una base de datos con EMPRESAS/USUARIOS/ROLES, algo asi
https://imgshare.io/image/hhubQ

La idea es:
Una empresa puede tener N usuarios
Un usuario pertenece a 1 empresa
Una empresa tiene N roles
Un usuario tiene N roles de 1 empresa

No doy con la tecla para definir la tabla que permita la relación haciendo dicha restricción mediante FKs.

Alguna alma bondadosa que me refresque la memoria??

Gracias

COSMOS
empresa(empresa_id (PK), etc)
rol(rol_id (PK), etc)
empresa_rol(empresa_id(PK,FK),rol_id(PK,FK))
usuario(usuario_id(PK),empresa_id(FK))
usuario_rol(usuario_id(PK,FK),rol_id(PK,FK))

---------
como consejo, primero crea las tablas con las relaciones de manera individual y luego ve creando a partir de ahí. Echa un ojo a las formas normales

1 respuesta
sh31k

Algo así haría yo, entiendo que hay N empresas, sino se puede simplificar aun más

1 1 respuesta
XinXan

#2 de la manera que indicas podría asociar cualquier rol a un usuario, ya que la FK de usuario_rol unicamente va vinculada al rol_id y no tiene porque concordar con la relación que tiene luego la FK de usuario con empresa

#3 De esa forma evito la problemática anterior, pero no tengo manera de saber de forma directa a que empresa pertenece un usuario hasta que no le asocie un rol

La idea es que a nivel base datos pueda asociar en primer lugar un usuario a una empresa y luego pueda asignarle un rol que pertenezca a esa empresa. Por código es muy sencillo de montar con una simple restricción, pero en la base de datos no logro hacerlo

https://imgur.com/wjm8HpM

En la tabla sign_user_authority (relacion rol/usuario/empresa) puedo poner una relación con un rol que nada tenga que ver con la empresa que hay en la relacion user/customer

Malditas relaciones ternarias y tener el cerebro fundido :P

2 respuestas
sh31k

#4 añade un campo empresa en el cliente y listo

1 respuesta
COSMOS

#4 tienes enlazadas(no directamente] rol y empresa por un lado y empleado y empresa.
La restricción que quieres aplicar no depende de pks ni FKs, sino de valores de los mismos y deberías hacerlo con constraints, triggers o validaciones previas.
Si quieres, pasa un discord y lo discutimos 😁

1 respuesta
JuAn4k4

No mezcles conceptos, crea UserGroups que tengan roles. Si quieres la empresa puede tene runa Subscripcion que tenga roles asignables (o features).
Asi permites que una empresa tenga usuarios con distintos permisos según un grupo.

XinXan

#4 Ese campo ya existía
#5 Claro que se puede, es mas no hay como dormir un poco y despejar la mente
#6 No acabo de entender que quieres decir, la idea era hacer una relacion 1 N entre usuario/rol, una relacion 1/N entre empresa/usuario y luego hacer una relación entre empresa/rol/usuario.

La solución que he implementando finalmente es esta

https://imgur.com/YzI42Q6

De tal forma que la tabla user_rol tiene dos FK

  • FOREIGN KEY (id_rol, id_customer) REFERENCES rol (id, id_customer)
  • FOREIGN KEY (id_user, id_customer) REFERENCES user (id, id_customer)

De esta forma solo puedo asociar un ROL de una empresa a un usuario que pertenezca a esa empresa

Gracias por la ayuda :)

eXtreM3

Entidades:

  • tabla empresas
  • tabla usuarios
  • tabla roles

Relaciones:

  • tabla empresas_roles (una empresa tiene N roles)
  • tabla usuarios_roles (un usuario tiene N roles)
JuAn4k4

Si quieres restringir que solo puedas asignar roles a un user que estén en company_roles, puedes darle un id (pk) a esta tabla (company_rooles) de relación y hacerlo FK de user_roles. Aunque yo lo haria a nivel de negocio (código de la app), ya que puedes querer dejarlos inactivos si se eliminan de la empresa pero no de cada user y tal.

Entiendo que Empresa <> Role tiene que ser M:N y no 1:N

Usuarios habituales

  • JuAn4k4
  • eXtreM3
  • XinXan
  • COSMOS
  • sh31k