Mira, aca hice uno en MySQL pero te puede servir para hacerlo en access:
http://41.media.tumblr.com/feb031b55808afc1670a28f7a0b2eb14/tumblr_nqm3xhKGJZ1uzz9lco1_1280.png
Código
-- MySQL Workbench Synchronization -- Generated: 2015-06-27 13:45 -- Model: New Model -- Version: 1.0 -- Project: Name of the project -- Author: WHK SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; CREATE TABLE IF NOT EXISTS `blank`.`sedes` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `campus` VARCHAR(512) NOT NULL, `direccion` VARCHAR(512) NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`sedes_telefonos` ( `sede_id` INT(11) NOT NULL, `codigo_pais` INT(11) NOT NULL, `codigo_ciudad` INT(11) NOT NULL, `numero` INT(11) NOT NULL, `es_fijo` TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (`sede_id`), CONSTRAINT `fk_sedes_telefonos_sede` FOREIGN KEY (`sede_id`) REFERENCES `blank`.`sedes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`usuarios` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `nombres` VARCHAR(45) NOT NULL, `apellidos` VARCHAR(45) NOT NULL, `direccion` VARCHAR(512) NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`usuarios_telefonos` ( `usuario_id` INT(11) NOT NULL AUTO_INCREMENT, `codigo_pais` INT(11) NOT NULL, `codigo_ciudad` INT(11) NOT NULL, `numero` INT(11) NOT NULL, `es_fijo` TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (`usuario_id`), CONSTRAINT `fk_usuarios_telefonos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`correos` ( `usuario_id` INT(11) NOT NULL, `correo` VARCHAR(65) NOT NULL, PRIMARY KEY (`usuario_id`), CONSTRAINT `fk_usuarios_correos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`usuarios_sedes_relacion` ( `usuario_id` INT(11) NOT NULL, `sede_id` INT(11) NOT NULL, PRIMARY KEY (`usuario_id`, `sede_id`), INDEX `fk_usuarios_sedes_relacion_sede1_idx` (`sede_id` ASC), CONSTRAINT `fk_usuarios_sedes_relacion_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_usuarios_sedes_relacion_sede1` FOREIGN KEY (`sede_id`) REFERENCES `blank`.`sedes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`usuarios_roles` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `nombres` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`usuarios_roles_relacion` ( `usuario_id` INT(11) NOT NULL, `usuarios_rol_id` INT(11) NOT NULL, PRIMARY KEY (`usuario_id`, `usuarios_rol_id`), INDEX `fk_usuarios_roles_relacion_usuarios_roles1_idx` (`usuarios_rol_id` ASC), CONSTRAINT `fk_usuarios_roles_relacion_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_usuarios_roles_relacion_usuarios_roles1` FOREIGN KEY (`usuarios_rol_id`) REFERENCES `blank`.`usuarios_roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`alumnos_datos` ( `usuario_id` INT(11) NOT NULL, `carrera_id` INT(11) NOT NULL, PRIMARY KEY (`usuario_id`, `carrera_id`), INDEX `fk_alumnos_datos_carreras1_idx` (`carrera_id` ASC), CONSTRAINT `fk_alumnos_datos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_alumnos_datos_carreras1` FOREIGN KEY (`carrera_id`) REFERENCES `blank`.`carreras` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`carreras` ( `id` INT(11) NOT NULL, `nombre` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`administrativo_datos` ( `usuario_id` INT(11) NOT NULL, `cargo_id` INT(11) NOT NULL, PRIMARY KEY (`usuario_id`, `cargo_id`), INDEX `fk_administrativo_datos_cargos1_idx` (`cargo_id` ASC), CONSTRAINT `fk_administrativo_datos_cargos1` FOREIGN KEY (`cargo_id`) REFERENCES `blank`.`cargos` (`int`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_administrativo_datos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`cargos` ( `int` INT(11) NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(45) NOT NULL, PRIMARY KEY (`int`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`catedraticos_datos` ( `usuario_id` INT(11) NOT NULL, `asignatura_id` INT(11) NOT NULL, PRIMARY KEY (`usuario_id`, `asignatura_id`), INDEX `fk_catedraticos_asignaturas1_idx` (`asignatura_id` ASC), CONSTRAINT `fk_catedraticos_asignaturas1` FOREIGN KEY (`asignatura_id`) REFERENCES `blank`.`asignaturas` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_catedraticos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `blank`.`usuarios` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `blank`.`asignaturas` ( `id` INT(11) NOT NULL, `nombre` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; 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.