简体   繁体   English

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

[英]What is the difference between many-to-many cross table and one-to-one cross table

Is there anything different between the two? 两者之间有什么不同吗? All I see is the additional index which I don't believe fundamentally changes anything. 我所看到的只是附加索引,我认为该索引从根本上不会改变任何内容。

I would expect the first allows each t1_1 entity to be joined to multiple t1_2 entities, and the opposite as well. 我希望第一个允许每个t1_1实体加入多个t1_2实体,而相反的情况也是如此。

For the second, I would expect each t2_1 entity to be joined to a maximum of one t2_2 entity. 对于第二个,我希望每个t2_1实体最多可以连接一个t2_2实体。

But the resulting schema's generated by MySQL Workbench appear to be basically the same. 但是,MySQL Workbench生成的结果模式看起来基本相同。

PS. PS。 Why I am doing this? 为什么我要这样做? Learning about super/sub tables, and went off on a tangent. 了解超级表/子表,并切线。

在此处输入图片说明

-- 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;

IMO, talking in perspective of database design (not mysql workbench) IMO,从数据库设计的角度谈论(不是mysql工作台)
When using 1-n relation, we mean a not null foreign key inside cross table. 当使用1-n关系时,我们的意思是交叉表内的非空外键。
When using 1-1 relation, we mean a not null foreign key inside cross table that is the or part of a unique key of cross table. 当使用1-1关系时,我们指的是交叉表内部的非空外键,它是交叉表的唯一键或部分。

Consider tables having these records: 考虑具有以下记录的表:
T1_1(A1, B1, C1) T1_1(A1,B1,C1)
T2_1(A2, B2, C2) T2_1(A2,B2,C2)
In 1-n relation, we can have (A1, A2) multiple times in T1_has_T2 table 1-n关系中,我们可以在T1_has_T2表中多次 拥有 (A1,A2)
In 1-1 relation, we can not have (A1, A2) multiple times in T1_has_T2 table. 1-1关系中,我们不能在T1_has_T2表中多次 拥有 (A1,A2)。

So Achieving 1-1 could be possible by putting foreign keys inside primary key or defining a unique key(index) on combination the foreign key columns. 因此,可以通过将外键放在主键内或在外键列的组合上定义唯一键(索引)来实现1-1。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM