多对多交叉表和一对一交叉表之间有什么区别

时间:2015-08-05 15:27:41

标签: mysql sql database-design mysql-workbench

两者之间有什么不同吗?我所看到的只是附加指数,我不相信会从根本上改变任何东西。

我希望第一个实体允许每个t1_1实体连接到多个t1_2实体,反之亦然。

对于第二个,我希望每个t2_1实体最多加入一个t2_2实体。

但MySQL Workbench生成的结果模式似乎基本相同。

PS。为什么我这样做?学习超级/子表,并切断正确。

enter image description here

-- MySQL Script generated by MySQL Workbench
-- 08/05/15 08:12:21
-- Model: New Model    Version: 1.0
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';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`t1_1`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t1_1` (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t1_2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t1_2` (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t1_1_has_t1_2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t1_1_has_t1_2` (
  `t1_1_id` INT NOT NULL,
  `t1_2_id` INT NOT NULL,
  PRIMARY KEY (`t1_1_id`, `t1_2_id`),
  INDEX `fk_t1_1_has_t1_2_t1_21_idx` (`t1_2_id` ASC),
  INDEX `fk_t1_1_has_t1_2_t1_1_idx` (`t1_1_id` ASC),
  CONSTRAINT `fk_t1_1_has_t1_2_t1_1`
    FOREIGN KEY (`t1_1_id`)
    REFERENCES `mydb`.`t1_1` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_t1_1_has_t1_2_t1_21`
    FOREIGN KEY (`t1_2_id`)
    REFERENCES `mydb`.`t1_2` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t2_1`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t2_1` (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t2_2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t2_2` (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t2_1_hs_t2_2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t2_1_hs_t2_2` (
  `t2_1_id` INT NOT NULL,
  `t2_2_id` INT NOT NULL,
  PRIMARY KEY (`t2_1_id`, `t2_2_id`),
  INDEX `fk_t2_1_hs_t2_2_t2_21_idx` (`t2_2_id` ASC),
  CONSTRAINT `fk_t2_1_hs_t2_2_t2_11`
    FOREIGN KEY (`t2_1_id`)
    REFERENCES `mydb`.`t2_1` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_t2_1_hs_t2_2_t2_21`
    FOREIGN KEY (`t2_2_id`)
    REFERENCES `mydb`.`t2_2` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

1 个答案:

答案 0 :(得分:0)

IMO,从数据库设计(不是mysql workbench)的角度谈论 当使用1-n关系时,我们指的是交叉表内的非空外键 当使用1-1关系时,我们指的是交叉表内的非空外键,它是交叉表的唯一键的一部分。

考虑具有这些记录的表:
T1_1(A1,B1,C1)
T2_1(A2,B2,C2)
1-n关系中,我们可以在T1_has_T2表中(A1,A2)多次
1-1关系中,我们在T1_has_T2表中不能(A1,A2)多次

因此,通过将外键放在主键中或在组合外键列时定义唯一键(索引),可以实现1-1。