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

Título: Duda con base de datos entidad relación y foreign keys
Publicado 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 :
Código: [Seleccionar]
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
Título: Re:Duda con base de datos E-R
Publicado por: Mastermind en 11 de Junio 2014, 19:21
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  ::)
Título: Re:Duda con base de datos E-R
Publicado por: JcRi$ti4n en 11 de Junio 2014, 23:28
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
Código: [Seleccionar]
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
Título: Re:Duda con base de datos E-R
Publicado por: Mastermind en 12 de Junio 2014, 11:57
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
Título: Re:Duda con base de datos E-R
Publicado por: JcRi$ti4n en 12 de Junio 2014, 23:08
bueno gracias por la opinion Mastermind ya logre poner en orden esta base datos