当前位置: 首页 > news >正文

济南网站建设系统介绍服务昆明优化网站公司

济南网站建设系统介绍服务,昆明优化网站公司,尚学教育,网站建设运营合同模板解决delete_flag使用不规范造成的bug 1.场景 历史遗留BUG,场景:一共两个mapper,有一百多个sql,有90%以上的连表JOIN是没有加delete_flag1条件,导致查询出来的结果会产生近乎笛卡尔积。 2.解决方法 先思考再动手&…

解决delete_flag使用不规范造成的bug

1.场景

历史遗留BUG,场景:一共两个mapper,有一百多个sql,有90%以上的连表JOIN是没有加delete_flag=1条件,导致查询出来的结果会产生近乎笛卡尔积。


2.解决方法

先思考再动手,理清楚SELECT FROM JOIN WHERE之间的数量关系以方便

  • 每次JOIN关联表必须带delete_flag = 1,WHERE中本应只写一个原表的delete_flag = 1 ,但以前写的有些全堆在了WHERE中

  • 先ctrl + F 高亮,alt + J 框选,让JOIN更明显,挨个在JOIN之后加delete_flag = 1

  • 加完之后一定存在冗余,搜索每个WHERE条件,在WHERE条件下,一旦找到两个delete_flag = 1 那么一定有多余的

  • 最后核对数量 ctrl + F 搜索数量 JOIN + WHERE = delete_flag

3.小结

除了利用数量关系来核对以外,个人认为应该在SQL语句中,每次JOIN都紧随其后添加一个delete_flag = 1,至于原始的那张被关联表,delete_flag则应单独放在最后的WHERE中


把图片按自定义的层级关系及名称压缩打包,但不放入服务器
我的其他文章里有关于这个问题解决方案的小demo

1.场景

业务场景:学生提交作品中有很多图片,需要分层级按:活动名》班级》姓名》作品名》作品图片集合 压缩打包,并且因为这个作品是时常变化的,所以不能把压缩包放到服务器上

要求:请求接口之后把压缩包发来,不准存服务器然后发url

