这两天听到一道面试题:设计一个电影院票务管理系统的表结构。

挺有意思的,我自己也试着做了一做,感觉还是有不少收获的。在本文中我想把做这道题的整个思路重新理一下,也算做个整理了。

现在能得到的需求只有一个:设计一个电影院票务管理系统的表结构。再没有其他信息了,可能真的面试的时候面试官还会给出其他业务需求,但我这里没有。

所以我只能猜测可能的业务需求会有哪些。

最初想到的:

1. 电影院会有多个播放厅,从而在同一时间播放不同的电影来满足客户需求

2. 每个厅的大小可能不同,即容纳的人数不同

3. 电影院会不断引进新片

4. 电影院会把电影安排在各个播放厅的不同时间段来进行播放,即会有一个排片表

5. 一个客户可能买一张或多张电影票,这些电影票可能会是不同厅,不同场次的电影

对于以上的需求设计中应该会有一张存放电影的表(Table_Movie),一张存放影院各个厅信息的表(Table_Hall)。

还应有一张排片表,其中会包含两个外键分别指向Table_Movie的主键和Table_Hall的主键,还有时间、价格等信息。

对于用户买票的需求,使用经典ERP订单结构来设计就行了,即会有Table_OrderHead,Table_OrderDetail表。

简单表关系图如下:

这一设计需要注意的有两点:

1. 票价信息存储在Table_Schedule中(Schedule_Price列),即影片在不同时间段和不同厅中播放票价可以不同。

2. Table_OrderDetail中有外键Schedule_ID指向Table_Schedule。

加入会员信息

如上设计已满足最初提出的5点需求。但这样的电影院无法办会员卡,也就没法打折了。为了与其他影院竞争提供会员卡功能,即:

6. 影院应提供会员卡功能,根据会员卡的等级,给予不同的折扣

对于这一需求加入一张会员信息表Table_Customer显得很自然,同时为了能根据不同等级给予不同的折扣,需要再加一张等级表Table_Class

简单表关系图如下:

需要注意的是:

1. Table_Customer中外键Class_ID指向Table_Class

2. 我给Table_Class加了一个Class_IsActive列,当一个会员等级无效时只要置标签,而无需做删除操作

3. Table_OrderHead中加了一列Customer_ID,我把该列的默认值设为-1。当非会员顾客买票时,改列值即为-1,当会员买票时,该列值为在Table_Customer中对应的Customer_ID

4. Table_OrderDetail中加了一列OrderDetail_AdjustedPrice,该列可以不加,出于方便的考虑,我还是加了此列。对于会员该列值为原票价打折后的值,即Schedule_Price * Class_Discount,对于非会员该列为原票价

再进一步思考

以上做的设计作为面试题的解答,应该差不多了,所有前面提到的6点需求已满足。

但这是否真的满足实际影院的需求呢?

我的答案是否定的,其中有一个很致命的缺陷,我们的设计中没有包含座位号。

系统出的票只知道什么时间,哪个厅,什么电影,但没有座位号,顾客只能去抢位子了。

那我们再加一条需求:

7. 顾客可以在买票时选择座位

对于这一需求,我们直接来看表关系图

如上设计增加了Table_Seat和Table_OrderSeat两张表,改动比较小。

需要注意的有:

1. Table_Seat中的外键Hall_ID指向Table_Hall

2. Table_Seat中除包含座位的排数(Seat_Row)和列数(Seat_Column)外,还包含Seat_IsActive列来表示此座位是否可用,如果座位坏了,这个位子的票就不应该卖

3. Table_OrderSeat中OrderDetail_ID,Seat_ID为联合主键,同时OrderDetail_ID为外键指向Table_OrderDetail的OrderDetail_ID列

4. Table_OrderDetail中的OrderDetail_Qty列被删除了,从Table_OrderSeat中可以计算此值

最后给出如下影院票务管理系统的表关系图

以上的设计是否易用?

首先想一下订票最简单的过程,不包括意外情况。

  1. 顾客先来到柜台,跟柜台服务员说要买哪场电影的哪几个空位的票
  2. 服务员创建一个订单(在Table_OrderHead中插入一条记录)
  3. 若顾客为会员,刷会员卡(Update Table_OrderHead中的Customer_ID的值)
  4. 服务员选择顾客指定场次的多个位子
  5. 服务员点击出票(在Table_OrderDetail和Table_OrderSeat中插入相应记录)
  6. 若顾客还需要买其他场次的电影,重复步骤4~5

