mysql - 为父类(super class)型表强制执行单一子类型 SQL 表

标签 mysql sql database-design

我有一个名为“车辆”的父类(super class)型表。我还有三个子类型表,分别称为“飞机”、“汽车”和“自行车”,并且这些子类型表中只有一个必须链接到车辆父类(super class)型表(或者换句话说,必须使用车辆主键 ID)作为其主键 ID)。

应该如何建模来强制执行这种行为?

编辑迈克·布兰特推荐的提议架构。

-- MySQL Script generated by MySQL Workbench
-- 05/25/16 09:20:17
-- 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`.`vehicle_types`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`vehicle_types` (
  `type` CHAR(8) NOT NULL,
  PRIMARY KEY (`type`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`vehicles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`vehicles` (
  `idvehicles` INT NOT NULL AUTO_INCREMENT,
  `type` CHAR(8) NOT NULL,
  `data` VARCHAR(45) NULL,
  PRIMARY KEY (`idvehicles`),
  INDEX `fk_vehicles_vehicle_types_idx` (`type` ASC),
  CONSTRAINT `fk_vehicles_vehicle_types`
    FOREIGN KEY (`type`)
    REFERENCES `mydb`.`vehicle_types` (`type`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`airplanes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`airplanes` (
  `vehicles_idvehicles` INT NOT NULL,
  `data_for_airplanes` VARCHAR(45) NULL,
  PRIMARY KEY (`vehicles_idvehicles`),
  CONSTRAINT `fk_airplanes_vehicles1`
    FOREIGN KEY (`vehicles_idvehicles`)
    REFERENCES `mydb`.`vehicles` (`idvehicles`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`automobiles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`automobiles` (
  `vehicles_idvehicles` INT NOT NULL,
  `data_for_automobiles` VARCHAR(45) NULL,
  PRIMARY KEY (`vehicles_idvehicles`),
  CONSTRAINT `fk_automobiles_vehicles1`
    FOREIGN KEY (`vehicles_idvehicles`)
    REFERENCES `mydb`.`vehicles` (`idvehicles`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`bicycles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`bicycles` (
  `vehicles_idvehicles` INT NOT NULL,
  `data_for_bicycles` VARCHAR(45) NULL,
  PRIMARY KEY (`vehicles_idvehicles`),
  CONSTRAINT `fk_bicycles_vehicles1`
    FOREIGN KEY (`vehicles_idvehicles`)
    REFERENCES `mydb`.`vehicles` (`idvehicles`)
    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;

最佳答案

我认为插入车辆和任何其他子类型应该同时进行。因此,您可以获得车辆 ID 并将其作为新的子类型 PK ID。如果您同时拥有所有信息,则可以创建交易并首先插入车辆记录,然后插入子类型记录。然后提交你的转换,否则回滚它。如果您想知道哪个记录属于哪个子类型表记录,您可以向车辆表添加一列,例如可以有 3 个不同的值,例如 0、1、2,显示哪个记录属于哪个子表。 java 中的枚举可以用于类似的事情以获得更多说明

关于mysql - 为父类(super class)型表强制执行单一子类型 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442413/

相关文章:

php - 按循环查询值对mysql结果进行排序

mysql - Django loaddata 对于 unicode 失败

不指定列的 SQL INSERT。会发生什么?

mysql - 插入已排序的 SQL 条目

sql-server - 医生排类数据库设计

database-design - 需要这些保留字的替代字段名称

mysql - SQL 查询占用 100% CPU - Mariadb

mysql - 将2个表的数据复制到1个表

mysql - 用增量数字填充字段需要什么 MySQL 语句

php - 错误 (150) - 设计基本关系数据库时遇到问题