当前位置: 网站首页>小程序开发>小程序制作

宁德微信公众号开发【宁德网络推广】宁德建站、宁德网站维护、宁德网页制作、宁德微信小程序代运营公司

发表日期: 2021-05-24 09:36:10 浏览次数:145

宁德微信公众号开发【宁德网络推广】宁德建站、宁德网站维护、宁德网页制作、宁德微信小程序代运营公司

网站建设.jpg

宁德市隶属于福建省,别称闽东,中国大黄鱼之乡,国家园林城市。位于福建省东北翼沿海、福建闽东地区,东临东海,与台湾隔海相望,西邻南平,南接省会福州市,北接浙江,是福建离“长三角”和日本、韩国最近的城市。土地面积1.34万平方公里,直接相邻的海域面积4.46万平方公里,拥有世界级天然深水港三都澳。地形以丘陵山地为主,沿海为小平原,属中亚热带海洋性季风气候。

宁德市下辖蕉城区、福安市、福鼎市、古田县、霞浦县、周宁县、寿宁县、屏南县、柘荣县。第七次人口普查主要数据显示宁德市2020年常住人口314.68万人。

宁德也是中国东南沿海休闲度假和生态旅游的胜地 [1]  ,境内共有1个世界地质公园、2个5A级景区、3个国家级风景名胜区和7个省级风景名胜区。 [2]  滨海有嵛山、台山列岛、大京、西洋岛、三都澳等海岸景区;内陆拥有国家级森林公园2个,省级森林公园4个,国家级湿地公园1个,省级自然保护区2个,市级自然保护区9个。2019年11月15日,宁德市被授予“国家森林城市”称号。 [3] 

2020年宁德市实现地区生产总值2619亿元,同比增长6.0%。 [31] 


数据库结构的多层嵌套关系高性能读取

博客转nodejs已经开工一周了,每天晚上利用闲暇的几个小时完成几个功能,目前进度已完成一半了,架构已成型,前台页面的渲染已经差不多了,接下来很快进入后台管理界面,前后端都用js写,高吞吐高并发就是这么任性,高雅的回调和异步就是这么美丽。总的来说与我预期的相差不会很远,稍微难了一些。期间遇到的典型问题我会写博记录下来,可供他人与我后期翻阅。

今天写的是数据库结构的多层嵌套高性能读取,比如说评论楼层的嵌套,你@我,我@你,可以无限级@回复,各评论之间达到一种继承关系。wordprss对这种情况的数据库设计是在每个评论加个parent字段来指示继承关系,这种设计对写数据就很容易,但是你要以树形关系读出数据就不那么简单了。

1.最开始想的是每读一个parent的评论就再开个查询搜索其子评论,层数多以及评论多的情况下这是对数据库的致命打击,不可取。

2.再者是想并发查询,可是父评论与子评论的查询又有依赖关系,不可取。

3.然后是想着把这两种类型的评论都一起查出来,可是对于评论分页搞不了,不可取。

最终选择做两次查询,一次是全部查出父级(顶级)评论,第二次是全部查出子级评论,最后通过递归集中处理把这些嵌套一一对应插进去,毕竟算法的速度比无限开io查数据快太多,假如查出两组数据:

复制代码    var responses = [{name:"这是个好数组",id:25,parent:0},{name:"你是250",id:250,parent:0}];var others = [{name:"你是baby",id:2,parent:32},{name:"你是bob",id:3,parent:2},{name:"你很2",id:30,parent:2},{name:"我也是",id:32,parent:25}];复制代码

parent字段表示它属于哪个id的子集。 数据处理如下(前后端处理通用):

复制代码function inheritParent(parents,childrens){//parents全部父级元素的集合,childrens全部子级元素的集合for(var i = childrens.length - 1; i >= 0; i--){for(var j = parents.length - 1;j >= 0; j--){parents[j].childrens || (parents[j].childrens = []);//此字段强制要求有,没有也给个空数组if(childrens[i]){if(childrens[i].parent === parents[j].id){if(parents[j].childrens.indexOf(childrens[i])==-1){parents[j].childrens.push(childrens[i]);}childrens.splice(i,1);//插入后把其删除,节约循环次数,在大数据面前性能提高将会非常明显}else if(parents[j].childrens.length){arguments.callee(parents[j].childrens,[childrens[i]]);//递归查询}}}}}inheritParent(others,others);//子集间可能也会互相嵌套,先把它们继承整合inheritParent(responses,others);复制代码

注意加红色的字段替换成你的数据字段名。处理之后,只要是子集都会合并到父级中去,并且子集会去掉。结合实际数据库操作可参考我的路由处理方法代码:

复制代码function findComments(post_id,page,showunapproved,callback){if(arguments.length === 3){callback = showunapproved;showunapproved = undefined;}var response = {},comment_ids = [];var approved = showunapproved?[1,0]:[1];var find = {"comment_post_ID":post_id,"comment_approved":{$in:approved},"comment_parent":0};function getcomments(haveParent,response,callback){var show = {"_id":0,"comment_ID":1,"comment_author":1,"comment_author_url":1,"comment_date":1,"comment_content":1,"comment_approved":1,"comment_agent":1,"comment_parent":1};var _find = fn.extend(true,{},find);_find.comment_parent = haveParent?{$ne:0}:0;db.find(setting.doc.comments,haveParent?{}:{"sort":{"comment_date":-1},"page":page?(page-1):page,"pageamount":10},_find,show, function (err, result) {if(err){response.success = false;response.lists = [];}else{response.success = true;response[haveParent?"childrens":"parents"] = result;}if(!result || !result.length){return callback(err,response);}result.forEach(function(item){comment_ids.push(item.comment_ID);});callback();});}async.parallel({one:function(_callback){db.getAllCount(setting.doc.comments,find,function(count){response.amount = count;_callback(null,1);});},two:function(_callback){async.waterfall([function(call){async.parallel({"haveParent":function(_call){getcomments(1,response,function(){_call(null,1.1);});},"haveNotParent":function(_call){getcomments(0,response,function(){_call(null,1.2);});}},function(err){if(err){response.success = false;response.message = err;return callback(err,response);}call(null,comment_ids);});},function(lists,call){response.lists = response.parents.concat(response.childrens);db.find(setting.doc.commentsmeta,{},{"comment_id":{$in:lists},"meta_key":"city_name"},{"comment_id":1,"_id":0,"meta_value":1}, function (err, result) {if(err){response.success = false;response.message = err;return callback(err,response);}response.lists.forEach(function(item){item.city = "火星";result.forEach(function(_item){if(item.comment_ID === _item.comment_id){item.city = _item.meta_value;}});});fn.inheritParent(response.childrens,response.childrens);fn.inheritParent(response.parents,response.childrens);response.lists = response.parents;call(null,2);});}],function(err){if(err){response.success = false;response.message = err;return callback(err,response);}_callback(null,2);});}},function(err){callback(err,response);});}复制代码

当然,让这个处理放在客户端更加好,缺点是子集评论,无论是多少级的,要一次性全部查出,如有更优的数据库查询大法望奔走相告。另外说一句,async让我写node很爽,这个代码片段包括async的并列请求,同步请求以及混搭,无空闲等待,最大化利用线程,是个好工具。


宁德微信公众号开发宁德网络推广宁德建站、宁德网站维护、宁德网页制作、宁德微信小程序代运营公司

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878