某教育平台项目开发之--数据库设计(设计视图)(上)
来源:互联网 发布:学windows编程看哪些书 编辑:程序博客网 时间:2024/04/30 05:58
本次开发采用mysql数据库,遇到一个非常难搞的业务需求。这里先上本项目的数据库设计:
在这里我用自己的话概括一下关于课程这张表的事情。
课程分为免费跟收费,但是数据库的表中没有一个叫”is_free”的字段,但有一个叫”price”的字段,当price==0.0的时候我们就叫免费,当price>0.0的时候我们叫收费,免费的课程并不是都可以学习,我们依然采用“需要购买的方式”,即使是免费也需要购买,只有购买了课程,这个课程的学习人数才能加一。
业务需求比较复杂,具有学习卡这个东西,学习卡是要买的,里面存储着收费的课程。所以只要买了学习卡就相当于购买了课程,这些课程的学习人数都得加一。
使用中的学习卡部分的课程:
1、获取在使用中的学习卡的课程的部分信息:
SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price" FROM course AS c , stuc_course AS scs, study_card AS scd WHERE scd.id=scs.stuc_id AND scs.course_id=c.id AND scd.is_used=1
得到的数据当然会有重复,因为我只是显示了部分字段,正因为如此,我才可以计算学习人数,结果如下:
2、获取在使用中的学习卡的课程的部分信息和学习人数:
SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price", COUNT(*) AS counts FROM course AS c , stuc_course AS scs, study_card AS scd WHERE scd.id=scs.stuc_id AND scs.course_id=c.id AND scd.is_used=1 GROUP BY c.id
得到的结果如下,看这个结果的时候可以参照上一张结果图:
订单部分中的课程:
1、获取在订单的课程的部分信息:
SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price" FROM orders AS o, course AS c WHERE o.course_id=c.id AND o.is_finished=1
结果如下:
这里要注意的是,“使用中的学习卡部分”和“订单中部分”有些课程会重复,因为试想这样一个场景:
A课程售价100元,“001”学习卡中收录了A课程,那么如果有人买了“001”学习卡,他就算一个学习本课程的人;但是也有人不买学习卡,他只要A课程,所以就在订单表也能找到A课程, 就是这样的一个业务需求。
2、获取在订单中的课程的部分信息和学习人数:
SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price", COUNT(*) AS counts FROM orders AS o, course AS c WHERE o.course_id=c.id AND o.is_finished=1 GROUP BY c.id
结果如图:
因为业务需求主要是得到课程的学习人数嘛,那学习人数为0的呢,怎么办?学习人数为0的就不能用上面的那些思路去思考了,只能通过这种思路:
(1)获取所有课程的ID
(2)获取订单中课程的ID
(3)获取使用中的学习卡的课程的ID
(4)获取(1)中不在(2)中的ID并且不再(3)中的ID
不在订单中也不在使用中的学习卡中的课程
1、获取不在订单中也不在使用中的学习卡中的课程的部分信息:
SELECT c.id AS id, c.course_num AS courseNum, c.course_name AS courseName, c.price AS price FROM course AS c WHERE c.id NOT IN( SELECT DISTINCT course_id FROM orders WHERE orders.is_finished=1 ) AND c.id NOT IN( SELECT DISTINCT s2.course_id FROM study_card AS s1, stuc_course AS s2 WHERE s1.id=s2.stuc_id AND s1.is_used=1 )
结果如下:
2、获取不在订单中也不在使用中的学习卡中的课程的部分信息和学习人数:
SELECT c.id AS id, c.course_num AS courseNum, c.course_name AS courseName, c.price AS price, COUNT(*)-1 AS counts FROM course AS c WHERE c.id NOT IN( SELECT DISTINCT course_id FROM orders WHERE orders.is_finished=1 ) AND c.id NOT IN( SELECT DISTINCT s2.course_id FROM study_card AS s1, stuc_course AS s2 WHERE s1.id=s2.stuc_id AND s1.is_used=1 ) GROUP BY c.course_num;
注意到COUNT(*)-1 AS counts
,因为这些都是无人学习的,学习人数为0,但是只要你列举出来,COUNT(*)都会得到1。
结果如图:
- 某教育平台项目开发之--数据库设计(设计视图)(上)
- 数据库设计(设计视图)(下)
- 数据库设计(上)
- 敏捷开发一千零一问系列之二十一:怎样写设计?(教育软件案例)
- 敏捷开发一千零一问系列之二十一:怎样写设计?(教育软件案例)
- Oracle教育管理平台PL-SQL脚本之初期设计
- 某教育平台项目开发之--使用SSM框架开发过程遇到的问题总结
- 数据库设计(8)-视图集成
- 开发平台之权限设计
- 开发平台之缓存设计
- 项目开发之项目设计
- 项目开发,数据库设计技巧
- 数据库的跨平台设计(转)
- MYSQL性能优化之Mysql数据库高可用架构设计之MMM架构设计(上)
- 软件工程之— 项目开发文档(数据库设计说明书)
- 项目小结之数据库设计
- 项目小结之数据库设计
- 项目小结之数据库设计
- Machine Learning(Stanford)| 斯坦福大学机器学习笔记--第一周(1.监督学习与无监督学习的介绍)
- C#set和get方法
- Linux安装RabbitMQ
- git基本操作
- leetcode:Remove Nth Node From End of List [19]
- 某教育平台项目开发之--数据库设计(设计视图)(上)
- 在Action中以Struts2的方式输出JSON数据
- ListView的用法和滚动条用法
- Oracle简单入门(连载)(2)
- 二叉树的深度
- IoC/DI(转载)
- leetcode:Valid Parentheses [20]
- 转盘抽奖
- 148. Sort List(重要)