Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: JcRi$ti4n en 11 de Junio 2014, 15:34
-
Saludos comunidad, hoy vengo con una pequeña duda que espero me colaboren estoy realizando una base de datos relacional, el problema surge en que tengo 4 tablas que son :
create table funcionariocargo(
funcionariocargo_id int not null,
funcionario_id int not null,
cargo_id int not null,
numero_item int(2) not null,
obsevaciones varchar(70),
perfil_id int not null,
primary key(funcionariocargo_id),
foreign key(funcionario_id)references funcionario(funcionario_id),
foreign key(cargo_id)references cargo(cargo_id)
foreign key(perfil_id)references perfil(perfil_id)
);
-------
create table perfil(
perfil_id int not null,
funcionariocargo_id int not null,
nombre_perfil varchar(35) not null,
descripcion varchar(50),
primary key(perfil_id),
);
----------
create table rol(
rol_id int not null,
perfil_id int not null,
nombre_rol varchar(35) not null,
descripcion varchar(35),
primary key(rol_id),
);
-----
CREATE detalleperfilrol (
`perfil_id` int(11) NOT NULL,
`rol_id` int(11) NOT NULL,
KEY `rol_id` (`rol_id`),
KEY `perfil_id` (`perfil_id`)
) ;
la cuestion es que como pueden observar un funcionariocargo tiene un perfil y este perfil contiene mucho roles y viceseversa, como no puede repetir el PK de perfil para que se asocie con la tabla rol, como por ejem. el perfil base puede contener al rol x,y,z , y el perfil base1 puede contener al rol x,y.
Entonces cree otra tabla detalleperfilrol que contiene los Pk de ambos, quiero obtener criticas sobre este planteamiento, gracias de antemano
-
Hola, hay cosas que no veo claras, pero tendrías que explicar qué significado tiene cada cosa para poder entenderlo.
Por ejemplo en la tabla funcionariocargo relacionas un funcionario con un cargo y con un perfil.
Pero luego en la tabla perfil vuelves a tener el perfil_id relacionado con funcionariocargo_id
¿Si ya lo tienes relacionado en la tabla funcionariocargo para qué vuelves a incluir aquí una relación? Aparentemente estás creando una duplicidad innecesaria ::)
-
Bueno gracias por la respuesta y disculpas, lo que pasa es que no fije la fecha que actualize el archivo para copiar el codigo de ejemplo, asi que aqui va el correcto
create table funcionariocargo(
funcionariocargo_id int not null,
funcionario_id int not null,
cargo_id int not null,
numero_item int(2) not null,
obsevaciones varchar(70),
perfil_id int not null,
primary key(funcionariocargo_id),
foreign key(funcionario_id)references funcionario(funcionario_id),
foreign key(cargo_id)references cargo(cargo_id)
foreign key(perfil_id)references perfil(perfil_id)
);
-------
create table perfil(
perfil_id int not null,
nombre_perfil varchar(35) not null,
descripcion varchar(50),
primary key(perfil_id),
);
----------
create table rol(
rol_id int not null,
nombre_rol varchar(35) not null,
descripcion varchar(35),
primary key(rol_id),
);
-----
CREATE detalleperfilrol (
perfil_id int NOT NULL,
rol_id int NOT NULL,
key rol_id (rol_id),
key perfil_id (perfil_id)
) ;
al tener la tabla funcionariocargo esta relacionado con un funcionario y un cargo que son tablas aparte y que no influyen mucho en la cuestion , las tablas perfil ,rol, detalleperfilrol son las que quiero consultar si se encuentran bien relacionadas con respecto a funcionariocargo espero aora si me deje entender
saludos
-
Ahora el diseño sí parece correcto. Según este diseño, un funcionariocargo tiene un perfil, y un perfil puede tener uno o muchos roles. Es la forma de hacerlo.
Lo único que me parece te faltaría es declarar foreign las claves de detalleperfilrol, es decir,
CREATE detalleperfilrol (
perfil_id int NOT NULL,
rol_id int NOT NULL,
foreign key rol_id (rol_id),
foreign key perfil_id (perfil_id)
) ;
En esta última tabla la primary key es una clave compuesta, formada por las claves rol_id y perfil_id
-
bueno gracias por la opinion Mastermind ya logre poner en orden esta base datos