Python3Django配合Mongodb打造高性能高扩展标签云存储方案
书接上回,之前有一篇文章提到了标签云系统的构建:Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合),但是这篇只是浅显的说明了一下如何进行切词以及前端如何使用wordcloud2.js进行前端展示,本次主要讨论下标签分词切出来之后,如何进行存储。
假设我们目前文章-标签体系的需求是这样:
每篇文章都具有唯一的标题、描述以及 URL。
每篇文章都具有一个或多个标签。
每篇文章都具有作者的名称,以及喜欢
每篇文章都有用户的评论,用户名、消息、日期时间以及评论的喜欢度。
每篇文章都可以有 0 个或多个评论。
那么如果使用关系型数据库来设计,比较简单的设计方案可以是这样:
可以注意到,标签和文章的对应关系还是简单的一对多,如果做成比较灵活的多对多还需要增加一张关系表,这样就是四张表了。
如果使用nosql比如Mongodb来说,只需要一张表(聚合)就可以实现: { _id: POST_ID title: TITLE_OF_POST, description: POST_DESCRIPTION, by: POST_BY, url: URL_OF_POST, tags: [TAG1, TAG2, TAG3], likes: TOTAL_LIKES, comments: [ { user:"COMMENT_BY", message: TEXT, dateCreated: DATE_TIME, like: LIKES }, { user:"COMMENT_BY", message: TEXT, dateCreated: DATE_TIME, like: LIKES } ] }
可以看到标签是由数组实现的,那么关系型数据库mysql和非关系型数据库mongodb在标签实现中本质上有什么区别呢?
关系数据库如mysql中标签云的实现是简单的,标签和文章分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 而MongoDB为快速水平扩张以及极高的性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系。
假设我们的需求又有了变化,普通博客变身成为具有数百万篇文章的小说站.每个小说都有许多布尔属性,大约一万个可能的属性,每篇小说都有十几个章节,假设我希望能够实时(几毫秒)请求给出的前n项任何属性组合的标签。
你会选择推荐什么解决方案?毫无疑问,如果你在寻找极具扩展性的方案,Mongodb无疑更好。
而且从业务角度上来讲,无论是通过标签查文章,还是文章查标签这样的需求,都非常灵活,当然了根据文章查标签一般没问题,一般都是根据标签查文章的时候有性能问题,如果是纯关系数据库比如mysql很难解决性能问题,所以要借助 es 索引解决。es 索引的时候可以将 tagid 用逗号分隔,可以很快的根据一个 tagid,或者多个 tagid 查询到关联的文章 id,一般文章列表都是分页的,有这些文章 id 了,再去关系数据库里面取文章就行了,但是es又是另外一件事了,回头我们再讨论。
随后使用Django2.0.4来实现,首先安装好python的mongodb操作库pymongo pip3 install pymongo
值得一提的是,它会有一个相对应bson模块 也就是说 PyMongo模块的实现是基于和它一起的bson模块的。
bson是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型;BSON有三个特点:轻量性、可遍历性、高效性,但是空间利用率不是很理想。
基于Django插入标签的视图: import pymongo from bson import json_util as jsonb mongo_client = pymongo.MongoClient(host="localhost", port=27017) from django.http import HttpResponse,HttpResponseRedirect,JsonResponse from django.views import View class InsertTagsHandler(View): def get(self,request): db = mongo_client.test12 table = db.test12 res = table.find({"title":"123"}).count() print(res) if res > 0: result = "重复数据" return HttpResponse(json.dumps({"result":result},ensure_ascii=False)) else: table.insert({"title":"123","desc":["123","123"]}) return HttpResponse(json.dumps({"result":"添加成功"},ensure_ascii=False))
基于django通过文章查询标签 class FindArticleHandler(View): def get(self,request): db = mongo_client.test12 table = db.test12 res = table.find_one({"title":"123"},{"desc":1}) return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
基于django分组查询获取所有标签以及标签出现次数的统计 class TagsStatHandler(View): def get(self,request): db = mongo_client.test12 table = db.test12 pipeline = [{"$unwind":"$tags"},{"$group": {"_id": "$tags", "count": {"$sum": 1}}},] res = table.aggregate(pipeline) return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
基于django通过标签反查文章 class Tags2ArticleHandler(View): def get(self,request): db = mongo_client.test12 table = db.test12 res = table.find({"tags":{"$in":["123"]}}) return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
结语:经此一役,Mongodb的特点跃然纸上:结构灵活,表结构更改相对自由,不用每次alter的时候付出代价,适合业务快速迭代,而且json原生和大多数的语言有天然的契合。还支持数组,嵌套文档等数据类型。
苹果没有被华为干掉,却被手机壳谋杀了从万千手机中一眼认出iPhone来,正在变得越来越难。这让那些仍在为坚持使用苹果手机来彰显身份的果粉们,颇有些失望。渐渐地,人们总结出了规律,那些手机屏幕最小的,便是苹果手机。亲测
解读智慧零售盒马鲜生的电子价签在零售中发挥哪些作用?打败你的不一定是同行,有可能是跨界,不要小看跨界。在大润发乐购联华永辉家乐福等等还在拼的你死我活的时候,阿里京东美团甚至顺丰快递都加入了线下购物的拼杀,从社区购到体验店再到大型下线
华为新品发布会或定档12月9日手机等新品将亮相根据爆料显示,原定于12月2日的华为新品发布会或将改期为12月9日下午14点发布,此次发布会将带来华为nova10SE和儿童手表5X系列等新品。其中华为nova10SE将采用6。6
华为拿什么在2023年王者归来,余承东的牌面已经亮了芯片规则修改后,华为手机海思芯片等就受到了影响,华为手机销量一路下跌,麒麟9000等芯片也无法生产制造了。于是,任正非表示华为要向上捅破天向下扎到根。华为还全面进入芯片半导体领域,
斯诺克最新世界排名加里威尔逊飙升,丁俊晖下跌,赵颜居前十六北京时间12月5日,斯诺克苏格兰公开赛结束,最终加里威尔逊火力全开轰出92的比分横扫了超级黑马乔奥康纳,三次杀进排名赛决赛终于获得了冠军,取得了职业生涯质的飞跃,目前最新的世界排名
华为mate50独有功能,你的手机有吗?老款手机也可以用每个手机都有属于它自己的独有功能。这些功能或一直独有,也或许会在后续的升级中下放到其他型号上面。有的功能需要手机硬件支持,有的功能则会独占一段时间。不管出于什么原因,既然是独有,那
有了智慧物流,快递配送更便捷来源人民日报海外版安徽省合肥市肥东县龙塘工业园一快递企业内,工人在全自动化分拣机控制系统前忙碌。阮雪枫摄(人民图片)很多消费者发现,近年来快递送达时间缩短了,经常昨晚刚下单,今早就
智慧社区之社区管理系统随着市场经济的快速发展和城市化进程的不断扩大,社区已逐渐成为社会中最重要的基层单位。同时,随着外来人口的涌入和汽车所有权的快速增长,各种社会矛盾和冲突带来了更复杂的社区安全形势,突
截至目前,盘点搭载索尼IMX598传感器的手机1vivoX50搭载高通骁龙765G处理器,支持双模5G,采用7nmEUV集成式5G,集成度更高,功耗更低,视频游戏运行更流畅,画面更真实正面是一块6。56英寸的三星E3发光材料的
资讯小米13日本12月8号新品发布辟谣锐意新生自砍三刀MIUI14的重点依旧是挥刀自宫,这么做恰恰是对的,因为现在的大部分手机系统,功能都大差不差,安卓向苹果学习,苹果向安卓学习,对用户来说,这是好的。miui欠缺的就
ChatGPT正在影响我们创造消费和商业化媒体的方式本文信息来源generalist,作者MarioGabriele编译老雅痞,校对波动可行性见解如果你只有几分钟的时间,下面是投资者运营者和创始人应该知道的关于无止境的媒体内容人工智