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


    在电影院票务管理系统数据库设计(1)中我们从一道面试题展开,最后给出如下影院票务管理系统的表关系图

    ThirdEditionDesignWithSeat

    以上的设计是否易用?

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

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

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

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

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

    FourthEditionDesignDeleteOrderHead

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

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

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

    统计一下票房收入

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

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

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

    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;

  • 相关阅读:
    scp 一个最简单的Linux 数据copy
    ORA-65096: invalid common user or role 解决方法
    SQL Server 查询 数据库 & 表格 大小
    SQL Server 配置 Job 监控 tempdb 变化
    SQL Server 邮箱告警配置
    浅谈 SQL Server 中的等待类型(Wait Type)
    Oracle 常用命令大全(持续更新)
    连接Oracle 12c R2 报错ORA-28040:No matching authentication protocal
    Oracle 数据库启动和关闭
    SQL Server 日志收缩方法
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1785126.html
Copyright © 2020-2023  润新知