【哈工大计算机数据库实验】实验三、四、五代码

哈工大计科数据库实验三四五的代码

前几天安系统的时候把数据库五次实验的实验要求弄丢了,qq群也退了,不能再从群里下了,只能简单说下要求。另外实验一是mysql数据库的基本操作,实验二是用C++操作数据库(老师给的实验要求里附带了部分代码),都很简单,这里就不说了。只给出实验三、四、五的代码还有一些必要的注意事项。

实验三

源码在此
使用说明
实验三是做一个社交系统,类似于qq,要求能够添加、删除、修改好友,发布、删除、修改日志,和好友之间进行通信,还能添加教育经历和工作经历等等。
这次是在一个学长的火炬上大改的(说起来都是泪…..那个火炬有一半的功能都没实现,实现的功能还有很多错误,我自己新加了很多页面和功能)。使用flask框架开发的一个chrome插件。这次没能实现好友之间互评日志,其他的都已实现。我在验收的时候发现重点不是实现全部的功能,而是看有没有实现所有的数据库查询方式。这份代码里没有实现视图查询,验收的时候可以随便将一个查询改成视图查询(我是这么做的,不过要注意所改的查询不要再对数据库操作了,否则这个地方会有错误)。
后台程序都在sever里,每个功能用一个函数实现,全是暴力实现,完全没有美感。
具体使用的过程:
(1)先下载flask模块。
(1)下载压缩包,找到里面的DB.sql文件,从workbench导入这个文件。然后这个sql文件和文件夹里的ER图是对应的。
(2)新安的系统,我在学长的基础上新建了两个table,但是原来的sql文件忘记保留了,也懒得再安一遍mysql,剩下的得读者自己动手做了,不过很简单……
新建两个table,分别是nonGroupedFriendID(user1id,user2id)和msg_record(content,time,fromuser,touser)。除了time是datetime类型外,其他的都是char类型,长度可以参考前面的表。nonGroupedFriendID负责记录未分组好友之间的信息。比如12和13是好友,但是12将13设为了未分组,则这个表里就有一个记录,user1id=12,user2id=13。msg_record负责记录每一条好友之间发送的信息,content是信息的内容,time是发送的时间(YY-MM-DD HH:MM:SS),fromuser是发送者的id,touser是接受方的id。
这几个属性的长度可以参考前面几个表里相同的属性。
(3)下载完压缩包之后,选择chrome的设置–>更多工具–>扩展程序–>打开开发者模式
这里写图片描述
选择文件夹里的HIT_QQ文件夹导入。
这里写图片描述
(4)在微软小娜的那个输入框里打入HIT_QQ,启动,效果是这样的
这里写图片描述
然后在后台启动sever.py,就能运行了。
运行的效果
这里写图片描述
这个“无分组”是默认的,也就是说无论用户是否新建分组,这个都是默认的,也就是之前提到的那个无分组nongroupedfriendID。
这里写图片描述
没写过前端….临时学的json,js,jquery等等,写的很渣,请学弟学妹们见谅……另外使用的时候不要忘记改连接数据库时的名字和密码2333
如果还有bug的话可以加我qq1401997998解决

实验四

源码在此
使用说明
这个实验要求我记得是模拟mysql数据库读写磁盘,就是模拟其物理实现。这份代码基本上就是一个同学的代码,我改进的地方不多(有点无耻了…..)。这个代码实现的也很简单,就是挨个实现功能,加分项B+树没实现。
运行的时候,在项目目录里新建一个result的文件夹,然后无脑跑就行了…..

实验五

源码在此
使用说明
这个实验要求是对5条sql查询语句中的3条进行逻辑优化,并且最好用图的形式绘制出优化前和优化后的逻辑查询树。我选择的是前3条。
这里写图片描述
这三条sql语句和实验要求里给的不太一样,是我自己改动了一下,这样按自己的优化方法好写。优化的过程是把每条sql语句先转化为list,然后全程对这个list依次使用选择串接律,选择分配律,投影分配律。
treeplotter模块是从网上找的用于绘制树形结构图,输入一个字典结构,能绘制相应的树出来,比如这个字典(用优化之前的第一条sql语句转化来的字典):
这里写图片描述
绘制出来的树状结构是这样的:
这里写图片描述
util类就是用于优化并且绘制树的类。
优化过程(以第一条sql语句为例):
(1)首先将sql语句转化为一个list列表,列表里的每个元素是sql语句中每个字符或者单词,比如第一条sql语句处理之后是这样的:
[“SELECT”, “[ “, “ENAME”, “=”, “MARY”, “& “, “DNAME “, “= “, “Reserach “, “] “, “( “, “( “, “EMPLOYEE “, “) “, “JOIN “, “( ” , “DEPARTMENT “, “) “, “) “, “]”],设这个list为L1
也就是SELECT [ENAME=”MARY” & DNAME=”Rserach”]((EMPLOYEE) JOIN (DEPARTMENT))。此时的树就是上面的那个。
(2)对L1使用选择串接律,思想是首先查找&的下标,去掉&,可以认为select[XXXX]的”]”后面跟着的是其子树,这里要做的就是将多出来的选择条件加入下一层的子树中,比如L1处理之后是这样的:
[“SELECT”, “[ “, “ENAME”, “=”, “MARY”, “] “,”(“, “SELECT “, “[ “, “DNAME “, “= “, “Reserach “, “] “, “( “, “( “, “EMPLOYEE “, “) “, “JOIN “, “( ” , “DEPARTMENT “, “) “, “) “, “) “]
也就是SELECT[ENAME=”MARY”] (SELECT[DNAME=”Reserach”] ((EMPLOYEE) JOIN (DEPARTMENT)))。对比第一步的结果,我就是把”()”中国的内容看成一个子树,”[]”中的内容看成是选择或者是投影条件。此时的树结构为:
这里写图片描述
此时的字典:
这里写图片描述
(3)继续对L1使用选择分配律,思想就是分别查看每个选择条件涉及的属性,看看哪个table含有这个属性,匹配上了就把这个属性下推到相应的table1所在的子树上。
这时的字典为:
这里写图片描述
树结构为:
这里写图片描述
(4)继续使用投影分配律,JOIN应该指的是自然连接,所以这里的投影在下推的时候,还要考虑2个table所有共同的属性。大致思想是先看对什么属性投影,把这个属性下推到对应table所在的子树上,然后再看这两个table所共有的属性,分别再下推到各自所在的子树上。
处理之后的字典为:
这里写图片描述
这里写图片描述
三条语句的优化过程都是这样的。还有不明白的话可以用文件夹里的test文件试一试,把每个过程后的结果打印出来看一看

结语

初入计算机,请大家多多指教嘛,真诚欢迎一起讨论,共同学习~~~持续更新中……