Skip to content

cloud0606/Advanced-Database

Repository files navigation

Advanced-Database

小组成员

  • 组长

    • 王硕
  • 副组长

    • 胡云卿
  • 组员

    • 刘昱彤

    • 李沅城

    • 王钲源

    • 潘淑红

    • 徐红莉

功能需求

开发一个基于WEB的数据库应用,这个应用是查询一个关于电影数据库的数据,数据部分信息经过了脱密处理,数据及相关数据文档由教师指定。开发的功能如下:

  1. 搜索任务

    • A 根据用户ID,搜索用户所看的电影名字和评分,按时间从新到旧排序,给出电影的前三个标签及关联度评分

    • B 根据输入的关键词,查询电影名字里有关键词的电影

    • C (选做)查询某一风格最受欢迎的20部电影

  2. 界面规范

    • 界面上应该有录入用户ID, 检索关键词、风格等的文本框和不同任务的提交按钮

    • 搜索结果要在网页上展示,超过一页的要有滚动条

时间安排

【5月20日 以前 】

  • 选择数据库:MongoDB

【5月20日 12周周一】

  • 数据库功能演示

【5月29日 13周周三】

  • 分析给定的数据,根据功能需求,设计数据逻辑结构
  • 将给定的数据存入数据库
  • 编写前端页面
  • 实现事务处理接口

【6月1-6日 13周-14周】

  • 数据查询功能

【6月6-9日 14周周日】

  • 前后端接口连接调试
  • 功能测试

【6月10日 15周周一】

  • 汇报演示

任务分工

(初步分工)

  • 搭建环境+功能C

    • 王硕、刘昱彤
  • 功能A

    • 胡云卿、王钲源、李沅城
  • 前端开发

    • 胡云卿、李沅城
  • 数据模型设计

    • 王钲源
  • 功能B+导入数据

    • 徐红莉、潘淑红

