资讯详情

资讯详情

高校运动会管理系统数据库课设:从建表到触发器完整实现

简介这份数据库课程设计文档面向高校计算机相关专业学生围绕「高校运动会管理系统」这一经典选题提供从需求分析到数据库实施维护的完整设计思路适合正在准备课程设计或数据库原理实践的学习者参考。压缩包内仅含1个doc文件约187KB以文字与图表结合的方式组织内容便于直接阅读和借鉴。文档系统梳理了赛前准备、赛中管理、赛后处理三大业务模块并依次展开需求分析、概念设计、逻辑设计与物理设计涵盖学校、部门、老师、学生、比赛项目、赛程安排、比赛结果等实体的E-R图与关系模式以及各数据表的字段定义、视图索引触发器创建、存储结构确定和运行维护方案。目前已有175人学习读者可借此掌握数据库设计的标准流程与文档撰写规范快速搭建符合课程要求的运动会管理系统方案。1. 一份能直接跑通的高校运动会管理系统数据库课设文档每年一到数据库课程设计选题总有一批人栽在“高校运动会管理系统”上——不是题目太难而是网上能搜到的资料要么只有几张 E-R 图要么代码跑不起来SQL Server 版本对不上建表语句里还夹着一堆乱码。这份《高校运动会管理系统_数据库课程设计.doc》算是少见的完整版从需求分析、概念设计、逻辑设计一路写到物理存储、触发器、存储过程连数据字典的字段长度和取值范围都列全了。它解决的不是“教你数据库原理”而是让你在两周内交出一份能演示、能答辩、能跑通增删改查的课设。适合正在做数据库课程设计的学生也适合需要快速搭一套运动会信息管理原型的开发者。下面我按“这份文档里到底有什么、怎么落地、哪里会翻车”拆开讲。2. 需求到数据字典把三大业务模块拆成可建表的数据项2.1 赛前、赛中、赛后三段式业务怎么映射成表这份文档最值钱的地方是它没有一上来就甩 E-R 图而是先把运动会业务切成三段赛前准备、赛中管理、赛后处理。这个切法直接决定了后面表结构怎么分。赛前准备负责比赛规程发布、运动员报名、编号、分项目分组分道输出的是运动员对照表和工程分组表。对应到数据层就是“运动员”表和“分组分道表”要能承载报名信息和编排结果。赛中管理负责成绩录入、名次裁定、决赛生成对应“工程成绩表”和“比赛工程表”的预赛/决赛时间字段。赛后处理负责成绩查询、团体总分统计、奖牌榜、破纪录情况对应“班级总分表”和“工程记录表”。我一般会先画一张业务-表映射关系确认每个业务动作都有落点再动手写 CREATE TABLE。文档里给出的 8 张表——用户、比赛工程表、工程成绩表、班级总分表、工程记录表、运动员、分组分道表、运动员对照表——基本覆盖了这三段流程。缺一张某个业务动作就没地方存数据。2.2 数据字典里的字段类型和长度别照抄要对照文档第 2.6 节列了 8 张表的数据项定义包括别名、数据类型、长度、取值范围。这部分是建表语句的直接依据但有几个地方需要留意。比如“工程成绩表”里预赛成绩ys_cj定义为CHAR(8)预赛排名ys_pm定义为CHAR(4)决赛排名js_pm定义为CHAR(4)但取值范围写的是“汉字或数字”。这里就有矛盾排名用 CHAR 存数字排序时会按字符串比较出现“10”排在“2”前面的经典问题。我一般会把排名类字段改成INT成绩类字段如果只存秒数可以改DECIMAL要存“1:23.45”这种格式再保留VARCHAR。再比如“运动员”表里学号stu_xh定义为CHAR(12)并作为主键这个长度对大多数学号是够的。但文档里“运动员”表同时有stu_xm1和stu_xm2两个报名字段意味着一个运动员最多报两项。如果实际比赛允许报三项这个设计就卡死了。常见做法是拆一张“报名表”用运动员编号项目编号做联合主键扩展性更好。文档在关系模式里确实有“报名运动员编号工程编号比赛细则人数限制”但建表语句里没体现这里需要自己补上。2.3 从 E-R 图到关系模式的转换检查文档第 3 章给了 E-R 图和关系模式第 4.1 节列出了转换结果。我对照了一遍有几个转换点值得注意。学校与比赛工程是 1:N 关系转换后在比赛工程表里加“学校编号”作为外键这个没问题。运动员与运动队是 N:1转换后在运动员表里加“运动队编号”也合理。但“成绩”这个实体在 E-R 图里属性是“等级、排名”转换后关系模式写的是“成绩等级排名用户名密码”——用户名和密码明显是从“用户”实体串过来的这里关系模式写混了。实际建表时成绩应该关联运动员编号和项目编号而不是关联用户。另外“裁判员”和“比赛工程”之间的“裁决”联系转换后是“裁决裁判员编号工程编号裁决人”这个可以独立成表也可以合并到裁判员表里加项目编号字段。文档选择独立成表适合一个裁判执裁多个项目的情况。提示E-R 图转关系模式时1:N 联系把 1 端主键放到 N 端做外键M:N 联系必须独立成表。文档里“报名”和“参加”都是 M:N但建表语句里只建了部分表需要自己补齐。3. 建库建表到触发器SQL Server 脚本逐段拆解与参数修正3.1 建库语句的 filegrowth 和 maxsize 怎么调文档 4.2 节给了完整的建库语句我把它整理成可直接执行的版本-- 创建数据库主数据文件、次要数据文件、日志文件分开存放 CREATE DATABASE Student ON ( name Student_data1, filename e:\Student_data1.mdf, size 20MB, filegrowth 1MB ), ( name Student_data2, filename e:\Student_data2.ndf, size 10MB, maxsize 100MB, filegrowth 1MB ) LOG ON ( name Student_log, filename e:\Student_log.ldf, size 5MB, filegrowth 10% );这段语句的逻辑是主数据文件初始 20MB每次增长 1MB次要数据文件初始 10MB上限 100MB每次增长 1MB日志文件初始 5MB按 10% 比例增长。参数上要注意两点一是filename路径要改成你本机存在的盘符否则报“操作系统错误 3”二是filegrowth用固定值还是百分比取决于数据增长节奏课设演示用固定值更可控。3.2 八张表的 CREATE TABLE 与主外键约束文档给出的建表语句有几处语法问题比如[自动编号](8)不是合法类型SQL Server 里应该用INT IDENTITY(1,1)。我按文档意图修正后挑三张核心表说明-- 用户表主键 yh_id密码字段用于登录校验 CREATE TABLE [dbo].[用户] ( [yh_id] CHAR(8) NOT NULL, [yh_name] CHAR(20) NULL, [yh_mima] CHAR(20) NULL, PRIMARY KEY (yh_id) ); -- 比赛工程表主键 xm_id预赛和决赛时间分开存 CREATE TABLE [dbo].[比赛工程表] ( [xm_id] CHAR(8) NOT NULL, [xm_name] CHAR(20) NULL, [xm_lx] CHAR(12) NULL, [xmys_sj] DATETIME NULL, [xmjs_sj] DATETIME NULL, PRIMARY KEY (xm_id) ); -- 工程成绩表主键 ydy_id 自增外键关联比赛工程 CREATE TABLE [dbo].[工程成绩表] ( [ydy_id] INT IDENTITY(1,1) NOT NULL, [xm_id] CHAR(8) NULL, [xm_name] CHAR(20) NULL, [ys_cj] CHAR(8) NULL, [ys_pm] CHAR(4) NULL, [js_cj] CHAR(8) NULL, [js_pm] CHAR(4) NULL, PRIMARY KEY (ydy_id), FOREIGN KEY (xm_id) REFERENCES 比赛工程表(xm_id) );参数说明IDENTITY(1,1)表示自增起始值 1、步长 1替代文档里的“自动编号”。外键FOREIGN KEY (xm_id) REFERENCES 比赛工程表(xm_id)要求被引用列必须是主键或唯一键所以比赛工程表必须先建。建表顺序建议用户 → 比赛工程表 → 运动员 → 工程成绩表 → 分组分道表 → 班级总分表 → 工程记录表 → 运动员对照表。3.3 视图、索引、触发器的实际作用文档 4.3 节给了视图、索引和触发器的示例。视图部分-- 创建用户信息视图只暴露编号、姓名、密码 CREATE VIEW v_yh AS SELECT yh_id, yh_name, yh_mima FROM dbo.用户;视图的作用是简化查询和权限控制比如给一般用户只开放视图查询不直接查基表。索引部分文档写的是create unique index Pk_yh on yh(mima)这里有两个问题一是对密码字段建唯一索引不合理密码可能重复二是Pk_yh命名像主键但实际是唯一索引。我一般会对工程成绩表(xm_id)和运动员(stu_xh)建非聚集索引加速按项目查成绩和按学号查运动员。触发器部分文档写了一个密码长度校验-- 插入或更新用户时检查密码长度是否小于6位 CREATE TRIGGER tri_yh ON [dbo].[用户] FOR INSERT, UPDATE AS DECLARE mima_read CHAR(20); SELECT mima_read yh_mima FROM INSERTED; IF LEN(mima_read) 6 BEGIN PRINT 密码小于六位请重新输入。; ROLLBACK TRANSACTION; END逻辑说明INSERTED是触发器里的临时表存放刚插入或更新的行。LEN()取字符长度小于 6 就回滚。参数上注意文档原文写的是IF mima_read 6这是错的应该是LEN(mima_read) 6。另外多行插入时SELECT mima_read yh_mima FROM INSERTED只取最后一行严格来说应该用EXISTS判断。3.4 存储过程的参数传递与调用文档第 5 章给了一个存储过程Pro_n用于按密码查用户-- 按密码查询用户编号和密码 CREATE PROCEDURE Pro_n mima_in CHAR(20) AS SELECT yh.yh_mima AS 密码, yh.yh_id AS 用户编号 FROM 用户 yh WHERE yh.yh_mima mima_in;调用方式EXEC Pro_n 123456;。参数mima_in是输入参数类型和长度要和表字段一致。这个存储过程适合登录校验场景但实际登录应该用用户名密码联合查询单靠密码查用户不安全。4. 避坑排查课设从建表到演示最容易翻车的五处4.1 建表报“外键引用无效”现象执行CREATE TABLE 工程成绩表时报错“外键 FK__工程成绩表__xm_id 引用了无效的表 比赛工程表”。原因被引用的表还没建或者表名拼写不一致。SQL Server 默认 schema 是dbo如果建表时用了[dbo].[比赛工程表]引用时也要带dbo。解决按依赖顺序建表先建被引用表。或者先建所有表不加外键最后用ALTER TABLE ADD CONSTRAINT补外键。4.2 中文表名和字段名在查询时乱码现象建表时用了中文表名查询时提示“对象名 用户 无效”或者字段值显示成问号。原因数据库排序规则不是中文或者连接字符串没指定字符集。SQL Server 2005 默认排序规则可能是SQL_Latin1_General_CP1_CI_AS对中文支持不好。解决建库时指定COLLATE Chinese_PRC_CI_AS或者建表时对中文字段用NVARCHAR替代CHAR/VARCHAR。4.3 触发器导致插入失败但看不到原因现象插入用户数据时提示“密码小于六位”但明明密码是 8 位。原因触发器里SELECT mima_read yh_mima FROM INSERTED在多行插入时只取最后一行如果批量插入中有一行密码短整个事务回滚。解决改用IF EXISTS (SELECT 1 FROM INSERTED WHERE LEN(yh_mima) 6)判断或者在前端做校验触发器只做兜底。4.4 自增主键在插入时被显式赋值报错现象执行INSERT INTO 工程成绩表 (ydy_id, xm_id) VALUES (1, XM001)报错“当 IDENTITY_INSERT 设置为 OFF 时不能向表 工程成绩表 中的标识列插入显式值”。原因ydy_id是IDENTITY列默认不允许手动赋值。解决插入时不要写ydy_id让它自动生成。如果确实需要指定值先执行SET IDENTITY_INSERT 工程成绩表 ON插入后记得SET IDENTITY_INSERT 工程成绩表 OFF。4.5 存储过程参数长度不匹配导致查不到数据现象EXEC Pro_n 123456返回空结果但表里确实有密码为123456的用户。原因存储过程参数定义为CHAR(20)传入123456会被填充空格到 20 位而表里存的是CHAR(20)也可能有尾随空格比较时可能不匹配。解决参数用VARCHAR(20)替代CHAR(20)或者在比较时用RTRIM()去掉尾随空格。5. 从课设文档到可演示系统补全报名表和成绩统计查询5.1 补一张报名表解决一人多项报名的扩展问题文档里运动员表只有stu_xm1和stu_xm2两个报名字段实际比赛一个运动员可能报三项甚至更多。我一般会补一张报名表-- 报名表运动员和比赛工程的多对多关系 CREATE TABLE [dbo].[报名表] ( [bm_id] INT IDENTITY(1,1) NOT NULL, [ydy_id] INT NOT NULL, [xm_id] CHAR(8) NOT NULL, [bm_time] DATETIME DEFAULT GETDATE(), PRIMARY KEY (bm_id), FOREIGN KEY (ydy_id) REFERENCES 运动员(stu_xh), FOREIGN KEY (xm_id) REFERENCES 比赛工程表(xm_id) );这样报名逻辑变成往报名表插记录查某个运动员报了几项用COUNT(*)查某个项目有多少人报名也用COUNT(*)。参数上bm_time默认取当前时间方便统计报名截止情况。5.2 团体总分统计的 SQL 怎么写赛后处理里最核心的是团体总分统计。文档里“班级总分表”有xm_df工程得分和bj_zf班级总分但没给统计 SQL。我一般这样写-- 按班级统计总分只取前八名得分 SELECT y.bj_name AS 班级, SUM(CASE WHEN g.js_pm 1 THEN 9 WHEN g.js_pm 2 THEN 7 WHEN g.js_pm 3 THEN 6 WHEN g.js_pm 4 THEN 5 WHEN g.js_pm 5 THEN 4 WHEN g.js_pm 6 THEN 3 WHEN g.js_pm 7 THEN 2 WHEN g.js_pm 8 THEN 1 ELSE 0 END) AS 团体总分 FROM 工程成绩表 g JOIN 运动员 y ON g.ydy_id y.stu_xh GROUP BY y.bj_name ORDER BY 团体总分 DESC;逻辑说明CASE WHEN把决赛排名映射成得分前八名分别得 9、7、6、5、4、3、2、1 分。JOIN把成绩表和运动员表关联起来按班级分组求和。参数上注意js_pm如果存的是CHAR类型比较时要写1而不是1。5.3 破纪录情况查询与奖牌榜生成破纪录查询需要关联“工程记录表”和“工程成绩表”比较决赛成绩是否优于原纪录-- 查询破纪录的运动员和项目 SELECT y.stu_name AS 运动员, x.xm_name AS 项目, j.xm_jl AS 原纪录, g.js_cj AS 新成绩 FROM 工程记录表 j JOIN 比赛工程表 x ON j.xm_id x.xm_id JOIN 工程成绩表 g ON j.xm_id g.xm_id JOIN 运动员 y ON g.ydy_id y.stu_xh WHERE g.js_cj j.xm_jl;奖牌榜按班级统计金、银、铜牌数用SUM(CASE WHEN ...)分别计数即可。这两个查询跑通答辩演示基本够用。5.4 验证方法用样例数据跑一遍全流程建完表、补完报名表和统计 SQL 后插入几条样例数据验证先插比赛工程再插运动员再插报名记录再插成绩最后跑团体总分查询和破纪录查询。如果每一步都有结果返回说明表结构和关联关系没问题。我习惯把这一套写成INSERT脚本答辩前跑一遍比现场手输稳得多。从那以后我每次拿到课设文档都先把建表语句复制到 SQL Server 里跑一遍报错的地方就是文档和实际环境的差异点改完再往下做。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →