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;
数据库逻辑模型与领域模型的异同:
同:
都是类的抽象,描述了不同实体,和不同实体之间的关系。
异:
- 领域模型用来梳理业务逻辑,识别实际存在的数据实体和逻辑上存在关系的实体。领域模型是面向对象的高层次模型,关注用例建模,关注对象行为,是一个概念的描述,属性不涉及具体类型和实现。
- 数据库逻辑模型只识别数据实体,关注数据建模,涉及到数据库的具体实现和属性的具体类型。