(最终分工)

  • 王硕

    • 配置MongoDB环境,建立本地数据库
    • 整理数据结构、画collection图和E-R图、方便参考
    • 实现数据库的查询功能 A、B、C
    • 优化数据库查询(给MongoDB的每个collection创建索引)
    • 前后端连接
    • 遇到问题:
      • 查询的大小写匹配问题,以及tags.csv和genome-tags.csv中的tag存在大小写不一致的情况。 解决:在查询语句时使用正则表达式查询,加上参数 "$options":"i"
      • 查询A和查询C的查询时间过于长 解决:给每个collection建立索引
      • 查询A在前后端连接的时候一直失败,测试了很久,最终找到原因:前端传递过来的参数的字符类型不一致,导致数据没有传递到search.py中去
      • 查询3中查出的评分都是 5.0,4.5 这样的数字,不符合常理(应该为4.37这样),发现这种情况一般是因为此电影只有一条评分,为了评分的准确性,我们设定评分条数 <=10 的不参与排名。
  • 胡云卿

    • 中期数据库功能展示
    • 前端查询子页面设计实现
    • 前端局部刷新功能实现
    • 前后端接口设计
    • 参与查询A功能设计
    • 遇到问题
      • 描述:局部刷新功能实现时,每次点击查询进行局部刷新之后页面又自动全局刷新,把查询结果覆盖了。
      • 解决:一开始使用console.log输出中间结果进行排错,但是全局刷新会把console.log输出刷新看不到调试信息。遂通过chrome开发者工具进行单步调试,发现ajax部分代码实现没有问题,问题出现在通信请求上,每次点击提交按钮会产生两次POST请求,并通过监控django后台日志证实了确实产生了多余通信请求。最后发现是由于前端form表单使用了bootstrap框架,当把button的type属性设置为submit时会自动提交表单数据,而我们的局部刷新是通过监控鼠标点击事件实现的,所以每次点击产生了两次请求。把button的type属性修改为button就解决了。
      • 收获:当使用第三方框架时,需要注意细节
  • 刘昱彤

    • 建立数据库对象(database.py)以及视图函数框架
    • 前后端传参框架:在每次数据库查询后利用查询函数中的return函数参数返回查询结果至模板以显示用户查询结果。
    • 遇到问题:
      • 在已建立远程数据库连接的条件下,直接调用数据表的类对象方法无效。原因:我们虽然在search.py中导入了数据库连接方法,但由于连接代码在类外直接import无法执行, 和小组成员讨论后解决办法:封装数据库连接函数,在每一个数据库对象中的构造函数调用数据库函数,如此,直接导入即可调用构造函数实现数据库连接并查询)。
  • 李沅城

    • 服务器Mongodb运行环境搭建(使用Docker快速搭建)
    • 数据集分析
    • 框架搭建(前端:html+css+js 后端:Django 服务器:Mongodb)
    • 前端页面设计
    • 前端搭建
    • 前后端接口设计
    • 参与查询A功能设计
    • 后端目录结构设计
    • 后端数据库连接封装
    • 遇到的问题
      • Django对Mongodb没有直接的支持,所以使用了pymongo去对Mongodb数据库连接进行了封装,以便支持后期的后端开发
      • 原本我们以为用户所看的电影,我们只用在rating里面检索就可以。但后期经过数据分析发现,部分用户对某部电影有评分但没有评tag,另一部分用户对某部电影评了tag但没有评分。于是我们后来改为先查了rating再查tags,最后去重,这样保证了我们能找到用户所看过的所有电影
      • 我们之前是想设计一个主页面和三个任务页面的前端设计,但考虑到用户使用体验和提升数据库查询的速度,我们最后改为了使用一个页面,并使用局部渲染的方式保证用户能正常查询。这样做的好处是用户在使用的过程中,只有在一开始的时候加载一个页面,不必把时间浪费在不同页面的跳转和新页面的渲染上面
      • 因为只使用一个页面的原因,所以我们需要使用局部渲染的方法。一开始我们直接使用html和Django直接交互的方式,这样的话会导致每次局部渲染后全局渲染也会被触发,让页面的查询结果直接消失。后来改用ajax的方式,这样的话就能保证只进行局部渲染而不会进行全局渲染
  • 王钲源

    • 前期工作准备:笔记整理

    • 配置本地mongo环境:ubuntu安装mongo,使用mongo shell连接数据库默认端口

    • 中期数据库功能展示部分pymongo代码:

      • 基本操作:增(创建数据库/新建集合/插入文档/插入文档列表insert_many/指定ob_id的插入文档),删(删除数据库/文档/集合),改(集合重命名),查(匹配单条文档/匹配多条文档/指定字段的查询/指定条件查询/指定集合查询/指定ob_id查询)
    • 中期报告文档整合

    • 问题/解决:在Windows及Mac上安装时可以有GUI版本的安装包,但是在linux上apt下载时,会遇到自动更新的问题,如果不关闭自动更新无法固定版本下载安装,连接数据库会有错误,在服务启动前:

       echo "mongodb-org hold" | sudo dpkg --set-selections
       echo "mongodb-org-server hold" | sudo dpkg --set-selections
       echo "mongodb-org-shell hold" | sudo dpkg --set-selections
       echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
       echo "mongodb-org-tools hold" | sudo dpkg --set-selections
      
  • 徐红莉

    • 参与查询任务A,编写任务A test.py文件,寻找更高性能的优化方式
    • 数据导入
    • 任务A的前后端传参
  • 潘淑红

    • 配置MongoDB环境,建立本地数据库
    • 数据导入
    • 简单分析数据
    • 中期和后期文档的编写和整理
    • 参与功能A功能设计

设计方案

  • 开发框架选择

    • 未定
  • 数据模型设置

    • 未定
  • 各功能实现的流程

    • 未定
  • 界面设计

    • 未定
  • 开发环境选择

    • 前端:未定

    • 后端:Django

    • 数据库:MongoDB

About

2019年高技术数据库大作业(MongoDB)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 7