MySQL - Duda al implementar un diseño

 
Vista:

Duda al implementar un diseño

Publicado por almus (1 intervención) el 03/02/2007 11:47:00
Buenas...
Tengo el siguiente diseño de BD relacional:

TUSER (user_id, ...) //Usuarios
TDEPARTAMENT (depart_id, ...) //Departamentos
TPERMISSION (perm_id, ...) //Permisos
TRESOURCE (resource_id, ...) //Recursos

Necesito asignar Permisos de acceso a los Recursos, para los distintos Usuarios y Departamentos. Con el objeto de no tener que crear una tabla para cada "Objeto" sea Usuario o Departamento, incluyo la siguiente abstracción:

TOBJECT_PERM (object_perm_id, object_id, object_type, perm_id, resource_id) //Permisos para objetos

De forma que relaciono TUSER(user_id) con TOBJECT_PERM(object_id) siempre que object_type="user". De la misma forma puedo relacionar TDEPARTAMENT(depart_id) con TOBJECT_PERM(object_id) siempre que object_type="departament".

Este diseño me permite añadir nuevos "Objetos" sin tener que cambiar nada, tan sólo estableciendo un nuevo tipo para el atributo object_type. Por ejemplo:

TPOSITION (pos_id, ...) //Cargos
tal que TPOSITION(pos_id) se relaciona con TOBJECT_PERM(object_id) siempre que object_type="position".

La pregunta es... ¿este diseño es implementable tal cual en MySQL, o tengo que volver a la fórmula de crear una tabla para cada "Objeto" al que quiera asignarle permisos? Es decir, ¿MySQL me permite referenciar con una clave ajena distintas tablas como se muestra en el siguiente código?

CREATE TABLE HE.TOBJECT_PERM(
object_perm_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Object permission identificator',
object_id INTEGER UNSIGNED NOT NULL COMMENT 'Object identificator',
object_type INTEGER UNSIGNED NOT NULL COMMENT 'Object type',
perm_id INTEGER UNSIGNED NOT NULL COMMENT 'Permission identificator',
screen_id INTEGER UNSIGNED NOT NULL COMMENT 'Screen identificator',
PRIMARY KEY(object_perm_id)
INDEX(object_id, object_type),
UNIQUE(object_id, object_type),
FOREIGN KEY (object_id) REFERENCES TUSER(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (object_id) REFERENCES TDEPARTAMENT(depart_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (object_id) REFERENCES TPOSITION(pos_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (perm_id) REFERENCES _TPERMISSION(perm_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (screen_id) REFERENCES _TSCREEN(screen_id) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE = InnoDB
COMMENT = 'Object permission table';

Gracias por vuestra atencón. Agradezco de antemano vuestras repuestas.
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