Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Alejandro1195 en 27 Junio 2015, 04:50 am



Título: Ayuda amigo necesito crear una base de datos
Publicado por: Alejandro1195 en 27 Junio 2015, 04:50 am
en access y debo de crear una agenda telefonica tengo estas tablas pero a la hora de relacionarlas no se como hacer me ayuda..
BD debe de llevar, telefonos de alumnos, catedraticos, sedes de la universidad y personal administrativo
(http://fdzeta.com/subir/images/mlU3P.png)


Título: Re: Ayuda amigo necesito crear una base de datos
Publicado por: WHK en 27 Junio 2015, 18:31 pm
En ves de hacer eso lo que yo haría es una sola tabla con usuarios y una tabla con tipos de usuarios e ir asociando los tipos de usuarios con los usuarios (grupos de usuarios) y luego la tabla de usuarios asignarle un id de sede, ahora, que pasa si un usuario está en mas de una sede? en ese caso necesitarás una tabla adicional relacional entre usuarios y sedes.

Mira, aca hice uno en MySQL pero te puede servir para hacerlo en access:

http://41.media.tumblr.com/feb031b55808afc1670a28f7a0b2eb14/tumblr_nqm3xhKGJZ1uzz9lco1_1280.png
(http://41.media.tumblr.com/feb031b55808afc1670a28f7a0b2eb14/tumblr_nqm3xhKGJZ1uzz9lco1_1280.png)

Código
  1. -- MySQL Workbench Synchronization
  2. -- Generated: 2015-06-27 13:45
  3. -- Model: New Model
  4. -- Version: 1.0
  5. -- Project: Name of the project
  6. -- Author: WHK
  7.  
  8. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  9. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  10. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  11.  
  12. CREATE TABLE IF NOT EXISTS `blank`.`sedes` (
  13.  `id` INT(11) NOT NULL AUTO_INCREMENT,
  14.  `campus` VARCHAR(512) NOT NULL,
  15.  `direccion` VARCHAR(512) NOT NULL,
  16.  PRIMARY KEY (`id`))
  17. ENGINE = InnoDB
  18. DEFAULT CHARACTER SET = utf8
  19. COLLATE = utf8_general_ci;
  20.  
  21. CREATE TABLE IF NOT EXISTS `blank`.`sedes_telefonos` (
  22.  `sede_id` INT(11) NOT NULL,
  23.  `codigo_pais` INT(11) NOT NULL,
  24.  `codigo_ciudad` INT(11) NOT NULL,
  25.  `numero` INT(11) NOT NULL,
  26.  `es_fijo` TINYINT(1) NOT NULL DEFAULT 0,
  27.  PRIMARY KEY (`sede_id`),
  28.  CONSTRAINT `fk_sedes_telefonos_sede`
  29.    FOREIGN KEY (`sede_id`)
  30.    REFERENCES `blank`.`sedes` (`id`)
  31.    ON DELETE CASCADE
  32.    ON UPDATE CASCADE)
  33. ENGINE = InnoDB
  34. DEFAULT CHARACTER SET = utf8
  35. COLLATE = utf8_general_ci;
  36.  
  37. CREATE TABLE IF NOT EXISTS `blank`.`usuarios` (
  38.  `id` INT(11) NOT NULL AUTO_INCREMENT,
  39.  `nombres` VARCHAR(45) NOT NULL,
  40.  `apellidos` VARCHAR(45) NOT NULL,
  41.  `direccion` VARCHAR(512) NOT NULL,
  42.  PRIMARY KEY (`id`))
  43. ENGINE = InnoDB
  44. DEFAULT CHARACTER SET = utf8
  45. COLLATE = utf8_general_ci;
  46.  
  47. CREATE TABLE IF NOT EXISTS `blank`.`usuarios_telefonos` (
  48.  `usuario_id` INT(11) NOT NULL AUTO_INCREMENT,
  49.  `codigo_pais` INT(11) NOT NULL,
  50.  `codigo_ciudad` INT(11) NOT NULL,
  51.  `numero` INT(11) NOT NULL,
  52.  `es_fijo` TINYINT(1) NOT NULL DEFAULT 0,
  53.  PRIMARY KEY (`usuario_id`),
  54.  CONSTRAINT `fk_usuarios_telefonos_usuarios1`
  55.    FOREIGN KEY (`usuario_id`)
  56.    REFERENCES `blank`.`usuarios` (`id`)
  57.    ON DELETE CASCADE
  58.    ON UPDATE CASCADE)
  59. ENGINE = InnoDB
  60. DEFAULT CHARACTER SET = utf8
  61. COLLATE = utf8_general_ci;
  62.  
  63. CREATE TABLE IF NOT EXISTS `blank`.`correos` (
  64.  `usuario_id` INT(11) NOT NULL,
  65.  `correo` VARCHAR(65) NOT NULL,
  66.  PRIMARY KEY (`usuario_id`),
  67.  CONSTRAINT `fk_usuarios_correos_usuarios1`
  68.    FOREIGN KEY (`usuario_id`)
  69.    REFERENCES `blank`.`usuarios` (`id`)
  70.    ON DELETE CASCADE
  71.    ON UPDATE CASCADE)
  72. ENGINE = InnoDB
  73. DEFAULT CHARACTER SET = utf8
  74. COLLATE = utf8_general_ci;
  75.  
  76. CREATE TABLE IF NOT EXISTS `blank`.`usuarios_sedes_relacion` (
  77.  `usuario_id` INT(11) NOT NULL,
  78.  `sede_id` INT(11) NOT NULL,
  79.  PRIMARY KEY (`usuario_id`, `sede_id`),
  80.  INDEX `fk_usuarios_sedes_relacion_sede1_idx` (`sede_id` ASC),
  81.  CONSTRAINT `fk_usuarios_sedes_relacion_usuarios1`
  82.    FOREIGN KEY (`usuario_id`)
  83.    REFERENCES `blank`.`usuarios` (`id`)
  84.    ON DELETE CASCADE
  85.    ON UPDATE CASCADE,
  86.  CONSTRAINT `fk_usuarios_sedes_relacion_sede1`
  87.    FOREIGN KEY (`sede_id`)
  88.    REFERENCES `blank`.`sedes` (`id`)
  89.    ON DELETE CASCADE
  90.    ON UPDATE CASCADE)
  91. ENGINE = InnoDB
  92. DEFAULT CHARACTER SET = utf8
  93. COLLATE = utf8_general_ci;
  94.  
  95. CREATE TABLE IF NOT EXISTS `blank`.`usuarios_roles` (
  96.  `id` INT(11) NOT NULL AUTO_INCREMENT,
  97.  `nombres` VARCHAR(45) NOT NULL,
  98.  PRIMARY KEY (`id`))
  99. ENGINE = InnoDB
  100. DEFAULT CHARACTER SET = utf8
  101. COLLATE = utf8_general_ci;
  102.  
  103. CREATE TABLE IF NOT EXISTS `blank`.`usuarios_roles_relacion` (
  104.  `usuario_id` INT(11) NOT NULL,
  105.  `usuarios_rol_id` INT(11) NOT NULL,
  106.  PRIMARY KEY (`usuario_id`, `usuarios_rol_id`),
  107.  INDEX `fk_usuarios_roles_relacion_usuarios_roles1_idx` (`usuarios_rol_id` ASC),
  108.  CONSTRAINT `fk_usuarios_roles_relacion_usuarios1`
  109.    FOREIGN KEY (`usuario_id`)
  110.    REFERENCES `blank`.`usuarios` (`id`)
  111.    ON DELETE CASCADE
  112.    ON UPDATE CASCADE,
  113.  CONSTRAINT `fk_usuarios_roles_relacion_usuarios_roles1`
  114.    FOREIGN KEY (`usuarios_rol_id`)
  115.    REFERENCES `blank`.`usuarios_roles` (`id`)
  116.    ON DELETE CASCADE
  117.    ON UPDATE CASCADE)
  118. ENGINE = InnoDB
  119. DEFAULT CHARACTER SET = utf8
  120. COLLATE = utf8_general_ci;
  121.  
  122. CREATE TABLE IF NOT EXISTS `blank`.`alumnos_datos` (
  123.  `usuario_id` INT(11) NOT NULL,
  124.  `carrera_id` INT(11) NOT NULL,
  125.  PRIMARY KEY (`usuario_id`, `carrera_id`),
  126.  INDEX `fk_alumnos_datos_carreras1_idx` (`carrera_id` ASC),
  127.  CONSTRAINT `fk_alumnos_datos_usuarios1`
  128.    FOREIGN KEY (`usuario_id`)
  129.    REFERENCES `blank`.`usuarios` (`id`)
  130.    ON DELETE CASCADE
  131.    ON UPDATE CASCADE,
  132.  CONSTRAINT `fk_alumnos_datos_carreras1`
  133.    FOREIGN KEY (`carrera_id`)
  134.    REFERENCES `blank`.`carreras` (`id`)
  135.    ON DELETE CASCADE
  136.    ON UPDATE CASCADE)
  137. ENGINE = InnoDB
  138. DEFAULT CHARACTER SET = utf8
  139. COLLATE = utf8_general_ci;
  140.  
  141. CREATE TABLE IF NOT EXISTS `blank`.`carreras` (
  142.  `id` INT(11) NOT NULL,
  143.  `nombre` VARCHAR(45) NOT NULL,
  144.  PRIMARY KEY (`id`))
  145. ENGINE = InnoDB
  146. DEFAULT CHARACTER SET = utf8
  147. COLLATE = utf8_general_ci;
  148.  
  149. CREATE TABLE IF NOT EXISTS `blank`.`administrativo_datos` (
  150.  `usuario_id` INT(11) NOT NULL,
  151.  `cargo_id` INT(11) NOT NULL,
  152.  PRIMARY KEY (`usuario_id`, `cargo_id`),
  153.  INDEX `fk_administrativo_datos_cargos1_idx` (`cargo_id` ASC),
  154.  CONSTRAINT `fk_administrativo_datos_cargos1`
  155.    FOREIGN KEY (`cargo_id`)
  156.    REFERENCES `blank`.`cargos` (`int`)
  157.    ON DELETE CASCADE
  158.    ON UPDATE CASCADE,
  159.  CONSTRAINT `fk_administrativo_datos_usuarios1`
  160.    FOREIGN KEY (`usuario_id`)
  161.    REFERENCES `blank`.`usuarios` (`id`)
  162.    ON DELETE CASCADE
  163.    ON UPDATE CASCADE)
  164. ENGINE = InnoDB
  165. DEFAULT CHARACTER SET = utf8
  166. COLLATE = utf8_general_ci;
  167.  
  168. CREATE TABLE IF NOT EXISTS `blank`.`cargos` (
  169.  `int` INT(11) NOT NULL AUTO_INCREMENT,
  170.  `nombre` VARCHAR(45) NOT NULL,
  171.  PRIMARY KEY (`int`))
  172. ENGINE = InnoDB
  173. DEFAULT CHARACTER SET = utf8
  174. COLLATE = utf8_general_ci;
  175.  
  176. CREATE TABLE IF NOT EXISTS `blank`.`catedraticos_datos` (
  177.  `usuario_id` INT(11) NOT NULL,
  178.  `asignatura_id` INT(11) NOT NULL,
  179.  PRIMARY KEY (`usuario_id`, `asignatura_id`),
  180.  INDEX `fk_catedraticos_asignaturas1_idx` (`asignatura_id` ASC),
  181.  CONSTRAINT `fk_catedraticos_asignaturas1`
  182.    FOREIGN KEY (`asignatura_id`)
  183.    REFERENCES `blank`.`asignaturas` (`id`)
  184.    ON DELETE CASCADE
  185.    ON UPDATE CASCADE,
  186.  CONSTRAINT `fk_catedraticos_usuarios1`
  187.    FOREIGN KEY (`usuario_id`)
  188.    REFERENCES `blank`.`usuarios` (`id`)
  189.    ON DELETE NO ACTION
  190.    ON UPDATE NO ACTION)
  191. ENGINE = InnoDB
  192. DEFAULT CHARACTER SET = utf8
  193. COLLATE = utf8_general_ci;
  194.  
  195. CREATE TABLE IF NOT EXISTS `blank`.`asignaturas` (
  196.  `id` INT(11) NOT NULL,
  197.  `nombre` VARCHAR(45) NOT NULL,
  198.  PRIMARY KEY (`id`))
  199. ENGINE = InnoDB
  200. DEFAULT CHARACTER SET = utf8
  201. COLLATE = utf8_general_ci;
  202.  
  203.  
  204. SET SQL_MODE=@OLD_SQL_MODE;
  205. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  206. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Mis argumentos:
Los usuarios se encuentran en una sola tabla, de esta manera la selección de personas por sede es mas rápido, cada usuario ya sea alumno o profesor estará asociado a una sede cosa que en tu db no estaba considerado, cada usuario puede tener mas de un correo y mas de un telefono, las busquedas se podrán realizar por codigo de pais de telefono en caso de que necesiten hacer algun tipo de envio masivo de sms o llamadas, la base de datos está completamente desnormalizada asi que si necesitas mas performance la normalizas, no necesitarás muchos joins para obtener todos los correos ya que todo está centralizado en una sola tabla, podrás hacer que tu sistema web administre carreras, cargos y asignaturas ya que en tu db solo ingresabas texto plano y si alguien inserta un espacio en blanco extra o un acento adicional ibas a tener duplicidad de datos y no hubieras podido hacer una búsqueda homogenea y no hubieras podido hacer modificaciones, por ejemplo digamos que la asignatura de lenguaje ya no se llamará lenguaje sino castellano, entonces lo cambias desde la columna y no necesitas cambiar todos los registros. No necesitarás una tabla de correos y telefonos para cada tipo de usuario.

Dudas?

Saludos.