2011-10-13 77 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的查詢。