Проектирование базы данных и возможность взаимодействия между таблицами соединений - PullRequest
0 голосов
/ 13 октября 2011

Я проектирую модель базы данных, и у меня возник вопрос: какой смысл указывать, является ли сторона отношения таблицы соединения необязательной, учитывая, что она не влияет на сгенерированный DDL?

Например, возьмите две разные диаграммы ниже:

Диаграмма с обязательной взаимосвязью между A и A_to_B_join на стороне A_to_B_join: mandatory

Диаграмма с необязательной взаимосвязью между A и A_to_B_join на стороне A_to_B_join:

optional

Я заметил, что они оба генерируют один и тот же 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;

Какой смысл тогда упоминать, является ли сторона необязательной или обязательной? Должен ли я беспокоиться? Является ли тот факт, что DDL является таким же специфичным для MySQL?

С уважением,

1 Ответ

2 голосов
/ 13 октября 2011

Он вполне может быть специфичным для MySQL.

Какой-то другой продукт (Oracle? Postgres? ...) может генерировать несколько разные DDL, и оптимизатор запросов может использовать эту разницу, чтобы решить, какпереводить запросы, включающие присоединение.

...