问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

制作简单网页需要什么类型的数据库

发布网友 发布时间:2022-04-11 00:57

我来回答

2个回答

懂视网 时间:2022-04-11 05:19

MongoDB的特点

MongoDB是一个面向文档存储的数据库。在MongoDB中,一条记录叫做document(文档),由类似于JSON结构的键值对组成。
技术图片

由于类似于MongoDB直接存储JSON的特性,MongoDB天生适合作为存储结构复杂的数据结构的介质。类似于问卷调查和考试这种需求,用mysql这种关系型数据库实现起来太过复杂,效率低下;而如果使用MongoDB来实现的话,则会发现异常清晰简单。

需求分析

在一张试卷中,会有很多个问题,问题的类型大体上可以分为单选题、多选题、判断题、简答题等。每一个问题又会有很多个选项,选项可以是文字描述也可以是图片又或者图文结合。

技术图片

那么一张试卷的JSON格式应该大体上长成这样:

技术图片

当然这只是最简单的数据结构,要完成一张试卷,还需要加入更多的属性。

结构设计

我们采用自底向上的结构设计方式,先对每个选项的数据结构进行设计。

选项设计

public class Option {
 /**
 * 选项类型
 */
 private Integer oType = 1;

 /**
 * 选项内容
 */
 private String text;
 
 /**
 * 选项图片
 */
 private String img;

 /**
 * 是否正确答案
 */
 private Boolean right;

 /**
 * 用户是否选择
 */
 private Boolean selected;
 ...

选项类型oType用来标志选项是普通文本还是图片或者图文;right用来标志这个选项是否是正确答案,用于自动判卷;selected用来标志用户有没有选择这个答案。

问题设计

public class Question extends MongoBean {

 /**
 * 数据的id
 */
 private String dataId;

 /**
 * 题目类型,1判断题;2单选题;3多选题
 */
 private Integer qType;

 /**
 * 题目标题
 */
 private String title;

 /**
 * 题目选项
 */
 private List<Option> options;
 /**
 * 数据类型
 * @see rmjk.enums.BizTypeEnum
 */
 private Integer dataType;

 /**
 * 数据标题
 */
 private String dataTitle;
 /**
 * 解析
 */
 private String analysis;

 /**
 * 这题是否答对
 */
 private Boolean right;

 /**
 * 这题答的时长
 */
 private Long duration;

