【openblog】第七讲上 标签(tag)的实现-理论篇
/**phpall.cn技术交流qq群:75345798
*/
在博客中标签云已经很普遍了,实现文章的标签云第一步需要做的是设计它的数据表。这里希望大家明白一对一、一对多和多对多这三种关系。
总结下就是“一对一”建一个表;“一对多”建两张表,外键选择“一”方;
“多对多”建三章表,需要单独
“一对一”:例如一个文章有一个标题,这个算一对一的关系,建表的时候就只用建一个文章表,然后里面有标题字段就可以了。
“一对多”:例如有个文章和分类,一个分类可以有多个文章,建表的时候就需要建2个表,一个分类表,一个文章表。用外键来将这两个表关联起来。使用谁的外键呢?通常情况下是使用“一”的一方的主键来作为“多”的一方的外键。这个一对多关系我想大家应该经常使用,我就不说了。(当然文章与分类也可以是“多对多”的关系)
“多对多”:重点说一下,这个多对多关系,今天我拿这个文章和标签这两个实体来说明多对多的关系。大家想想,一篇文章可以给它多个标签是吧,例如某篇文章我给它的标签是“php”和“codeigniter”和“框架”这三个标签。而同时,一个标签也可以属于多篇文章,就像这里的“php”这个标签,可能很多文章的标签都可以是它。多对多关系则需要建立3张表。一张是文章表,一张是标签表,那第三张要怎么建呢,第三张表的目的是要将这两个表关联起来。第三张表则是要从文章表和标签表中抽出他们的主键,来作为这张表的外键。
看如下例子:
http://www.phpall.cn/images/many-many.jpg
Openblog的标签表和文章表设计跟这个思路是一样的。
数据库设计好了,我们现在就来看它的增删查改等基本操作了。尤其要注意有些操作可能同时涉及3个表。
“请参考上面的3个表”
插入:
Tag的插入是同文章的新建是在一起的,创建新文章的同时也创建了tag。插入tag之前需要判断是否数据库中已经存在了该tag,如果不存在该tag,则将tag插入“标签表”,
同时取得插入tag的id,并将该tag的id与刚才新建文章的id一起插入第三个表“文章-标签表”。
删除:
我们现在考虑删除一篇文章的时候,文章表、标签表和文章-标签表的情况是怎样的。
删除一篇文章的时候首先需要删除文章表里面的记录。既然那篇文章删除了,那么在文章-标签表里面所有包括那篇文章id的行都要删除,所以第二步是删除文章-标签表里面的信息。。然后还有个疑问,你把文章删除了,那篇文章对应的tag也应该会没有的啊?但是这里有个问题需要注意,因为某个tag可能既是这一篇文章的tag,它又是另外一篇的tag,所以现在还必须检测标签表和文章-标签表,如果发现某个标签在标签表中有记录,而在文章-标签表中没有记录,那就说明这些标签应该随着文章的删除而删除。
查找:(根据标签来查找文章)
在一些博客的首页我们经常会看到很多个标签,点击那些标签就可以找到想对应的文章。这个是如何实现的呢?
先查询标签表中符合你所选的行,然后根据标签表得到的标签的id来查询文章-标签表中符合条件的行,现在就得到的行中就包括了文章的id了,最后根据文章id来查文章表就可以得到想要的文章了。
实际上以上这个3个表联结的过程用一个语句即可实现的。
其中包括2个join然后再加个where条件判断。具体实现方法将在下一讲中说明。大家也可以思考一下这个问题。
更新:(这个留给大家思考。)
下一讲将结合具体的openblog的代码来讲解以上内容。请大家自行先看openblog的源代码。
相应的openblog源代码在
application\modules\admin\controllers\post.php 和application\modules\admin\models\post_model.php
以及:
application\modules\blog\controllers\blog.php 和
application\modules\blog\models\blog_model.php
相关文章:
第一讲:hmvc的一个支持模块
http://www.phpall.cn/forum/read.php?tid=263
第二讲:Openblog的目录结构和hmvc调用方法
http://www.phpall.cn/forum/read.php?tid=274
【openblog】第三讲 user模块 (强烈建议ci入门或者初级的朋友看)
http://www.phpall.cn/forum/read.php?tid=281
第四讲 admin模块中dashboard部分
http://www.phpall.cn/forum/read.php?tid=289
第五讲 admin模块 settings部分
http://www.phpall.cn/forum/read.php?tid=294
第六讲 【openblog】第六讲Admin模块的sidebar部分
http://www.phpall.cn/forum/read.php?tid=308
【openblog】第6.9讲 实现文章的按月份分类
http://www.phpall.cn/forum/read.php?tid=316
【openblog】第七讲上 标签(tag)的实现以及多对多关系的数据库操作-理论篇
http://www.phpall.cn/forum/read.php?tid=329
以后我们将会不定期的对openblog的源码进行一些分析。
openblog官方网站:http://www.open-blog.info/
博客演示:http://www.open-blog.info/demo/
源码下载:http://www.open-blog.info/downloads 链接失效?
页:
[1]