背景
在我们要构建一个小程序项目时,比方说就我近期开发的微信答题小程序或者是知识竞答类型的答题小程序,通常第一件事情就要设计数据库。云开发的数据库使用结构化的文档来存储数据,它可以是一个数组、一个对象,或者更加复杂的嵌套。
设计数据库需要预先思考哪些问题
实现云开发数据库之前,需要了解存储的数据的性质,如何存储这些数据,以及将如何访问它们,这需要你预先就要做出决定,进而通过组织数据和页面数据交互来获得最佳性能。具体地说,你需要先预先思考如下问题:
- 页面交互需要使用哪些基本对象,时间、科目、价格、题型、题目、选项、答案等等这些实际的信息在数据库里对应的是啥数据类型?
- 不同对象类型之间的关系是一对一、一对多还是多对多?如科目分类、答题页、排行榜、答题记录、用户信息等等这些的关系是怎么联系起来的?
- 云数据库添加新对象的频率有多高?集合里添加记录的频次是怎样的?修改记录以及记录里的字段的值的频率有多高?
- 查询记录或记录的值你将打算通过什么方式,是通过ID、字段、条件还是其他方式?
- 创建的集合哪个是最重要的?哪个集合用户访问并发量会比较大?并发量大的集合应该怎么设计才能提升性能?
- 哪个集合或哪个集合的记录的数据会增长比较快,数据量会比较大?
功能的背后也是数据库的设计
答题小程序业务功能的背后,都是简单的数据,在设计数据库的时候要清楚的知道哪些功能会执行什么样的数据操作,集合与集合、集合与字段之间有着什么关系。
- 比如在线答题小程序都会有科目列表以及题目详情页,这是两个功能,科目列表强调查询的是符合条件的记录;而题目详情页则是单个记录下的字段;
- 比如用户除了有个人信息之外,还有角色(比如会员与非会员、内部员工与非内部员工等)。不同的角色在处理数据上又有哪些不同?
- 比如用户的点赞、收藏、评论等这些是应该放到用户的集合里,还是应该放到文章的集合里,或者是单独拿出一个集合来存储这些数据?
答题小程序数据库设计案例
目前我的答题小程序的数据库主要有6张表,分别为:用户表、分类表、题库表、答题记录表、收藏表、错题集表。
-
用户表 user
该集合主要用于记录用户信息,比如openid、昵称、头像等微信授权登录信息以及一些相关信息
-
分类表 category
该集合主要用于记录题目的分类,也就是科目或者专题,比如科目一、科目二、科目三等
-
题库表 question
该集合主要用于记录题目详细信息,题目类型、内容、选项、正确答案等属性
-
答题记录表 history
该集合主要用于记录参与答题的用户信息、答题时间、答题成绩等
-
收藏表 favor
该集合主要用于记录用户收藏的题目信息
-
错题集表 notes
该集合主要用于记录用户答错的题目信息
这里是不是存在多对多关系?
比如一个用户能答很多题,每个题也能被多个用户回答,如何处理这个?我没想明白