需求背景:
目前主流的博客系统、CMS都会有一个TAG标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据Tag来区分。可以单独的设计一个Map的映射表来增加系统的负载和查询的效率。
最近在做的一个视频分享项目需要用到标签,所以设计一个高效的tags数据表是必须的。
项目中一篇文章或视频可以有多个Tag,一个Tag也可能包含很多文章或视频
Tag在使用过程中会有以下的几种操作:
1、添加
2、删除
参照网上的资料有如下方案
数据库设计方案一:
使用2个Tag表,其中一个保存Tag信息,另一个保存映射信息
Tag表:
1 2 3 4 5 |
tagid # tag标签的ID tagname #tag内容 click #tag点击次数 num #当前Tag的引用个数 creat_time #tag创建时间 |
Tagmap表:
1 2 |
aid 文章表的文章id tagid tag表id |
Article表:
1 2 3 |
ID #文章ID title #文章标题 tags #tags列表,多个以,分割 |
这种形式,每次发布内容和修改内容的时候 都去更新一下Tag表和 Tagmap表。
查询的时候需要从Tagmap表中查找响应的文章ID,然后使用文章ID去查询具体的文章信息,因为每次查询都是使用索引,所以效率较高。
数据库设计方案二:
基本结构同方案一
只是在Tag表和Tagmap表中使用mongo/redis这样的nosql数据库服务器,这样可以发挥nosql数据库强大的线性查询能力。
1) 第一种方式的表结构设计与方案2完全相同,只是数据库服务器换了。
2)其他的方案,当然是发挥Nosql的线性能力来设计存储的Key了,尤其是使用redis的时候,使用的Key的结构可以完美的提高查询效率
涛哥redis 还没有研究透呢,透了用方案二。
新增标签时(标签去重,相同的不允许再添加;tags去左右空格,字母格式化小写)
article 增加一条数据
tag表 判断当前要写入的标签在tag表里是否存在,存在更引对应的标签的引用个数,不存在,则增加一条记录。
tagmap表 tags循环时增加文章id对应tagid记录。
用下面的Select可以选出一篇文章的所有Tags:
select tags from article where id = ‘id’;
用下面的Select可以选出一个Tag下面的所有文章:
$tagid = select id from tag where tagname link ‘%tagname%’;
$articles = select aid from tagmap where tagid = ‘tagid’;
转载请注明:PHP笔记 » 高效的Tags标签系统数据表设计方案