我正在设计一个数据库模型,我遇到了一个问题:指定关系的连接表端是否是可选的有什么意义,记住它对生成的DDL没有任何影响?
例如,以下面两个不同的图表为例:
在A_to_B_join端具有A和A_to_B_join之间的强制关系的图:

在A_to_B_join端具有A和A_to_B_join之间可选关系的图:

我注意到它们都会生成相同的DDL,尽管它们是不同的!
生成的DDL:
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 `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`A`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`A` (
`A_ID` INT NOT NULL ,
PRIMARY KEY (`A_ID`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`B`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`B` (
`B_ID` INT NOT NULL ,
PRIMARY KEY (`B_ID`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`A_to_B_join`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`A_to_B_join` (
`A_ID` INT NOT NULL ,
`B_ID` INT NOT NULL ,
PRIMARY KEY (`A_ID`, `B_ID`) ,
INDEX `fk_A_to_B_join_B1` (`B_ID` ASC) ,
INDEX `fk_A_to_B_join_A` (`A_ID` ASC) ,
CONSTRAINT `fk_A_to_B_join_A`
FOREIGN KEY (`A_ID` )
REFERENCES `mydb`.`A` (`A_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_A_to_B_join_B1`
FOREIGN KEY (`B_ID` )
REFERENCES `mydb`.`B` (`B_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;那么提到side是可选的还是强制的又有什么意义呢?我该费心吗?DDL是不是特定于MySQL的事实?
致以敬意,
发布于 2011-10-13 23:06:17
它很可能是特定于MySQL的。
其他一些产品(Oracle?Postgres?...)可以生成略微不同的DDL,而查询优化器可以使用这种差异来决定如何转换包含联接的查询。
https://stackoverflow.com/questions/7754809
复制相似问题