系分 Lesson7

Posted by ONE on May 1, 2018

Lesson7:预定酒店领域模型 和 ER模型

领域模型

类图如下:

  • 按照用户的角度,从红点处开始阅读是比较符合用户操作顺序的。
  • 图中灰色背景的为中间实体,青色为数据库实体。
  • 订单信息包括:用户信息、信用卡支付信息、房间类型等,这些在订单确认后是必须保存到数据库当中的。通常web端会把reservation先暂存,购物车里的订单是不会消失的,直到用户进行了某个操作,在确认支付之前是不需要加入数据库的。
  • 房间、旅馆、地点等基础信息是数据库必须含有的静态信息。
  • 其他如购物车、summary、单个购物项都是暂存的

    E-R模型

说明:

  • 数据库几乎均以id作为主键,并引用为其他表的外键。主要是考虑到表之间的引用关系以及数据重复,所以直接以id作为外键,当需要引用其他表数据时,使用id检索可以得到全部信息
  • order_item里面的age_of_children是包含0至多个年龄的字符串,考虑到可能有多个小孩
  • 对于每个room来讲,都会有一系列的avaliable_date(比如接下来一周内的avaliable date),unavaliable就是没存在数据库当中的日期,所以avaliable date单独做表,但这样可能会造成一些数据冗余,应该有更好的设计
  • location中的type标识是City、Town还是Region,isCapital表示是否为首都。

脚本如下:

-- MySQL Script generated by MySQL Workbench
-- Tue May  1 22:23:09 2018
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

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
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema lesson7
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema lesson7
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `lesson7` DEFAULT CHARACTER SET utf8 ;
USE `lesson7` ;

-- -----------------------------------------------------
-- Table `lesson7`.`location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`location` (
  `id` INT(11) NOT NULL,
  `code` VARCHAR(45) NULL DEFAULT NULL,
  `name` VARCHAR(45) NULL DEFAULT NULL,
  `hot` INT(11) NULL DEFAULT NULL,
  `isCapital` INT(11) NULL DEFAULT NULL,
  `type` INT(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`hotel`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`hotel` (
  `id` INT(11) NOT NULL,
  `name` VARCHAR(45) NULL DEFAULT NULL,
  `description` TEXT NULL DEFAULT NULL,
  `star_index` INT(11) NULL DEFAULT NULL,
  `hot_index` INT(11) NULL DEFAULT NULL,
  `address` VARCHAR(45) NULL DEFAULT NULL,
  `location_id` INT(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `lo_idx` (`location_id` ASC),
  CONSTRAINT `lo`
    FOREIGN KEY (`location_id`)
    REFERENCES `lesson7`.`location` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`room_desc`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`room_desc` (
  `id` INT(11) NOT NULL,
  `type` VARCHAR(45) NOT NULL,
  `list_price` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`type`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`room`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`room` (
  `id` INT(11) NOT NULL,
  `number` VARCHAR(45) NULL DEFAULT NULL,
  `room_type` VARCHAR(45) NULL DEFAULT NULL,
  `hotel_id` INT(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `type_idx` (`room_type` ASC),
  INDEX `id_idx` (`hotel_id` ASC),
  CONSTRAINT `id`
    FOREIGN KEY (`hotel_id`)
    REFERENCES `lesson7`.`hotel` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `typeCon`
    FOREIGN KEY (`room_type`)
    REFERENCES `lesson7`.`room_desc` (`type`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`avaliable_date`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`avaliable_date` (
  `id` INT(11) NOT NULL,
  `room_id` INT(11) NULL DEFAULT NULL,
  `date` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `a_idx` (`room_id` ASC),
  CONSTRAINT `a`
    FOREIGN KEY (`room_id`)
    REFERENCES `lesson7`.`room` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`reservation`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`reservation` (
  `id` INT(11) NOT NULL,
  `total` VARCHAR(45) NULL DEFAULT NULL,
  `check_in` VARCHAR(45) NULL DEFAULT NULL,
  `check_out` VARCHAR(45) NULL DEFAULT NULL,
  `customer_name` VARCHAR(45) NULL DEFAULT NULL,
  `customer_email` VARCHAR(45) NULL DEFAULT NULL,
  `customer_gender` VARCHAR(45) NULL DEFAULT NULL,
  `customer_is_smoke` VARCHAR(45) NULL DEFAULT NULL,
  `customer_special_requirements` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `lesson7`.`order_item`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lesson7`.`order_item` (
  `id` INT(11) NOT NULL,
  `number_of_adults` VARCHAR(45) NULL DEFAULT NULL,
  `number_of_children` VARCHAR(45) NULL DEFAULT NULL,
  `age_of_children` VARCHAR(45) NULL DEFAULT NULL,
  `room_id` INT(11) NULL DEFAULT NULL,
  `reservation_id` INT(11) NULL DEFAULT NULL,
  `order_itemcol` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `rooid_idx` (`room_id` ASC),
  INDEX `resid_idx` (`reservation_id` ASC),
  CONSTRAINT `resid`
    FOREIGN KEY (`reservation_id`)
    REFERENCES `lesson7`.`reservation` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `rooid`
    FOREIGN KEY (`room_id`)
    REFERENCES `lesson7`.`room` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

数据库逻辑模型与领域模型的异同:

同:

都是类的抽象,描述了不同实体,和不同实体之间的关系。

异:

  • 领域模型用来梳理业务逻辑,识别实际存在的数据实体和逻辑上存在关系的实体。领域模型是面向对象的高层次模型,关注用例建模,关注对象行为,是一个概念的描述,属性不涉及具体类型和实现。
  • 数据库逻辑模型只识别数据实体,关注数据建模,涉及到数据库的具体实现和属性的具体类型。