数据库编程作业(“实验室PM”)
查尔默斯/GU TDA357/DIT620
2018年LP3
由Aarne Ranta根据Chalmers和GU许多其他教师早年的规范进行修改
目的
本作业的目的是让你亲身体验为现实世界中类似的领域设计、构建和使用数据库。你会了解数据库创建的各个方面,从了解域到使用来自外部应用程序的最终数据库。
作业提交和截止日期
要通过编程作业,您必须通过上描述的所有五项任务本页。你将以两人一组的形式完成作业。
您必须通过火灾报告系统。
您必须按照给定的截止日期,在课程网页.提交后,你的作业将被评分(“通过”或“拒绝”),你将收到关于您的解决方案的评论(针对任务1、2和3)。如果您的提交被拒绝,您可以完善解决方案并重新提交将会有一套自动测试来对你的作业进行初步评分。
要通过作业的最后一部分,您必须演示您的系统其中一位老师。任务4的文件必须上传至消防系统之后您已经演示了您的系统,并且之前任务4截止日期。
介绍
在本作业中,你将设计和构建一个数据库,以及一个前端应用程序,用于处理大学生和课程。你会分四个不同的任务执行此操作:
- 构建:创建数据库并使用查询进行浏览
- 设计:退一步,从更理论的角度重新设计数据库
- 用法:定义更多约束和触发器以维护数据库
- 接口:编写包装程序以允许在不显式使用SQL的情况下访问数据库
所有任务都相互关联。它们处理相同的数据库,任务3和任务1构建的任务4。任务2是对任务1的独立分析和健全性检查。(往年,设计任务2比施工任务1早。我们交换订单有两个原因:
- 设计比建筑更像是理论活动,没有事先的实践很难完全理解
- 基于通用模式的构造,而不是每个人自己的设计,允许比以前更实质性的自动检查
对于每项任务,你都将提交并获得结果反馈。自一项任务中的错误可能会传播到下一项任务,明智的做法是交出尽早解决问题,以获得更多反馈机会。
确保在阅读作业的完整描述之前因为我们对系统的要求必须影响您的初始设计也是如此。
域描述
你将在本作业中建模的领域是课程和一所大学的学生。以免任务太大未指定,您将在此处获得该域的描述在一定程度上限制了这个问题。请注意,所描述的域不是与Chalmers或GU相同。
您正在为其构建此系统的大学被组织为员工部门,如计算科学部(CS),以及学生学习计划,如计算机科学和工程计划(CSEP)。课程由各部门主办,但几个部门可能会在一个项目上合作,事实就是这样与CSEP合作,CSEP由CS部门和计算机工程(CE)。部门名称和缩写如下独特,节目名称也是如此,但不一定是缩写。
每个研究项目进一步分为几个分支,例如CSEP拥有计算机语言、算法、软件工程等分支。请注意,分支名称在给定程序中是唯一的,但不是必须跨越几个项目。例如,CSEP和自动化技术课程可以有一个名为交互设计。每个学习计划都有强制性的课程。对于每个分支,都有额外的必修课程拿那个树枝的学生必须阅读。分支还命名一组所有该分支的学生都必须阅读的推荐课程满足毕业要求的一定金额,见下文。
学生总是属于一个项目。学生必须选择一个在该课程中分支,并满足其毕业要求,为了毕业。通常学生会选择哪个分支他们的第四年,这意味着处于早期阶段的学生他们的研究可能还不属于任何分支。
课程由部门提供(例如CS提供数据库课程),学生可以阅读任何学习课程。一些课程可能对某些项目是强制性的,但对其他项目则不是。学生获得通过课程的学分,具体数字可能在课程(但所有学生获得相同数量的学分课程)。一些(但不是全部)课程对可能同时参加课程的学生。课程可以是分类为数学课程、研究课程或研讨会课程。并非所有课程都需要分类,有些课程可能有多个分类。大学偶尔会介绍其他分类。有些课程有先决条件,即。允许学生注册之前必须阅读的其他课程到它。
学生需要注册课程才能阅读。成为如果允许注册,学生必须先满足所有先决条件为课程准备。学生不应该注册到课程,除非先修课程已经通过。它不应该学生可以注册他们所学的课程已经通过了。
如果课程已满,随后注册的学生将被放在等待列表。如果之前注册的学生之一决定退学,如果球场上有一个空位,那么这个空位就是送给等待时间最长的学生。当课程是完成后,所有学生按照“U”、“3”、“4”、“5”的等级进行评分。获得“U”表示学生没有通过课程,而其他等级表示不同程度的成功。
研究管理员可以覆盖这两个课程先决条件要求和大小限制,并将注册的学生直接添加到当然。(注意:您不会为实现任何前端应用程序学习管理员,仅供学生使用。数据库必须仍然能够来处理这种情况。)
对于一个学生来说,要想毕业,她必须满足一些要求首先完成。她总得通过了(至少三年级)她所属学习项目的必修课程,以及她必须选择的特定分支的必修课程。此外,她必须在为分支机构推荐的课程。此外,她需要阅读并通过了(至少)20个学分的课程数学课程,10学分的研究类课程课程和一个研讨会课程。必修课程和推荐课程也像其他课程一样,以某种方式进行分类计算。例如,如果课程的必修课程之一也是研讨会课程,该课程的学生不需要阅读还有更多的研讨会课程。
系统规范
您将为上述域设计并实现一个数据库面向大学学生的前端应用程序。通过他们应该能够看到自己的信息的应用程序,注册课程和注销课程。
从形式上讲,您的应用程序应该具有以下模式:
-信息:给定学生的国家识别号,系统应提供
-学生姓名、学生身份号码和他们的大学颁发的登录名/ID(某物类似于CID对查默斯学生的作用)-学生正在学习的课程和分支(如果有)。-学生所读的课程以及成绩。-学生注册的课程。-学生是否满足以下要求毕业
-注册:给定学生id号和课程代码,系统应该尝试注册该课程的学生。如果课程是满了,学生应该被列入等待名单当然。如果学生已经通过了课程,或者已经注册,或不满足课程的先决条件注册应该失败。系统应通知学生尝试注册的结果,以及失败的原因(如果任何)。-注销:给定学生id号和课程代码,系统应该注销该课程的学生。如果有学生正在等待注册,现在球场上还有空位应该为该课程注册一名第一排的学生。系统应确认该学生已注销注册。如果学生在尝试注销时未注册课程,系统不需要通知这个,但等待列表中没有学生(如适用)在这种情况下应予以晋升。
任务1:构建数据库
您的任务是通过在数据库引擎中实现数据库模式来构造数据库(PostgreSQL)。该模式在该文件中进行了抽象解释:
数据库任务1的抽象架构
您应该使用实现模式创建表格
声明
- 精确使用给定的表名和属性名
- 表示相同的主键、外键和唯一性约束
- 使用合理的类型(不在抽象模式中表示,但应该从域描述中明显可见)
- 没有列可以接受NULL值
因此,您应该创建所有表,并在过程,您还应该插入检查以确保只有有效数据可以插入数据库中。无效数据的示例为等级“6”或一门学生人数为负数的课程。
创建表格后,应该用示例填充表格数据。这可能很耗时,但它是数据库的开发。数据库中的数据顺序至关重要以正确验证其行为是否符合预期。您应该用足够的数据填写表格,以便测试您的应用程序可以处理上面指定的各种操作。只是如果数据仍然不能测试所有部分,那么插入大量数据是没有用的数据库的。以下是您需要的(非常)详尽的数据列表包括:
- 少数学生,其中至少有一人符合毕业和一对出于不同原因没有结婚的夫妇。
- 一系列测试课程各个方面的课程。这个包括分类、强制、推荐等。您至少需要三名等待学习两门不同(有限)课程的学生。
重要提示:在数据库中插入数据时,请通过编写在可以执行的文件中插入语句。这样你就不会如果有什么需要改变的地方,就必须重新做所有的工作用桌子。
由于您确切地知道应用程序需要从数据库,以何种形式,最好编写视图来提供信息。在实际环境中,我们甚至可以确保使用应用程序的权限不能使用除这些视图以外的任何视图。遗憾的是,我们无法让您测试在我们使用的PostgreSQL机器,但我们仍然希望您的应用程序遵守我们列出的特权。
按照系统规范创建以下视图:
- 查看:
学生跟进(学生、项目、分支)
对于所有学生,他们的SSN、课程和他们关注的分支(如果有)。这个分支
column是任何视图中唯一允许为NULLABLE的列。 - 查看:
完成的课程(学生、课程、成绩、学分)
对于所有学生,所有完成的课程,以及他们的代码、成绩(等级“U”
,“3”
,'4'
或'5'
)和数量信用。等级类型应为字符类型,例如文本
. - 查看:
注册(学生、课程、身份)
所有注册和等待学习所有课程的学生,以及他们的等待状态(“已注册”
或“等待”
). - 查看:
通过课程(学生、课程、学分)
对于所有学生,所有通过的课程,即以分数结束的课程除了“U”,以及这些课程的学分数量。此视图用作指向毕业之路
视图(和对于任务4),并且不会被您的应用程序直接使用。 - 查看:
未读必填(学生、课程)
对于所有学生,他们的必修课程(分支和课程)尚未通过。此视图用作指向毕业之路
视图,并且不会被您的应用程序。 - 查看:
毕业路径(学生,总学分,必修课剩余,数学学分,研究学分,种子课程,状态)
对于所有学生来说,他们的毕业之路,即具有以下列的视图-ssn(序列号)
:学生的SSN。-总学分
:他们获得的学分数。-强制向左
:他们尚未阅读的分支或项目的必修课程数量。-数学学分
:他们在归类为数学课程的课程中取得的学分。-研究学分
:他们在归类为研究课程的课程中取得的学分。-神学院课程
:他们读过的研讨会课程的数量。-地位
:他们是否有资格毕业。此字段的SQL类型应为布尔(BOOLEAN)
(即。真的
或错误的
).确保视图使用正确的列名称!使用AS公司
命名列。
可交付成果:对于任务1,您应该通过Fire提交以下文件
表格.sql
:用于创建表的SQL代码。插入.sql
:包含数据插入语句的SQL代码。视图.sql
:用于创建列出的视图的SQL代码。
注意,SQL代码应该是纯文本格式。确保PostgreSQL可以在你提交文件之前执行它们清除数据库,然后运行再次创建SQL文件。
任务2:数据库设计
这个实验室的任务是回顾数据库在实验室1中实施,并检查我们应该如何完成。更准确地说,我们将
- 将我们的设计技能应用于领域描述:
- 建立E-R模型并通过E-R到模式的转换从中导出模式
- 分析功能依赖(FD)并通过规范化导出模式
这项研究可能会产生许多有趣的结果:
- 我们可能会注意到E-R和FD给出了与task1.xt相同的模式,并得出结论,我们已经做了出色的工作
- 找出E-R、FD和task1.txt之间的差异,帮助完成它们
- 找到一个仍然合理的非常不同的设计
E-R模型
您的第一个任务是创建一个E-R图,该图正确地建模了所描述的领域在中域描述以上。
你可以使用任何你喜欢的工具对于此任务,只要您将解决方案作为其中一个格式.png码
,.jpg格式
,.gif文件
或.pdf格式
并作为纯文本文件中的模式(格式类似于task1.txt(任务1.txt)).工具示例:
- 查询转换器
- 迪亚
- 铅笔和纸:给你的图表拍照并作为
.jpg格式
文件 - 粉笔和黑板:照片(一种很好的画法,因为它很容易纠正)
- 笔和白板
Dia具有(通常)更好的图形,而Query Converter会自动生成模式。在这两种情况下,你必须使用第3.3节课堂讲稿中指定的翻译,并正确标记关键和参考文献。
提示:如果图中不包含至少一个弱实体,至少一个ISA关系,以及至少一个多对多关系关系,你可能做错了什么。
功能依赖性
第二个任务是制定域中的所有函数依赖关系,并从中派生出有效的模式。这可以(也必须)独立于E-R设计和task1.txt(任务1.txt).
- 确定您期望为域保留的功能依赖项:
- 收集E-R模型中的所有属性并将其放入一个表中,
域(….)
.您必须重命名某些属性,以便所有名称都是不同的。
- 通过阅读域描述,确定
域(….)
.不要看你的E-R模型或task1.txt(任务1.txt)在这一点上!
- 使用依赖项查找键和正常形式:
- 查找的所有可能键
域(….)
,以及所有违反BCNF的行为。 - 分解
域(….)
通过使用BCNF规范化算法来区分表。 - 在结果模式中仔细标记键和引用。
- 比较和讨论:
- 将BCNF模式与您的E-R模式进行比较,特别要问:它们的约束是否只有E-R或FD才能揭示?
- 因此,建立一个“完美模式”,它同时考虑了E-R和FD结果。
- 将此与实验室1中的模式
以下是一份详尽的清单,列出了您在何时可能需要考虑的事项搜索函数依赖项:-部门名称和缩写-学习计划名称和缩写-分支名称-学生姓名和识别号-学生项目和分支-课程名称和代码-课程分类和先决条件-课程等待列表
第九:只要您自己确定了功能依赖项,Query Converter就可以自动执行大部分分析。当模式非常大时,速度可能会变慢,但您可以重新加载页面以终止进程。
可交付成果:对于任务2,您应该通过Fire提交以下文件
ER.png公司
:您的E-R图.png码
,.jpg格式
,.gif文件
或.pdf格式
文件ER-schema.txt格式
:从E-R图派生的数据库模式,作为文本文件(无PDF、无Microsoft Word、无HTML!)FD.txt格式
:您的域(…)
模式以及您找到的功能依赖项(您可以省略从您提到的依赖项派生的依赖项)FD-schema.txt文件
:使用BCNF算法的分解模式设计-报告.pdf
:比较不同类型分析结果的报告(文本文件.txt文件
或,html
也可以)
验收标准:
ER.png公司
:E-R图必须在语法上正确,并且是域的合理模型(如果没有弱实体和ISA实体,就无法实现这一点!)ER-schema.txt格式
:必须从图中正确导出ER模式(如果使用Query Converter,则为自动)FD.txt格式
:您应该已经在域中找到了所有且仅找到了合理的功能依赖项(派生的可以省略)FD-schema.txt格式
:分解应正确(如果使用Query Converter,这部分是自动的,但应确保标记键和引用)设计-报告.pdf
:报告应确定ER和FD分析导致不同模式的所有情况,并至少在某些情况下,说明为什么其中任何一种模式更可取。应使用实验室1中的模式.在最简单的情况下,您可以说模式完全相同。如果某些属性和表的名称不同,只要结构相同,就可以这样说。
任务3:触发器
当您的表和视图在任务1中实现时,下一个任务是创建两个触发器来处理注册和注销。下面是一段代码,让您开始第一次触发:
Postgresql触发器示例
但首先,您应该定义另一个视图可以由触发器和任务1中的应用程序使用:
- 查看
课程队列位置(课程、学生、地点)
:对于排队参加课程的所有学生,课程代码、学生的身份号码,以及学生在排队(排在第一位的学生将在其中放置“1”队列等)。当学生尝试注册课程时,该课程可能已经满了,在这种情况下,学生应该被列入候补名单为了那门课。当学生注销时,可能是现在有空间了对于等待名单中的一些学生,然后应该注册而不是课程。这类事情通常通过触发器处理。你应编写两个触发器:
- 当学生试图注册已满的课程时,该学生是已添加到课程的等待列表中。一定要检查学生如果可以的话,可以在添加到任一列表之前注册课程不应该引发错误(使用提高例外情况).提示:域中规定了几个注册要求描述,以及一些类似的隐含描述,学生不可能两者兼而有之同时等待并注册同一课程。
- 如果学生没有注册课程已注册且不仅在等待名单上应该为该课程注册等待列表。注释:此只有在球场(球场)上确实有空位时才应该这样做可能由于管理员覆盖限制而导致过满并直接添加学生)。您需要在视图上编写触发器
注册
而不是在表本身(视图是在上面的任务1中构建的)。(其中一个原因是我们“假装”您只有任务4中列出的权限表示无法在基础表中插入数据或从中删除数据直接。但即使我们解除了这一限制,还有另一个理由不这样做在底层表上定义这些触发器-您能找出原因吗?)
测试。我们将准备测试用例(在SQL中)来测试插入和删除,以进行检查触发器工作。这些测试将在Fire中自动应用实验室注册打开时。
可交付成果。对于任务3,您应提交以下文件:
触发器.sql
:用于创建两个触发器的SQL代码。设置.sql
:设置数据库以测试触发器。这通常是文件的串联表格.sql
,插入.sql
和视图.sql
来自任务1。我们必须能够通过执行文件来测试触发器设置.sql
和触发器.sql
,按顺序。
确保PostgreSQL可以在您提交文件之前执行这些文件。
任务4:JDBC中的前端应用程序
这个作业的最后一部分是写一个学生可以用于与数据库通信。此应用程序应该是Java使用JDBC连接到PostgreSQL数据库以请求和插入适当的数据。
为了帮助您编写应用程序,我们为您提供了一个存根文件包含用于在本地系统上连接到PostgreSQL的代码。它还可以包含应用程序三种操作模式的挂钩,这是应该插入代码的位置。这个想法是你不需要重点放在应用程序的纯Java部分上,而不是直接开始使用数据库接口代码。
存根文件位于此处:学生门户.java
.
程序的预期行为是从命令行使用它,给出一些学生识别号作为参数(这到底是什么取决于您的设计)。这对应于学生“登录”到门户。登录后,学生可以选择三种模式之一“信息”、“注册”或“注销”。如果选择第一个,则所有那个学生的信息应该打印出来。确切的信息必须按上述系统要求打印。如果其中一个选择后一种模式时,将提示学生注册课程到或从中注销,应用程序应执行请求的操作并打印结果(成功、失败)。
存根文件可以按原样编译和运行,但不会发生任何事情在任何模式下。因此,您的任务是填写这些内容的实际逻辑三项任务。
运行应用程序可能如下所示:
$>java学生门户123456-7890欢迎!请选择操作模式:? > 我学生信息123456-7890-------------------------------------姓名:Emilia Emilsson学生编号:emem行:信息技术(IT)分支:系统开发阅读课程(名称(代码),学分:年级):集合论(MAT050),5p:5函数编程(TDA450),10p:5面向对象系统开发(TDA590),10p:4注册课程(名称(代码):状态):数据库(TDA356):已注册算法(TIN090):作为nr 3等待参加的研讨会课程:0取得的数学学分:5取得的研究学分:0总学分:25符合毕业要求:否-------------------------------------请选择操作模式:? > r TDA350型您现在已成功注册TDA350加密课程!请选择操作模式:? > r TDA381课程TDA381并发编程已满,您将进入等待列表。请选择操作模式:? > 退出再见!$>
请注意,精确的格式只是一个建议:您可以选择格式化只要您将适当的信息返回给用户。
要从应用程序访问PostgreSQL jdbc驱动程序,您应该从以下位置下载https://jdbc.postgresql.org网站并将其导入到java中课程路径。
或者,如果使用日食。
您的学生应用程序应该表现为只有以下内容特权:
选择课程
选择ON学生
选择以下学生
选择已完成的课程
选择注册
选择课程队列位置
选择毕业路径
在注册时插入
删除注册
我们将检查您提交的代码,以确保您遵守这些特权,即使我们无法让系统自动执行它们。
可交付成果:
- 文件
学生门户.java
通过Fire提交的添加内容 - 在实验课上向老师进行口头演示
- 填满演示表单在口头演示中展示
这一次,Fire没有执行任何自动测试。我们将改为进行个人评分:你必须参加一次监督会议,并展示你的运行应用程序,我们将当场接受或拒绝(等待检查提交的授权代码违规)。
从3月5日(星期一)开始的所有实验课程均可用于评分,每组大约需要10分钟。此外,我们将在考试周安排两次额外的实验课(星期一和星期四)。
作为你可能意识到,如果你们都等到最后一次会议,我们会很简单,没有时间陪每个人,所以请尽早来!
以下是我们将测试您的应用程序的列表:
- 列出学生的信息。
- 为学生注册一门不受限制的课程,并显示课程结束向上注册(再次显示信息)。
- 再次为同一课程注册同一学生,并显示程序不会崩溃,学生会收到一条错误消息。
- 从课程中注销学生,然后从中再次注销同样的课程。表明该学生未注册。
- 为学生注册一门他们不具备先决条件的课程for,并显示注册未通过。
- 从已注册的限制课程中注销学生到,并且队列中至少有两名学生。再次注册到同样的课程,并表明学生得到了正确的答案(最后)在等待列表中的位置。
- 为同一学生注册、注销和重新注册相同的限制课程,并表明学生首先被删除然后在相同的位置结束(最后)。
- 最后,从过满课程,即带有注册的学生超过了课程中的名额(您需要直接在数据库中设置此情况)。显示没有学生因此,已从队列移动到正在注册。
确保您输入系统的数据能够处理所有这些案例。请在要求我们检查您的申请之前做好准备,所以这些案件的审理将是顺利的。请填写以下内容演示前的形式:演示表单.
你必须在最后一次实验课之前或之前演示你的工作项目。