想了一下这个过程,我自己感觉步骤1比较累赘,服务员每次都需要创建一个空订单头,之后才真正开始选位出票,比较麻烦。

而且如果在选位子之前,顾客突然决定不看电影了,服务员必须把前面创建的订单头删除,否则会在系统中留下孤立的OrderHead记录,会破坏数据完整性。

同时想到平日自己去电影院买票时,服务员都是直接选位子出票的,所以我们修改设计如下:

现在系统的订票流程如下:

  1. 顾客先来到柜台,跟柜台服务员说要买哪场电影的哪几个空位的票
  2. 服务员选择顾客指定场次的多个位子
  3. 若顾客为会员,刷会员卡
  4. 服务员点击出票
  5. 若顾客还需要买其他场次的电影,重复步骤2~4

这个流程去除了每次服务员创建订单的动作,简化了最一般的情况,即顾客买某场电影的多张票。但若顾客要买多场电影的票时,需要多次刷会员卡,这里变麻烦了但这种情况不多,我觉得这更符合影院的实际需求。

统计一下票房收入

统计某段时间内,某部电影总共销售收入应该是比较常见的需求,我们用T-SQL来实现这一需求。

输入:电影ID(@MovieID),起始时间(@StartDate),终止时间(@EndDate)

输出:总票房收入(@TotalBoxOffice)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
if object_id(N'Proc_GetBoxOffice') is not null
begin
    drop procedure dbo.Proc_GetBoxOffice;
end
go
create procedure dbo.Proc_GetBoxOffice
    @MovieID int,
    @StartDate datetime,
    @EndDate datetime,
    @TotalBoxOffice money output
as
if @MovieID is null
begin
    raiserror('@MovieID is null in Proc_GetBoxOffice', 16, 1);
end
if @StartDate is null
begin
    raiserror('@StartDate is null in Proc_GetBoxOffice', 16, 1);
end
if @EndDate is null
begin
    raiserror('@EndDate is null in Proc_GetBoxOffice', 16, 1);
end
;With OrderTotalAmount as
(
    select
        OrderInfo.Order_ID,
        OrderInfo.Order_AdjustedPrice * count(*) as OrderTotalAmount
    from
        dbo.Table_Order OrderInfo
        inner join
        dbo.Table_Schedule Schedule
        on
            OrderInfo.Schedule_ID = Schedule.Schedule_ID
        inner join
        dbo.Table_OrderSeat OrderSeat
        on
            OrderInfo.Order_ID = OrderSeat.Order_ID
    where
        OrderInfo.Order_BuyDate >= @StartDate
        and
        OrderInfo.Order_BuyDate < dateadd(day, 1, convert(varchar(10), @EndDate, 120))
        and
        Schedule.Movie_ID = @MovieID
    group by
        OrderInfo.Order_ID,
        OrderInfo.Order_AdjustedPrice
)
select
    @TotalBoxOffice = sum(OrderTotalAmount)
from
    OrderTotalAmount;

电影院票务管理系统数据库设计相关推荐

  1. 电影院票务管理系统数据库设计(1)

    这两天听到一道面试题:设计一个电影院票务管理系统的表结构. 挺有意思的,我自己也试着做了一做,感觉还是有不少收获的.在本文中我想把做这道题的整个思路重新理一下,也算做个整理了. 现在能得到的需求只有一 ...

  2. 电影院票务管理系统数据库设计(2)

    在电影院票务管理系统数据库设计(1)中我们从一道面试题展开,最后给出如下影院票务管理系统的表关系图 以上的设计是否易用? 首先想一下订票最简单的过程,不包括意外情况. 顾客先来到柜台,跟柜台服务员说要 ...

  3. 学生成绩管理系统数据库设计--MySQLSQL Server

    MySQL 数据库设计-学生成绩管理系统 设计大纲 友情链接 1.医疗信息管理系统数据库–MySQL 2.邮件管理数据库设计–MySQL 3.点餐系统数据库设计–SQL Server 4.商品管理系统 ...

  4. [开题报告+任务书+论文+源码]基于Android平台的合肥市景区移动票务管理系统的设计与实现

    毕 业 设 计(论 文) 开 题 报 告 论文(设计)题目 基于ANDROID的合肥市景区移 动票务管理系统的设计和实现 院系名称 计算机科学与技术系 专业(班级) 计算机科学与技术 姓名(学号) 指 ...

  5. 固定资产管理mysql_固定资产管理系统数据库设计

    固定资产管理系统数据库设计 如何看待固定资产管理系统数据库设计呢?近年来越来越多的企业在资产管理方面投入着更多的精力,主要就是因资产管理是企业生产经营活动中比较重要的环节.而其中固定资产又是企业中资产 ...

  6. 医院管理系统数据库设计

    医院管理系统数据库设计 数据库名:hisdb 一基本信息表 1.科室表(keshi) 字段名 中文名 类型 能否为空 备注 ID 科室编号 Int N 主键,自增 Name 科室名称 Varchar ...

  7. 毕业设计管理系统 数据库设计

    毕业设计管理系统 数据库设计 一.需求分析 1.1 可行性分析 1.1.1经济可行性 该管理系统的设计使用的是 Microsoft SQL Server2016数据库开发平台进行代码编写.运行和调试, ...

  8. 学生管理系统的mysql数据库设计_MySQL数据库--学生管理系统数据库设计

    目录 学生管理系统数据库设计 学生管理系统功能介绍 数据库设计步骤 第1步: 找对象 第2步:找属性 第3步: 找关系 建表原则 第4步: 找特例: 等级明显而且不包含敏感数据的信息建议保持为1张表 ...

  9. 权限管理系统数据库设计的简单构思

    最近在工作中接触到权限管理的设计,于是,自己在网上查阅了部分资料,再加上自己的一些思考,构思了一个简单的权限管理系统的数据库设计. RBAC与Tag 说到权限管理,一般都会想到基于角色的访问控制(Ro ...

  10. 用Mysql做个人信息管理系统_个人信息管理系统数据库设计精选.doc

    个人信息管理系统数据库设计精选 河海大学计算机及信息工程学院(常州) 数据库课程设计 学年学期 2012第二学期 项目名称 个人信息管理 项目组员 曹清云.陈天昊 指导教师 景雪琴 组号:8 目 录 ...

最新文章

  1. 游戏 Github Page
  2. mysql 和 sqlserver中备份一张表的区别
  3. 贪吃蛇游戏(c/c++)
  4. PHPCMS v9 安全防范教程!
  5. Svn正确的使用方法
  6. Visual C++中的异常处理浅析(上)
  7. HDU1512 (左偏树)
  8. linux加密框架 crypto 算法管理 - 创建哈希算法实例
  9. 基于asp.net的音乐分享网站的设计与实现(含源文件)
  10. php的floorval函数,php 取整函数(floor,ceil,round,intval)_PHP教程
  11. Oracle的锁表与解锁
  12. 关于C语言的指针、链表的原理和各类操作
  13. termux安装python2_termux怎么安装python
  14. 开源python爬虫软件下载_33款可用来抓数据的开源爬虫软件工具
  15. 【STM32】ADC的DMA方式采集(16通道)
  16. 为什么说视频号是下一个短视频风口?
  17. Koo叔说Shader—果冻效果
  18. 能不吃最好别吃:一个食品专业本科生的自白
  19. 【方案开发】汽车充气枪打气泵方案
  20. 相容/不相容非齐次线性方程组的最小二乘解与最佳最小二乘解

热门文章

  1. 基于Python将图片转换成素描图片
  2. JAVA透视相机安卓_透视相机下载安卓版
  3. 关于refresh token的总结
  4. 智能语音识别--方案实现--具体过程
  5. 爬虫笔记34:mongodb的概述(安装和启动)、基本命令、练习题
  6. python网课一般多少钱-十大python零基础编程在线网课一对一费用多少钱
  7. int数组java,java定义int数组
  8. 苹果产品信息查询_不知道的细节 苹果官网
  9. python数据表盘_构建一个简单地分析表盘
  10. drupal 7宝典_为Drupal 7建立新主题