2011-10-13 76 views
0

我正在设计一个数据库模型,并且出现了一个问题:指定关系的连接表一侧是否可选的关键点是什么?生成的DDL?连接表关系中的数据库设计和可选性

例如采取以下两个不同的图:

图与在A_to_B_join侧A和A_to_B_join之间强制关系: mandatory

图与在A_to_B_join侧A和A_to_B_join之间可选关系:

optional

我注意到他们都试图生成相同的DDL,即使他们是d ifferent!

生成的DDL:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

有什么意义,然后提一边是可选的还是强制的?我应该打扰吗? DDL是否与MySQL相同?

Regards,

回答

2

它可能是MySQL特有的。

某些其他产品(Oracle?Postgres?...)可能会生成稍微不同的DDL,查询优化程序可能会使用该差异来决定如何转换包含Join的查询。