日拱一卒无有尽,功不唐捐终入海

高效的Tags标签系统数据表设计方案

系统架构 Sam 2386℃ 0评论

需求背景:

目前主流的博客系统、CMS都会有一个TAG标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据Tag来区分。可以单独的设计一个Map的映射表来增加系统的负载和查询的效率。

最近在做的一个视频分享项目需要用到标签,所以设计一个高效的tags数据表是必须的。

项目中一篇文章或视频可以有多个Tag,一个Tag也可能包含很多文章或视频

Tag在使用过程中会有以下的几种操作:
1、添加
2、删除

参照网上的资料有如下方案

数据库设计方案一:

使用2个Tag表,其中一个保存Tag信息,另一个保存映射信息

Tag表:

Tagmap表:

Article表:

这种形式,每次发布内容和修改内容的时候 都去更新一下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标签系统数据表设计方案

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)