几乎在所有web项目中,都涉及文章分类和标签的设计,应该说这是一个比较常见、典型的案例。站长并不保证我的思路就是最好的,只是分享出来大家一起交流一下,互相促进与提高。

我们假设的开发项目是一个博客系统,最核心的部分就是与文章相关的,那么我们今天讨论如何设计博客系统的文章分类和标签。

1、首先,分类和标签都是要和具体的文章相关联的,当然也可能一些文章既没有分类也没有标签,这一点是大家在写查询的时候容易疏忽的地方。因为我们的第一感觉就是,在查询文章列表的时候关联分类表,查出所有的文章和分类,对应关系一般是文章表的分类id对应分类表的id,使用where子句进行限定。这里就存在一个问题了,由于使用了where子句,那么只能查询有分类的文章,而没有分类的文章就查询不到了。这时候怎么办?应该使用连接查询,left

join,这要没有分类的文章,在文章分类id那一栏会显示null。通常我们只使用left join,而很少使用right join。

2、一般,一篇文章最好只对应一个分类,当然如果你想要对应多个分类也可以。但站长并不提倡,文章在多个分类中重复会给人很不专业的感觉,即使有些文章可能确实设计到多方面的内容,那么你应就其中的侧重点来分类。而标签就不一样了,一篇文章可能有多个标签。这就意味着我们无法靠一个sql语句既查出所有文章的分类和标签,又做到查询结果中的文章id不重复。通常我们需要把查询出来的结果直接循环出来,那么这个结果一般是二维数组,第二维的都存储了唯一一篇文章的相关信息。但是,标签和文章是多对一的关系,多个标签对应一篇文章,如果你只用一条sql语句的话,那么我们查询出来的结果,当然也是多行,这不符合我们目标数据的要求。应此,需要在查询完文章和分类之后,在前面结果的基础上再查询一次文章标签,把两次的结果结合起来,存在数组中,这是对应文章列表页面的查询方法。对于具体文章页面,可以分两次查询。

好了,还没有给出具体的数据库设计,就先说了如何查询结果,相信大家也看烦了,下面就举例说明:

一、文章表: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表会这样存储:

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是采用的单独建表存储文章与标签对应关系的方式。

另外,如何设计有时候也是取决具体功能的需求的,所以这个问题就留给大家一起来讨论吧~

转自:《第一php网》

mysql 分类标签表设计_如何进行文章分类和标签的数据库设计相关推荐

  1. 可以做mysql题的网站_基于PHP的试题题库管理网站的设计(ThinkPHP,MySQL)

    基于PHP的试题题库管理网站的设计(ThinkPHP,MySQL)(论文说明书12000字,程序代码) 摘要:本文设计并实现了一个基于PHP的试题题库管理网站.该网站包括两大模块:学生模块和管理员模块 ...

  2. 如何设计mysql的表结构_数据库的数据表的结构是如何设计的?

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  3. mysql 分析表结构_转使用procedure analyse()分析mysql给出的关于表结构的优化建议...

    菜鸟时代的我们当初在接到项目分析设计mysql数据库时,或多或少会借鉴于一些成熟的开源项目的数据库设计. 比如设计sns系统数据库时我们有可能会根据自己的数据库知识同时分析借鉴uchome的库结构,一 ...

  4. mysql 复制表耗时_聊一下mysql的表复制

    1 insert...from的问题 insert - select 是很常见的在两个表之间拷贝数据的方法.需要注意,在可重复读隔离级别下,这个语句会给 select的表里扫描到的记录和间隙加读锁. ...

  5. mysql 删表卡死_如何解决mysql 删表卡住的问题

    如何解决mysql 删表卡住的问题 mysql删表卡住的解决办法:首先执行"show full processlist;"语句:然后执行"kill processid;& ...

  6. 阿里 mysql建表规范_阿里的Mysql规范 MySQL库表设计规范

    阿里的Mysql规范 MySQL库表设计规范 表设计 1)     表必须定义主键,默认为ID,整型自增,如果不采用默认设计必须咨询DBA进行设计评估 2)    ID字段作为自增主键,禁止在非事务内 ...

  7. 清空mysql注册表步骤_完全卸载MySQL 数据库清空MySql注册表

    完全卸载MySQL 数据库--清空MySql注册表 完全卸载Mysql的步骤主要有以下4步: 1. 通过控制面板- 卸载程序--mysql 将其卸载掉. 2. 删除Mysql 安装文件目录下的Mysq ...

  8. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  9. mysql分表组件_利用Sharding-Jdbc组件实现分表

    看到了当当开源的Sharding-JDBC组件,它可以在几乎不修改代码的情况下完成分库分表的实现.摘抄其中一段介绍: Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动 ...

最新文章

  1. 深入分析 Jdk - 集合容器 Map 与 Set
  2. linux内存管理简介,Linux内存管理机制简介
  3. QT实现Three.js将Qt Quick项目用作纹理
  4. 牛客练习赛36 F-Rabbit的蛋糕 (叉积求面积, 记录前缀)
  5. CSDN总结的面试中的十大可视化工具
  6. 推断:Facebook的新Java静态分析工具
  7. 基于 Springboot 和 Mybatis 的后台管理系统 BootD
  8. 短网址还原 php,学习php简单实现短网址(短链)还原的方法
  9. mmdetection水下海鲜目标检测
  10. redis新数据类型-Geospatial
  11. 期末速通主成分分析(PCA)
  12. 北斗短报文一体机-Qt版(适用于Ubuntu和Windows)
  13. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码
  14. 英语chalchite蓝绿松石CHALCHITE单词
  15. Flak模型和应用(一对一,一对多,多对多)
  16. 数控加工仿真系统 - FANUC OI 铣床编程笔记(上)
  17. Python全局变量和局部变量(超详细,纯干货,保姆级教学)
  18. 小视频如何消重 视频剪切后md5值变了吗
  19. .NET/C# — EXCEL文件内容添加到数据库中
  20. Oracle Cardinality Feedback

热门文章

  1. 北斗卫星系统的心脏——中国原子钟发展的历史
  2. 学生管理系统(超详细)
  3. oracle数据库19c驱动包,Oracle Database 19c 19.3 Windows x64 64-bit 下载 安装
  4. ORACLE学习笔记(七)——DBMS_LOB包的学习和使用
  5. Android 第五章 TextView
  6. C:1094统计元音(函数专题)
  7. windows下tomcat集群配置(两种方法)
  8. 前端日期时间处理建议使用Momen
  9. 【系统集成项目管理工程师】—关键路径
  10. 冒泡piupiupiu