博客tag的一些问题解决

前往原站点查看

2022-04-11 01:24:53

  哒哒哒!今天完成了博客tag的添加,当然不是一帆风顺的。就几个问题进行汇总分享一下。

如何设计tag的数据库?

  这个问题当然一开始就让我考虑了很久,因为和需求分析阶段的粗糙分析相差还有很多。

  原本是打算在tag,blog两张表之外再加上一张blog_tag的表,也是传统的多对多的解决策略。但是仔细分析了个人的需求,额,感觉这样设计就删除和新增tag上对数据库的调用会很繁琐,因为不仅要更新tag库还要更新blog_tag库,如果删除blog内容则还要复杂。

  于是选择只建两张表。一张blog,一张tag,这个tag的关系模型是(name,bid),bid为blog的id,name则是标签的名字。通过这种方式使得标签可扩展性也大大增加。不过缺点也很明显,如果这张表比较大的时候检索各项东西都会比较慢,尤其是后期打算设计的按tag搜索功能。

新增的tag表如何与blog融合?

  新增了一张表,新增的操作是查询博客列表、查询博客内容需要追加tag数组,然后新建博客也要有追加tag的功能。其中查询博客列表着实困扰了许久。

  因为查询操作原本有分页、降序的功能,在这个基础上还要联合外表查询tag,让需求一下子麻烦起来。最开始想到的如下:

SELECT blog.*,tag.name FROM blog 
LEFT JOIN tag 
ON blog.id=tag.bid
ORDER BY id desc 
LIMIT #{param1},#{param2}

  一开始乍一看感觉没问题,无非是加个左外联罢了。但是事实上在顺序上有了问题,这样的语句是先外联然后再对结果表分页,这样会导致数据大量减少,全被重复的tag给占用了param2数量的记录。经过实践,如下的方式才是正确的:

SELECT sub.*,tag.name from
(
SELECT blog.* FROM blog
ORDER BY id desc
LIMIT #{param1},#{param2}
) sub
LEFT JOIN tag
ON sub.id = tag.bid

  使用了子查询左外联tag表从而使得结果正常处理。

然后是一些小的问题

  1. 赋值mybatis的mapper xml文件后,别忘了改namespace

  2. @ResponseBody需要数据为json格式,并且前端要带请求头。


好啦,以上就是今天加班加点做完的内容,当然了大部分时间用在了追踪springboot源码上了QAQ,原本打算重写绑定器的,但是失败了233。

今天就到这里,拜拜啦!




上一篇: 第一篇博客成立!
下一篇: 懒加载与日期文字化