2.最终解决方案

  • 把最终的zip流输出到response.getOutPutStream()中
  • 在输出之前,先要设置请求头 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(activityName) + ".zip"); ————用于指定最终输出的zip压缩包的名字,这个URLEncoder.encode()十分重要,否则中文会乱码
  • 公司内部框架直接获取图片的byte[] ,遍历写入》》缓冲流write() 《《 压缩流 《《 response.getOutPutStream()
  • SQL查询出来年级、班级、姓名、作品名字、图片url , 然后putZipEntry(new Entry(用//来分层级))
  • 业务方面:有的学校的班级是中文,因此必须CONCAT拼接。而为了保证最终文件可排序,因此不用”一年级“ 而用 ”1年级“ 形如:new ZipEntry(“活动测试//1年级1班//张三-开心假期”)

3.浏览器适配问题


  • 该方案设置请求头.setHeader(“Content-Disposition”, “attachment; filename=” +)直接强制在文件的末尾加上zip,可以防止因为不同浏览器无法解析ContentType导致的文件格式错误(google可以不指定)
  • 尝试给edge浏览器做适配,发现除了上面的方法,没有其他方法可以设置文件格式
  • 测试后,无论什么浏览器,压缩包末尾强制 .zip 文件接收后可以直接打开

设计非时序相关的排序功能

1.引言

分页查询很常见,在web网页端的分页,和移动端手机下滑的分页逻辑一般都不同

  • web端是常规的是指定页码数使用`limit #{start} , #{end}
  • 移动端一般不会指定页码数,而是根据上一次的最后一个id作为fromId(主键),先WHERE xxxid > fromId 然后limit #{size} 这样既符合手机下滑业务场景,也避免了页码过大查询速度降低的问题

2.移动端可能存在的问题

  • 如果我们是按时间排序,那么这套逻辑毫无问题!但是如果我们按班级排序(非时序):
  • 如果按班级升序每次我们查3条数据(limit 3 ),在如下表的作品提交顺序,可能出现的情况是:
班级作品id(fromId)(主键)
1班4 5 7 , 8 9 10
2班1号作品 2号 3号 ,6 12 13
第n次下拉手机屏幕作品id(fromId)(主键)
17 (取出1班的4 5 7号作品)
210 (取出1班的8 9 10号作品)
312 13(因为fromId > 10,所以前面1 2 3 6数据丢失了

我造的这个数据,无论是升序 还是降序,都会导致数据丢失,因此可以得出结论:

3.结论

像班级 年级 等等等 所有的 自增主键和排序依据不是时间线性相关的,都不能使用fromId作为排序依据

4.其他业务上的问题

4.1可能出现的中文排序

班级字段是VARCHAR,有的学校的班级是中文,因此需要用 正则 + CONCAT拼接

   ORDER BY cg.`grade_no` DESC ,  --grade_no是INTEGER类型CASE						 --class_no是VARCHAR类型,需要用正则匹配WHEN cc.`class_no` REGEXP '^[0-9]+$' THEN CONVERT(cc.`class_no`,UNSIGNED INTEGER)ELSE cc.`class_no` ENDASC;

4.2pass掉的fromId拼接排序方案

SELECT CONCAT(grade_no , class_no , 作品id) ..........ORDER BY CONCAT(grade_no , class_no , 作品id) 这个作品id就是fromId,如果把这个fromId拼在后面,理论上可以实现无遗漏排序,但是

  • 考虑到grade_no 和 class_no被拼接为字符串后比较 , 2>11 导致乱序,必须扩充补0;
  • 考虑到有的班级是中文,更不容易确定这个补0到底补几个
  • 无法预知未来是否会对按班级排序加索引

4.3pass掉的rownum方案

以上的“拼接方案”被pass了,那么是否可以自己实现一个Oracle的rownum来保存当前的行号呢?
可行,但是涉及子查询 、存储变量 ,很麻烦,效率低,大概长这样

set @rownum=0;SELECT@rownum:=@rownum+1 AS rownum

4.4耦合业务

  • 这个service层经过很多次的改动,有些改动后没有改注释,有的地方没注释,包括了管理员鉴权、班主任鉴权、创建者鉴权等等耦合业务,还包括了另一个模块的按投票排序功能
  • 个人认为既然逻辑不同,就应该把web端和移动端的业务完全隔离,互不影响,投票排序也可以单拎出去,没有必要为了复用而复用,为了减少代码量而减少代码量。一个优秀的设计不是完全的隔离无耦合,但也更不是把完全不同逻辑的业务揉在一起!

http://www.lbrq.cn/news/2450953.html

相关文章:

  • 武邑县网站建设陕西网页设计
  • wordpress 4.4.1兰州seo培训
  • 常用的网站建设技术百度seo优化教程免费
  • 两学一做网站注册重庆seo网络营销
  • app软件开发公司 用友yonmaker宁德seo公司
  • 网站上的广告位是怎么做的腾讯疫情实时数据
  • 网站建设标题微信公众号怎么开通
  • 宣传广告设计图片搜索引擎优化排名关键字广告
  • 做新闻类网站南宁seo网站排名优化公司
  • 如何管理网站页面设计超级优化
  • 建设教育局官方网站未来网络营销的发展趋势
  • 软件系统网站建设关键词挖掘啊爱站网
  • 网站建设经验材料武汉seo服务多少钱
  • 网站设计咨询电话百度集团公司简介
  • 网站接单平台广东百度推广的代理商
  • 没得公司可以做网站嘛北京网站优化哪家好
  • 做字网站东莞企业网站排名优化
  • 政府网站英文版建设seo是指什么岗位
  • 网站运营这么做做网站seo优化
  • 爱企查 免费如何优化企业网站
  • 网站建设学费网址大全浏览器app
  • 全世界做会展介绍的网站排名移投界seo
  • 做外链选择那些网站网络推广方案的内容
  • 做电商网站费用生成关键词的软件
  • ps做的网站怎样在dw里打开市场调研怎么写
  • dede网站本地访问速度慢计算机培训短期速成班
  • python做博客网站百度站长提交
  • 应该怎样做网站地图刷排名有百度手机刷排名
  • 江苏省住房和城乡建设委员会网站今日头条关键词工具
  • 企业网站优化服务主要围绕什么上海seo推广外包
  • PyTorch数据选取与索引详解:从入门到高效实践
  • 4.1.2 XmlInclude 在 C# 中的作用及示例
  • SpringAOP的实现原理和场景
  • 消息推送功能设计指南:精准触达与用户体验的平衡之道
  • 大数据之Hive:Hive中week相关的几个函数
  • 欧式装修颜色要怎么搭配?