### 网吧计费系统数据库案例解析 #### 一、项目背景与需求概述 随着互联网技术的发展,网吧作为一种提供公共上网服务的场所,在很长一段时间内成为人们接触互联网的重要渠道之一。为了更好地管理网吧资源和服务,提高运营效率,开发一套有效的网吧计费系统变得尤为重要。本文将基于某公司开发的网吧计费系统案例,详细介绍如何利用SQL Server数据库来构建整个系统的后端支撑。 #### 二、数据库设计方案 ##### 1. 创建NetBar数据库 根据需求分析,首先需要创建一个名为`NetBar`的数据库。该数据库包含一个数据文件和一个日志文件。具体创建步骤如下: ```sql CREATE DATABASE NetBar ON PRIMARY ( NAME = 'NetBar_data', -- 逻辑文件名 FILENAME = 'D:\NetBar\NetBar_data.mdf', -- 物理文件名 SIZE = 5MB, -- 初始大小 MAXSIZE = 15MB, -- 最大大小 FILEGROWTH = 1MB -- 增量 ) LOG ON ( NAME = 'NetBar_log', -- 逻辑文件名 FILENAME = 'D:\NetBar\NetBar_log.ldf', -- 物理文件名 SIZE = 5MB, -- 初始大小 MAXSIZE = 10MB, -- 最大大小 FILEGROWTH = 1MB -- 增量 ); ``` ##### 2. 表结构设计 接下来,根据需求分析,设计三个核心表:上网卡表(`Card`)、计算机表(`Computer`)以及上机信息表(`Record`)。 - **上网卡表(Card)**:用于存储上网卡信息。 - `ID` (VarChar, 长度20):主键,不允许有相同值。 - `PassWord` (VarChar, 长度50):密码。 - `Balance` (Int):卡上余额,默认值0。 - `UserName` (VarChar, 长度50):持卡人姓名。 ```sql CREATE TABLE Card ( ID VarChar(20) NOT NULL PRIMARY KEY, PassWord VarChar(50) NOT NULL, Balance Int DEFAULT 0, UserName VarChar(50) ); ``` - **计算机表(Computer)**:用于存储计算机及其状态信息。 - `ID` (VarChar, 长度10):主键,不允许有相同值。 - `OnUse` (VarChar, 长度2):是否正在使用。 - `UnitPrice` (Int):每小时上机费用。 - `Note` (VarChar, 长度100):备注和说明信息。 ```sql CREATE TABLE Computer ( ID VarChar(10) NOT NULL PRIMARY KEY, OnUse VarChar(2) NOT NULL, UnitPrice Int NOT NULL, Note VarChar(100) ); ``` - **上机信息表(Record)**:用于存储每次上机的信息。 - `ID` (Int):主键,不允许有相同值,标识列,种子1,增量1。 - `CardID` (VarChar, 长度10):外键,引用`Card`表的`ID`字段。 - `ComputerID` (VarChar, 长度10):外键,引用`Computer`表的`ID`字段。 - `BeginTime` (DateTime):开始上机时间,默认获取当前系统时间。 - `Time` (Int):上网时长(分钟)。 - `Fee` (Int):本次上机费用。 ```sql CREATE TABLE Record ( ID Int IDENTITY(1,1) NOT NULL PRIMARY KEY, CardID VarChar(10) NOT NULL, ComputerID VarChar(10) NOT NULL, BeginTime DateTime DEFAULT GETDATE(), Time Int, Fee Int ); ``` #### 三、数据库操作与优化 根据需求,还需要进行以下数据库操作: 1. **添加约束**:为`Card`表添加约束,限制每张上网卡的余额不能超过2000元。 ```sql ALTER TABLE Card ADD CONSTRAINT CHK_Balance CHECK (Balance <= 2000); ``` 2. **设计存储过程**:实现用户上网卡的充值,并进行相应的调试。 - **存储过程实现**: - 输入参数:上网卡卡号和充值金额。 - 功能:判断充值金额不同,给予不同的优惠。 ```sql CREATE PROCEDURE dbo.RechargeCard @CardID VarChar(10), @Amount Int AS BEGIN DECLARE @Bonus Int; IF @Amount >= 500 SET @Bonus = 100; ELSE IF @Amount >= 200 SET @Bonus = 50; ELSE SET @Bonus = 0; UPDATE Card SET Balance = Balance + @Amount + @Bonus WHERE ID = @CardID; END; ``` 3. **设计存储过程**:实现会员持卡来上网的功能。 - **存储过程实现**: - 输入参数:会员上网卡卡号和所选计算机ID。 - 功能:检查卡中余额是否大于0;如果余额为0,则提示信息‘卡中余额不足,请及时充值’;如果不为0,则向`Record`表中录入相应的初始上网记录,并将该会员上网的计算机的使用状态改为‘是’。 ```sql CREATE PROCEDURE dbo.StartSession @CardID VarChar(10), @ComputerID VarChar(10) AS BEGIN DECLARE @Balance Int; SELECT @Balance = Balance FROM Card WHERE ID = @CardID; IF @Balance > 0 BEGIN INSERT INTO Record (CardID, ComputerID, BeginTime) VALUES (@CardID, @ComputerID, GETDATE()); UPDATE Computer SET OnUse = '是' WHERE ID = @ComputerID; END ELSE PRINT '卡中余额不足,请及时充值'; END; ``` 4. **设计触发器**:实现会员下机时自动统计本次上网的费用。 - **触发器实现**: - 触发条件:当更新`Record`表`Time`列时。 - 功能:根据上网时长计算费用,并在该会员卡余额中减去这次的消费金额,同时将该台计算机的使用状态改为“否”。 ```sql CREATE TRIGGER trg_CalculateFee ON Record AFTER UPDATE AS BEGIN DECLARE @Time Int, @UnitPrice Int, @CardID VarChar(10), @Fee Int; SELECT @Time = i.Time, @CardID = i.CardID, @UnitPrice = c.UnitPrice FROM inserted i JOIN Computer c ON i.ComputerID = c.ID; IF @Time < 30 SET @Fee = 1; ELSE IF @Time < 60 SET @Fee = 2; ELSE SET @Fee = CEILING(@Time / 60.0) * 2; -- 每小时2元 UPDATE Card SET Balance = Balance - @Fee WHERE ID = @CardID; UPDATE Computer SET OnUse = '否' WHERE ID IN (SELECT ComputerID FROM inserted); END; ``` 通过以上步骤,我们完成了网吧计费系统数据库的设计与实现,包括数据库的创建、表结构设计、存储过程及触发器的编写等关键环节。这些设计不仅满足了系统的基本需求,还通过优化处理提高了系统的灵活性和实用性,对于实际应用具有较高的参考价值。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助