 /**
 * 这题的得分
 */
 private Long points;
 ...

dataId用于将这个问题同一个业务数据绑定,dataType用来标志这个业务数据的类型,这两个字段方便数据的扩展;dataTitle是业务数据的标题;options是这个问题的选项;analysis问题的解析,用于用户答题结束后的自查;right用来记录问题的正确与否。

新增问题

上层接口

提供新增问题的接口:

@PostMapping("/saveOrUpdateQuestion")
public JsonData saveOrUpdateQuestion(@RequestBody Question data) {
 questionService.saveOrUpdateQuestion(data);
 return JsonData.success();
}

QuestionService:

public void saveOrUpdateQuestion(Question data) {
 if (StringUtils.isEmpty(data.getId())) {// 新增
 writer.insert(manager.getExamDataBase(), ExamConstant.QUESTION_COLLECT, data);
 } else {//修改
 writer.updateDocument(data, ExamConstant.QUESTION_COLLECT);
 }
}

DAO

Writer:

public void insert(String dataBase, String collect, MongoBean data) {
 if (data.getId() == null) {
 data.setId(BsonTool.uuid());
 }
 MongoCollection<Document> collection = getCollection(dataBase, collect);
 collection.insertOne(Document.parse(JSONObject.toJSONString(data)));
}

public Document updateDocument(MongoBean data, String questionCollect) {
 Document filter = new Document();
 filter.put("id", data.getId());
 Document res = new Document();
 res.put("$set", BsonDocument.parse(JSONObject.toJSONString(data)));
 update(manager.getExamDataBase(), questionCollect, filter, res);
 return res;
}
public boolean update(String dataBase, String collect, Bson filter, Bson update) {
 MongoCollection<Document> collection = getCollection(dataBase, collect);
 UpdateResult ur = collection.updateOne(filter, update);
 return ur.getModifiedCount() > 0;
}

这样后端的工作就全部完成了,接下来就是前端怎么给后端提供这样的数据结构了。

前端实现数据结构

前端使用vue实现JSON的构造:

<Modal title="问题编辑" v-model="showEdit" :closable="false" :mask-closable="false">
 <Form ref="question" :model="question" :rules="ruleValidate">
 <FormItem label="题目类型:" prop="qType">
  <Select v-model="question.qType" class="input-180" placeholder="题目类型" @on-change="changeQType(question)">
  <Option v-for="d in qTypes" :value="d.value" :key="d.value">{{ d.label }}</Option>
  </Select>
 </FormItem>
 <FormItem label="题目:" prop="title">
  <Input
   class="input-95-per"
   v-model="question.title"
   type="textarea"
   row="1"
   placeholder="题目"
   ></Input>
 </FormItem>
 <FormItem label="选项:">
  <div v-for="(o, i2) in question.options" :key="i2" style="display:flex">
  <Input class="input-95-per margin-bot-8 margin-right-10" v-model="o.text">
   <span slot="prepend">{{i2+1}}:</span>
  </Input>
  <Button size="small" @click="addOpt(question)" v-if="i2===0">+</Button>
  <Button size="small" @click="delOpt(question, o)" v-if="i2">-</Button>
  <Checkbox v-model="o.right">正确答案</Checkbox>
  </div>
 </FormItem>
 <FormItem label="答案解析:">
  <Input
   class="input-95-per"
   v-model="question.analysis"
   type="textarea"
   row="1"
   placeholder="答案解析"
   ></Input>
 </FormItem>
 </Form>
 <div slot="footer">
 <Button type="text" @click="cancelQuestion">取消</Button>
 <Button type="primary" :loading="saveLoading" @click="saveQuestion">保存</Button>
 </div>
</Modal>

这里绑定的question就是一个问题了。而一张试卷则是由多个问题,再加上试卷的额外属性构成的。

技术图片

question上的dataId刚好就能绑定上试卷的id

Exam exam = new Exam();
List<Question> questions = reader.findRandom(manager.getExamDataBase(), ExamConstant.QUESTION_COLLECT, new Document(), Question.class, no);
exam.setTitle(title);
exam.setDuration(dutation);
return exam;

技术图片
转评赞就是最大的鼓励
技术图片

MongoDB实现问卷/考试设计

标签:ted   数据绑定   http   random   private   rto   简单   slot   hang   

热心网友 时间:2022-04-11 02:27

其实你的问题很难,我只是按我的经验谈谈看法:
1、如果只是简单的内容发布,一般用关系型数据库就很好;
2、对于你说到的问卷调查,由于问卷的问题可能很多,不同问卷又各不相同,这样用关系型数据库确实不方便,可以尝试“文档数据库”,如mongoDB,我也是刚在学,这种数据库可以每一条的记录都不相同,应该适合于问卷调查这种应用。追问①那如果是极简的登录页面呢?②另外,能否帮我解释一下这三种数据库的区别(尽量简短一点,易懂一点,具体一点)③这三种数据库的兼容情况怎么样,比如和DW,access。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黑色芳纶哪家的好一些? 苏子叶我们中国叫什么苏子叶在中国叫什么 福州小车过户多少钱啊 福州车辆过户要多少钱 民生山西怎么查不到医疗保险信息 app查询养老金医疗保险方法介绍_百度... 太原医保查询平台(附入口二维码) 鉴定伤残等级去哪个部门 2024年中国铝业集团高管团队名单 2024中铝集团董事会成员一览 右枕位胎儿图怎么睡 一鸣楼宇对讲,刷卡开不了门,但分机能开,对讲能用,怎样维修? 价值3元 七彩虹GTX1080Ti Vulcan X LE 1 GTX1080Ti 11G几个型号的区别 价值1元 七彩虹GTX1080Ti Vulcan X LE 11 孩子上一年级,老师反映孩子上课总走神,注意力不集中,但是在家看电视的时候注意力挺好的,怎么回事呢? 我买了个1080ti o11g的显卡。开机后怎么能看出来是o11g? 鲁大师上显示11g 问一下我这个参数对吗 七彩虹(Colorful)iGameGTX1080Ti Vulcan X OC 1620-1733MHz&#47;10010MHz 11G&#47;352bit 微星gtx1080ti 11g duke和七彩虹gtx1080ti vulcan ad哪个好 七彩虹gtx1080ti 11g vulcanx oc 和le版有什么区别 在3岁前看电视与不看电视的孩子,日后专注力存在差距是否很大? 1080ti为什么11G最贵 支付宝被限制每笔收款1000怎么解决 为什么医生大多工作辛苦,却工资不高? 我懂得了医生的艰辛,作文? 如何用词语来形容乡村医生的辛苦 大家都说学医很辛苦,请问具体体现在哪 做医生真的很辛苦很忙吗? 学医很辛苦,为什么还有这么多人愿意学? 为何说从医之路是一个艰苦的过程? 医生给病人做手术时双腿下肢失去知觉,医生这份职业有多辛苦? 李不言值班一晚上接了24个电话,医生这份职业有多辛苦? 晚上悦薇水乳,白天可以用其他补水的水乳吗? 资生堂怡丽丝尔晚霜白天能用吗 18岁适不适合用资生堂的悦薇 广东2012年4月教师资格证考证成绩什么时候出来 陈小春认不出婚纱照,应采儿瞬间黑脸满是无奈,他们年轻时与现在有何变化? 明星结婚拍摄婚纱照,哪些明星的婚纱照很有亮点? 陈小春是因为妻子应采儿才一直爆火吗? 结婚多年,依旧甜蜜,陈小春和应采儿是怎样为婚姻保鲜的? 陈小春忘记婚纱照还认错儿子,应采儿皱眉苦笑,他们夫妻是如何相处的? 你觉得陈小春和应采儿真的很般配吗? 陈小春忘记婚纱照、认错儿子、吐槽应采儿变老,他到底有多直男? 应采儿怀三胎了吗 有哪些明星不按套路拍婚纱照? 如何看待应采儿和陈小春的爱情? 求陈小春和应采儿那张蹲着叼着烟的婚纱照~ 陈小春秀恩爱的方式应采儿有没有被暖到? 应采儿为啥会放弃成向太儿媳,嫁比父亲小6岁的男人? 艾灸灸完后没用完怎样灭火 陈小春应采儿婚纱照蹲在地上吸烟那张,能当电脑壁纸的 无水印的 定西周边有哪些学校 类似于职业中专