簡體   English   中英

多對多交叉表和一對一交叉表有什么區別

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

兩者之間有什么不同嗎? 我所看到的只是附加索引,我認為該索引從根本上不會改變任何內容。

我希望第一個允許每個t1_1實體加入多個t1_2實體,而相反的情況也是如此。

對於第二個,我希望每個t2_1實體最多可以連接一個t2_2實體。

但是,MySQL Workbench生成的結果模式看起來基本相同。

PS。 為什么我要這樣做? 了解超級表/子表,並切線。

在此處輸入圖片說明

-- 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,從數據庫設計的角度談論(不是mysql工作台)
當使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM