运用设计模式设计一个票务系统(数据库设计)

418 阅读5分钟

数据库设计

业务分析与设计表

这个课主要是为了深化设计模式的理解,所以业务不必写太多,表的字段能完成基本功能就行。

票务系统,肯定是需要用户表来存储用户信息。因此, 先设计user表: 所需要的字段有id(主键),name(用户名), password, status(标识用户身份)。

CREATE TABLE sys_user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL, 
  password VARCHAR(50) NOT NULL,
  status VARCHAR(50) NOT NULL,
);

我的这个项目需要售卖三种票: 飞机,火车,大巴。这三种乘坐方式也需要建立表。

CREATE TABLE ticket (
  id INT PRIMARY KEY AUTO_INCREMENT,
  type VARCHAR(20) NOT NULL, 
  origin VARCHAR(50) NOT NULL,
  destination VARCHAR(50) NOT NULL,
  departure_time DATETIME NOT NULL,
  arrival_time DATETIME NOT NULL,
  price DECIMAL(10, 2) NOT NULL,
  is_sale Integer Not NULL
);

type(票的类型), origin(出发地), destination(目的地), departure_time(出发时间), arrival_time(到达时间), price(票价), is_sale(是否已售出)。

然后创建订单表,当用户购买票时,需要将购票信息存储到订单表中;又或者退票时,需要删除订单。

代码如下:

CREATE TABLE `sys_order` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  `purchase_time` DATETIME NOT NULL,
  `ticket_id` INT NOT NULL,
  `price` DECIMAL(10, 2) NOT NULL,
  FOREIGN KEY (`ticket_id`) REFERENCES `sys_ticket`(`id`),
  FOREIGN KEY (`user_id`) REFERENCES `sys_user`(`id`)
);

在这个表中,id 字段是订单的唯一标识符,user_id 字段是用户的唯一标识符,ticket_id 字段是票的唯一标识符,price 字段是订单的总价。这个表还包括一个外键,将 ticket_id 字段与 ticket 表关联起来,以确保每个订单都对应着一张票;将 user_id 字段与 user 表关联起来,以确保每个订单都对应着一个用户。

项目目前这几张表应该差不多了, 后面添加我会修改文章。

正确的设计表

上面我设计的表是很水的,因为这个作业重点偏向于设计模式,所以我主要是对设计模式的书写;防止误导,我觉得还是把正确的设计思路写给大家。

阿里云有一套数据库设计规范,主要内容如下:

  1. 数据库表名、字段名、索引名使用小写字母,单词之间使用下划线分隔,不使用复数形式。(sys_user,我的数据库表名加前缀更主要的目的是方便代码生成时筛选表)
  2. 数据库表必须有主键,且主键必须是单一字段。(使用id作为主键)
  3. 数据库表中不允许使用外键,如有需要,由应用层控制。(一般是使用逻辑外键)
  4. 数据库表中必须有注释,注释内容包括表的作用、字段的作用、字段的取值范围等信息。
  5. 数据库表中不允许使用 NULL 值,除非该字段为可选字段。
  6. 数据库表中不允许使用 TEXT、BLOB 类型,因为该类型不支持索引,无法保证查询效率。
  7. 数据库表中不允许使用外部联合主键,因为该类型会导致表的横向扩展和性能问题。

举个例子,假设我们有两个表:订单表(orders)和订单商品表(order_items)。订单表中包含订单号(order_id)和用户ID(user_id)等字段,订单商品表中包含订单号(order_id)、商品编号(item_id)和商品数量(quantity)等字段。为了建立订单和订单商品之间的关联关系,我们可以将订单号(order_id)和商品编号(item_id)作为外部联合主键,这样就可以保证每个订单商品记录都唯一对应一个订单。当然,这是被禁止的)

  1. 数据库表中必须有自增主键,不允许使用业务无关的复合主键。
  2. 数据库表中不允许使用 SELECT * 语句,应该明确指定需要查询的字段。
  3. 数据库表中不允许使用存储过程、触发器等数据库功能,应该由应用层控制。

解释:数据库表中允许使用存储过程、触发器等数据库功能,但是在实际项目中,为了提高系统的可维护性和可扩展性,通常会将这些功能转移到应用层控制。 一方面,将存储过程、触发器等功能移到应用层控制可以提高系统的可维护性。在应用层中,可以使用版本控制工具对代码进行管理,方便团队合作开发和维护。而在数据库中,存储过程、触发器等功能的修改和维护比较困难,容易影响数据库的稳定性和可用性。
另一方面,将存储过程、触发器等功能移到应用层控制还可以提高系统的可扩展性。如果将这些功能放在数据库中,会对数据库的性能和可伸缩性产生影响,而将这些功能放在应用层中,可以根据实际情况灵活调整应用的部署和扩展方式,提高系统的可扩展性。)

  1. 数据库表中应该添加适当的索引,以提高查询效率,但是不应该添加过多的索引,以避免影响写入性能。

  2. 数据库表的设计应该考虑到数据的规模,使用正确的数据类型,避免数据溢出和性能问题。(比如用户民最长16位,没有特殊要求的话开空间就只用开到16位。)


下一篇,运用设计模式设计一个票务系统(工厂模式使用) - 掘金 (juejin.cn)