范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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原生和大多数的语言有天然的契合。还支持数组,嵌套文档等数据类型。

朱婷姚迪的经纪人能否介绍给李盈莹?李盈莹3年未能成功出国!2月17日,意大利著名经纪人Marcor和朱婷姚迪关系很好,在社交媒体平台上晒出了与朱婷姚迪的照片,并配文再次与朱婷姚迪相聚,很开心。要知道,经纪人给朱婷成功转会,年薪130万欧元是谁开口了,又一大鱼被查!曾担任中国足协副主席一职一人身兼两职,而两个岗位都不可小觑,一个管足球,一个管教育,可以说把中国两个腐败重灾区扛在了肩上,而这个人就是王登峰。王登峰目前是担任教育部司长,但是他在六年前担任过中国足协副主席太空科幻恐怖游戏的巅峰!死亡空间系列为何好评如潮?文艾渴echo差不多是在2005年的某一天,彼时踌躇满志的格伦斯科尔菲德渐渐有了个相当大胆乃至疯狂的想法他想要趁着事业的上升期(或者说与EA的蜜月期)将自己的团体EARedwood李铁打入敌人内部的铁汉子最近,虽然人看不见了,但是李铁却火遍大江南北,硬是凭一己之力上演了拯救中国足球的大戏。那么,中国足球到底有多么黑暗?赵本山,2005年正值巅峰的他不顾范伟劝阻,接手辽宁足球队,还投微星发布AXE6600三频WiFi6E游戏路由器,带RGB灯效IT之家2月17日消息,微星近日推出了型号为AXE6600的三频WiFi6E路由器,配备了6根天线,支持RGB灯效。该路由器有4个千兆LAN口和1个2。5GWAN口,此外还配备了1新民快评发展游戏业,给用户财产更多法律保护最近,中消协发布了2022年全国消协组织受理投诉情况分析。其中提到,关停类纠纷致消费者受损较大,包括网络游戏停服引发虚拟财产纠纷。一些网络游戏运营商在老款游戏停止服务时往往虎头蛇尾也谈象棋圈王天一郑惟桐现象1我是一个超级棋迷,超级到什么程度,象棋只知道规则,但是完全不懂战术,这样都可以把象棋直播从头看到尾,极其崇拜大师深远的算路。2以下理性讨论问题,谢绝网络喷子。3竞技体育的目标是胜NBA全明星周末来临!今年有什么看点呢?北京时间明天(2月18日),2023年NBA全明星周末即将在盐湖城犹他拉开大幕!作为全世界篮球迷一年一度的狂欢盛会,五星体育也将在本周六至下周一带来本届全明星周末的全部直播,欢迎您50亿英镑,卡塔尔财团即将收购曼联,红魔将和大巴黎成好哥们就在刚刚,有关曼联俱乐部的出售终于有了最新的进展。根据英国媒体天空体育带来的确切消息,卡塔尔财团将会以50亿英镑的价格拿下曼联。之前双方的谈判曾趋于停滞,格雷泽家族一直咬住60亿英趣味百科涨知识食物真的会相克吗?传说中食物相克的理论究竟是真是假?我们吃进去的食物,真的潜伏着大的危机吗?食物相克的说法由来已久,但大部分都是谣传。有些东西一起吃了,发现身体不适,就会得出这两个食物不能同食的观点用这4种食物当主食,比米饭馒头升血糖慢,哪种更适合你?有一类食物它们比馒头大米饭的能量更低升糖更慢,更有利于控糖维生素矿物质的含量更丰富是糖尿病病友的优质主食代餐它们就是薯类土豆山药红薯芋头薯类中,谁才是糖尿病主食的第一代餐?哪种更适
苹果没有被华为干掉,却被手机壳谋杀了从万千手机中一眼认出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编译老雅痞,校对波动可行性见解如果你只有几分钟的时间,下面是投资者运营者和创始人应该知道的关于无止境的媒体内容人工智