mysql - 基于图表构建代码

标签 mysql

我正在尝试构建一个数据库,但我对 MySql 相当一无所知。以下是我想要实现的目标: http://snag.gy/eryLf.jpg

这是我到目前为止编码的内容(表格是按从左到右的顺序创建的,如图所示)

    CREATE TABLE person (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  fname VARCHAR(64),
  lname VARCHAR(64)
) ENGINE = InnoDB;

CREATE TABLE bookauthor (
  book_id INT(11),
  author_id INT(11),
  FOREIGN KEY (author_id) REFERENCES person (id) ON UPDATE CASCADE,
  FOREIGN KEY (book_id) REFERENCES book (id) ON UPDATE CASCADE
) ENGINE = InnoDB;

CREATE TABLE bookpublisher (
  book_id INT(11),
  publisher_id INT(11),
  FOREIGN KEY (book_id) REFERENCES book (id) ON UPDATE CASCADE,
  FOREIGN KEY (publisher_id) REFERENCES publisher(id) ON UPDATE CASCADE
) ENGINE = InnoDB;

CREATE TABLE publisher (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64)
) ENGINE = InnoDB;

CREATE TABLE bookillustrator (
  book_id INT(11),
  illustrator_id INT(11),
  FOREIGN KEY (book_id) REFERENCES book(id) ON UPDATE CASCADE,
  FOREIGN KEY (illustrator_id) REFERENCES person(id) ON UPDATE CASCADE
) ENGINE = InnoDB;

CREATE TABLE book (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(256),
  type_id INT(11),
  publication_date DATE,
  value DECIMAL(10,2),
  price DECIMAL(10,2),
  notes TEXT,
  signed TINYINT(1),
  grade_id INT(10),
  bagged TINYINT(1)
) ENGINE = InnoDB;

CREATE TABLE booktag (
  book_id INT(11),
  tag_id INT(11),
  FOREIGN KEY (book_id) REFERENCES book(id) ON UPDATE CASCADE,
  FOREIGN KEY(tag_id) REFERENCES tag(id) ON UPDATE CASCADE
) ENGINE = InnoDB;

CREATE TABLE tag (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  value VARCHAR(64)
) ENGINE = InnoDB;

CREATE TABLE type (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64)
) ENGINE = InnoDB;

CREATE TABLE grade (
  id INT(11) AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(256)
) ENGINE = InnoDB;

书籍与类型、书籍与成绩之间显示出什么样的关系?

最佳答案

book->typebook->grade 关系为 1:n,其中 typegrade是可选的。这可以使用 MySQL Workbench 轻松创建。

这应该可以做到:

-- -----------------------------------------------------
-- Table `type`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `type` (
  `id` INT(10) NOT NULL ,
  `name` VARCHAR(256) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `grade`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `grade` (
  `id` INT(10) NOT NULL ,
  `name` VARCHAR(256) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `book`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `book` (
  `id` INT(10) NOT NULL ,
  `title` VARCHAR(256) NOT NULL ,
  `type_id` INT(10) NULL ,
  `publication_date` DATE NULL ,
  `value` DECIMAL(10,2) NULL ,
  `price` DECIMAL(10,2) NULL ,
  `notes` TEXT NULL ,
  `signed` TINYINT(1) NULL ,
  `grade_id` INT(10) NULL ,
  `bagged` TINYINT(1) NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_book_grade` (`grade_id` ASC) ,
  INDEX `fk_book_type1` (`type_id` ASC) ,
  CONSTRAINT `fk_book_grade`
    FOREIGN KEY (`grade_id` )
    REFERENCES `grade` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_book_type1`
    FOREIGN KEY (`type_id` )
    REFERENCES `type` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `tag`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `tag` (
  `id` INT(10) NOT NULL ,
  `value` VARCHAR(64) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `booktag`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `booktag` (
  `book_id` INT(10) NOT NULL ,
  `tag_id` INT(10) NOT NULL ,
  INDEX `fk_booktag_book1` (`book_id` ASC) ,
  INDEX `fk_booktag_tag1` (`tag_id` ASC) ,
  PRIMARY KEY (`book_id`, `tag_id`) ,
  CONSTRAINT `fk_booktag_book1`
    FOREIGN KEY (`book_id` )
    REFERENCES `book` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_booktag_tag1`
    FOREIGN KEY (`tag_id` )
    REFERENCES `tag` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `person`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `person` (
  `id` INT(10) NOT NULL ,
  `fname` VARCHAR(64) NOT NULL ,
  `lname` VARCHAR(64) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `bookillustrator`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `bookillustrator` (
  `book_id` INT(10) NOT NULL ,
  `person_id` INT(10) NOT NULL ,
  INDEX `fk_bookillustrator_person1` (`person_id` ASC) ,
  INDEX `fk_bookillustrator_book1` (`book_id` ASC) ,
  PRIMARY KEY (`book_id`, `person_id`) ,
  CONSTRAINT `fk_bookillustrator_person1`
    FOREIGN KEY (`person_id` )
    REFERENCES `person` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_bookillustrator_book1`
    FOREIGN KEY (`book_id` )
    REFERENCES `book` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `bookauthor`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `bookauthor` (
  `book_id` INT(10) NOT NULL ,
  `person_id` INT(10) NOT NULL ,
  INDEX `fk_bookauthor_person1` (`person_id` ASC) ,
  INDEX `fk_bookauthor_book1` (`book_id` ASC) ,
  PRIMARY KEY (`book_id`, `person_id`) ,
  CONSTRAINT `fk_bookauthor_person1`
    FOREIGN KEY (`person_id` )
    REFERENCES `person` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_bookauthor_book1`
    FOREIGN KEY (`book_id` )
    REFERENCES `book` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `publisher`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `publisher` (
  `id` INT(10) NOT NULL ,
  `name` VARCHAR(64) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `bookpublisher`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `bookpublisher` (
  `book_id` INT(10) NOT NULL ,
  `publisher_id` INT(10) NOT NULL ,
  INDEX `fk_bookpublisher_book1` (`book_id` ASC) ,
  INDEX `fk_bookpublisher_publisher1` (`publisher_id` ASC) ,
  PRIMARY KEY (`book_id`, `publisher_id`) ,
  CONSTRAINT `fk_bookpublisher_book1`
    FOREIGN KEY (`book_id` )
    REFERENCES `book` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_bookpublisher_publisher1`
    FOREIGN KEY (`publisher_id` )
    REFERENCES `publisher` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SQL Fiddle

关于mysql - 基于图表构建代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782609/

相关文章:

mysql - 无法创建连接 : Invalid connection details. 请验证您输入了正确的连接详细信息

MYSQL多次选择同一行

mysql - 创建表时如何禁用 DEFAULT 和 ON UPDATE

mysql - 使用 MySQL 将表列转换为表行

mysql - 如何在子查询上按日/月/年分组

mysql - 如何通过连接表只显示具有相同值的一行

mysql - 在 Laravel 迁移中,使用长度大于 255 的字符串

php - 从不同表中收集条目的 SQL 查询 - 需要 UNION 的替代方法

php - 如果 while 循环内的条件在单独工作时不起作用

PHP/MySQL 奇怪的问题影响仅当用户登录时从数据库中获取