entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Duda en Modelado de datos Permisos

Hola a todos!!
Estoy realizando el modelado de datos sobre los siguientes puntos

  • Aplicar Permisos a nivel de usuario (a un usuario particular se la dar los permisos agregar, editar,etc)
  • Aplicar Permisos a nivel de grupo (las cuentas podrian tener tipo a b c .... entonces a este tipo de cuentas se agruparia para formar el grupo letras, entonces aplicaria los permisosal grupo letras y asi evitaria darle permisos por cada cuenta)
  • Aplicar Permisos a nivel de Proyecto (las cuentas a b c pertenecen al proyecto "lenguaje", la misma logica de grupos)
  • Normalizacion
DROP TABLE IF EXISTS `groups`;
CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `projects`;
CREATE TABLE IF NOT EXISTS `projects` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  `active` char(1) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `typeaccount`;
CREATE TABLE IF NOT EXISTS `typeaccount` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  `active` char(1) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `accounts`;
CREATE TABLE IF NOT EXISTS `accounts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `obs` varchar(255) NOT NULL,
  `active` char(1) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `typeaccount_id` int(10) unsigned NOT NULL,
  `project_id` int(10) unsigned NOT NULL,
  `groups_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `accounts_typeaccount_id_foreign` (`typeaccount_id`),
  KEY `accounts_project_id_foreign` (`project_id`),
  KEY `fk_accounts_groups1_idx` (`groups_id`),
  CONSTRAINT `accounts_project_id_foreign` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `accounts_typeaccount_id_foreign` FOREIGN KEY (`typeaccount_id`) REFERENCES `typeaccount` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_accounts_groups1` FOREIGN KEY (`groups_id`) REFERENCES `groups` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(60) NOT NULL,
  `failed_attemps` varchar(255) NOT NULL,
  `last_login` datetime NOT NULL,
  `active` char(1) NOT NULL,
  `remember_token` varchar(100) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `profile_id` int(10) unsigned NOT NULL,
  `typeuser_id` int(11) NOT NULL,
  `area_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `useraccount`;
CREATE TABLE IF NOT EXISTS `useraccount` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ua_new` char(1) NOT NULL,
  `ua_edit` char(1) NOT NULL,
  `ua_del` char(1) NOT NULL,
  `ua_show` char(1) NOT NULL,
  `ua_xls` char(1) NOT NULL,
  `ua_pdf` char(1) NOT NULL,
  `ua_delete` char(1) NOT NULL,
  `account_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `project_id` int(10) unsigned NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `groups_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `useraccount_account_id_foreign` (`account_id`),
  KEY `useraccount_user_id_foreign` (`user_id`),
  KEY `useraccount_project_id_foreign` (`project_id`),
  KEY `fk_useraccount_groups1_idx` (`groups_id`),
  CONSTRAINT `fk_useraccount_groups1` FOREIGN KEY (`groups_id`) REFERENCES `groups` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `useraccount_account_id_foreign` FOREIGN KEY (`account_id`) REFERENCES `accounts` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `useraccount_project_id_foreign` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `useraccount_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

imagen
https://mega.nz/#!9UF3VK6I!lUzDb7j8hjw0UNXxpDiA1OquQTUFx881Y5Vr0lCEPuM

Me ayudaria muchos sus observaciones y/o alguna sugerencia para mejorar la estructura de la basededatos
Gracias de antemano !

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola @charlee77,

si tenés un rato, marcá la parte de código como tal así se lee mejor la pregunta.

Entrando en tu cuestión, la normalización que planteás permiet que un usuario tenga solo un grupo y un proyecto. Depende de las reglas del negocio si esto es suficiente, o si un usuario puede tener más de un proyecto y grupo, en cuyo caso este almacenamiento no alcanza. (te comento esto porque el campo que hace referencia está escrito en plural, como si fueran posibles más de uno... tal vez poniendo la cardinalidad en el gráfico, se entienda mejor)

No me doy cuenta por qué hay "tipos de cuenta", ni por qué "cuentas" está por separado. Estás pensando en que un usuario tanga más de una cuenta?

Se me escapan cosas por la falta de contexto, pero puedo ver un error en la normalización: los tipos de permiso ua-new, ua-edit, etc, deberían estar en una tabla aparte, de forma tal de que si el día de mañana tenés que agregar un permiso nuevo, no tenés que modificar la estructura de esa tabla, sino agregar un registro nuevo entre los tipos de permiso. Esta separación implica una tabla extra para soportar la relación entre el permiso y la cuenta, que será una relación 1-N. (por qué parece haber dos campos para borrar, del y delete ?)

Qué la tabla cuentas tenga campos para proyecto y grupo suena raro: pareciera que estás usando un campo discriminador para saber de quien es la cuenta...

Sin más datos, pareciera que te faltasen varias tablas, porque muchas relaciones parecen tener que ser 1-N en vez de 1-1

Saludos cordiales!

0voto

charlee77 comentado

Hola amigo @Leonardo-Tadei
... detallo mejo lo que estoy desarrollando en los sgtes puntos.

  • usuario se le asociaran a varias cuentas.
  • una cuenta puede estar en varios grupos .
  • una cuenta solo esta asociada a un proyecto.
  • una cuenta puede tener diferentes atributos(nombre y valor).
  • algunas cuentas pueden tener asociado el mismo nombredelatributo pero diferente valor,
    algunos nombresdeatributo se compartiran en diferentes cuentas pero el valordeatributo va ser diferente.
  • los atributos pobablemente aumentaran, editaran o borrarse en el transcurso del tiempo
    .... seria apropiado implementar modelo de eav ?

imagen
https://mega.nz/#!sQEH3JoA!kiA-FgD1C0Sb0IknvKwe6az3M9B9hHETmq8GlihOebg

Estoy, por supuesto, abierto a cualquier otra solución para mejorar

Gracias

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta