mysql分类标签表设计_⽂章分类和标签的数据库设计
⼏乎在所有web项⽬中,都涉及⽂章分类和标签的设计,应该说这是⼀个⽐较常见、典型的案例。站长并不保证我的思路就是最好的,只是分享出来⼤家⼀起交流⼀下,互相促进与提⾼。
我们假设的开发项⽬是⼀个博客系统,最核⼼的部分就是与⽂章相关的,那么我们今天讨论如何设计博客系统的⽂章分类和标签。
php创建一个长度为10的数组1、⾸先,分类和标签都是要和具体的⽂章相关联的,当然也可能⼀些⽂章既没有分类也没有标签,这⼀点是⼤家在写查询的时候容易疏忽的地⽅。因为我们的第⼀感觉就是,在查询⽂章列表的时候关联分类表,查出所有的⽂章和分类,对应关系⼀般是⽂章表的分类id对应分类表的id,使⽤where⼦句进⾏限定。这⾥就存在⼀个问题了,由于使⽤了where⼦句,那么只能查询有分类的⽂章,⽽没有分类的⽂章就查询不到了。这时候怎么办?应该使⽤连接查询,left join,这要没有分类的⽂章,在⽂章分类id那⼀栏会显⽰null。通常我们只使⽤left join,⽽很少使⽤right join。
2、⼀般,⼀篇⽂章最好只对应⼀个分类,当然如果你想要对应多个分类也可以。但站长并不提倡,⽂章在多个分类中重复会给⼈很不专业的感觉,即使有些⽂章可能确实设计到多⽅⾯的内容,那么你应就其中的侧重点来分类。⽽标签就不⼀样了,⼀篇⽂章可能有多个标签。这就意味着我们⽆法靠⼀个sql语句既查出所有⽂章的分类和标签,⼜做到查询结果中的⽂章id不重复。通常我们需要把查询出来的结果直
接循环出来,那么这个结果⼀般是⼆维数组,第⼆维的都存储了唯⼀⼀篇⽂章的相关信息。但是,标签和⽂章是多对⼀的关系,多个标签对应⼀篇⽂章,如果你只⽤⼀条sql语句的话,那么我们查询出来的结果,当然也是多⾏,这不符合我们⽬标数据的要求。应此,需要在查询完⽂章和分类之后,在前⾯结果的基础上再查询⼀次⽂章标签,把两次的结果结合起来,存在数组中,这是对应⽂章列表页⾯的查询⽅法。对于具体⽂章页⾯,可以分两次查询。
mysql语句分类好了,还没有给出具体的数据库设计,就先说了如何查询结果,相信⼤家也看烦了,下⾯就举例说明:
⼀、⽂章表:post,字段如下:
id【唯⼀标识】,aid【作者id】,title【标题】,content【内容】,cid【分类id】
⼆、分类表,category,字段如下:
id【唯⼀标识,与post表的cid关联】,name【分类名】
三、标签表,tag,字段如下:
小程序平台素材id【唯⼀标识】,name【标签名】
四、标签与⽂章对应关系表,tag_relationship,字段如下:
id【唯⼀标识】,postid【⽂章id,与post表的id关联】,tagid【标签id,tag表的id关联】
分数的原码
有朋友可能会问:为什么要单独⽤⼀个表来存储⽂章与标签的对应关系,为什么不可以直接在tag表中增加⼀个⽂章id字段呢,⽐如:
tag表:
id,postid,name
这样做的话,并不是不可以,但是,由于⼀篇⽂章对应多个标签,所以name字段的值会出现很多重复,⽐如⼀篇⽂章,假设⽂章id为1,有2个标签,php和mysql,那么在tag表会这样存储:
网页框架模板js中的下拉框id:1,postid:1,name:php
id2,postid:1,name:mysql
另⼀篇⽂章,假设id为2,有2个标签,也是php和mysql,那么在tag表中它会这样存储:
id:3,postid:2,name:php
id4,postid:2,name:mysql
⼤家很快就发现了问题,这样的设计name字段也就是标签的名称在同⼀张表中可能会⼤量重复。但是这样设计的好处是,如果你要查询⼀个标签下有多少篇⽂章,只要单独查这个表就可以了,⽐如要查询含有php标签的⽂章有多少篇,只需要select count(name) from tag where name=’php’,就可以查出来。不好的地⽅是,如果要查询所有标签的集合,使⽤这种设计需要使⽤group by name语句来去除重复的⾏。如果⽤之前的那种,只需要select * from tag就可以了。⼀时之间,好像不太好取舍。这两种设计都会有数据冢余,第⼀种
tag_relationship表中,存在tagid字段的重复;⽽这两种设计⼜都有各⾃的好处。那么我们到底该怎么选择呢?站长也说不好,所以⽆法为⼤家下结论。但是站长在研究wordpress数据结构的时候,发现wp是采⽤的单独建表存储⽂章与标签对应关系的⽅式。
另外,如何设计有时候也是取决具体功能的需求的,所以这个问题就留给⼤家⼀起来讨论吧~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。