Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Relacion 1-1 en MySQL 5

Estas en el tema de Relacion 1-1 en MySQL 5 en el foro de Mysql en Foros del Web. Hola, mi cuestión es la siguiente. Hice el diseño de la base de datos con la aplicación MYSQL WORKBENCH, importe el diseño correctamente pero ahora ...
  #1 (permalink)  
Antiguo 01/10/2008, 05:34
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Exclamación Relacion 1-1 en MySQL 5

Hola,

mi cuestión es la siguiente. Hice el diseño de la base de datos con la aplicación MYSQL WORKBENCH, importe el diseño correctamente pero ahora me he dado cuenta que en la relación 1-1 entre las tablas personas y usuarios puedo dar de alta usuarios con el mismo id de persona.

Os pego el SQL generado por MYSQL WORKBENCH para crear la bbddd.

Código:
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';

CREATE SCHEMA IF NOT EXISTS `my_database` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `my_database`;

-- -----------------------------------------------------
-- Table `my_database`.`personas`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `my_database`.`personas` ;

CREATE  TABLE IF NOT EXISTS `my_database`.`personas` (
  `idpersonas` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(100) NULL ,
  `apellido_1` VARCHAR(100) NULL ,
  `apellido_2` VARCHAR(100) NULL ,
  `sexo` ENUM('H','M') NULL ,
  `fecha_nacimiento` DATE NULL ,
  `dni` VARCHAR(12) NULL ,
  `telefono_1` VARCHAR(20) NULL ,
  `telefono_2` VARCHAR(20) NULL ,
  `telefono_3` VARCHAR(20) NULL ,
  `direccion` VARCHAR(255) NULL ,
  `codigo_postal` VARCHAR(6) NULL ,
  `localidad` VARCHAR(150) NULL ,
  `provincia` VARCHAR(100) NULL ,
  `pais` VARCHAR(100) NULL ,
  PRIMARY KEY (`idpersonas`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `my_database`.`usuarios`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `my_database`.`usuarios` ;

CREATE  TABLE IF NOT EXISTS `my_database`.`usuarios` (
  `idusuarios` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `personas_idpersonas` INT UNSIGNED NOT NULL ,
  `activo` TINYINT(1) NOT NULL DEFAULT 0 ,
  `username` VARCHAR(12) NOT NULL ,
  `password` VARCHAR(32) NOT NULL ,
  `email` VARCHAR(255) NULL ,
  PRIMARY KEY (`idusuarios`) ,
  INDEX fk_usuarios_personas (`personas_idpersonas` ASC) ,
  CONSTRAINT `fk_usuarios_personas`
    FOREIGN KEY (`personas_idpersonas` )
    REFERENCES `my_database`.`personas` (`idpersonas` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
Gracias por adelantado.

Saludos!
  #2 (permalink)  
Antiguo 01/10/2008, 06:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Relacion 1-1 en MySQL 5

Ese esquema es correcto si una persona puede tener múltiples nombres de usuario. Si sólo puede tener uno existen tres formas:
1. Creas una tabla de relación entre ambas con los ID de ambos como PK.
2. Creas en Usuarios un índice UNIQUE con la PK de Usuarios y el ID de Persona en esa tabla.
3. Controlas el problema en la aplicación, validando los ingresos en los formularios.

La decisión es tuya...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/10/2008, 07:16
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
De acuerdo Respuesta: Relacion 1-1 en MySQL 5

Gracias por tu respuesta gnzsoloyo, elegiré la segunda opción que me has propuesto.

Saludos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:18.