分类、标签设计及查询优化

news/2024/11/29 22:42:24/

文章目录

    • 问题
    • 分类和标签的设计
    • 知名开源系统的设计
      • jive论坛
      • Solo博客系统的设计
      • wordpress的数据库设计
    • 参考链接

问题

在很多业务系统中,都有对对象的分类和标签设计。在数据库层面如何设计相应的表,以及如何做查询优化,是一个比较普遍的问题。

分类和标签的设计

信息离不开搜索和分类,虽然机器学习能做到自动分类,但人工分类系统也是不可少的。
在一个系统中,有多种类型的对象,不同类型的对象都可以做分类。
为了统一处理,我把所有的分类都放到一棵树上。
不同类型的对象的分类对应于一棵子树。

例如,在我的系统中,有(博客,文摘,链接,图片,电子书)几个基本对象类型。
在分类树上,每个分类节点都可以服务于不同类型。

知名开源系统的设计

jive论坛

只有tag,没有分类,tag和帖子(thread)多对多的设计:

CREATE TABLE tag (tagID BIGINT NOT NULL,title varchar(50) default '',assonum int(20) NOT NULL default '0',PRIMARY KEY (tagID)
);
CREATE TABLE threadTag (threadTagID BIGINT NOT NULL,threadID BIGINT NOT NULL,tagID BIGINT NOT NULL,PRIMARY KEY (threadTagID),INDEX jiveThread_tagID_idx (tagID),INDEX tagID_jiveThread_idx (threadID)
);

Solo博客系统的设计

在 Solo 中一共有 3 张关联表:

  • archivedate_article:存档-文章关联
  • category_tag:分类-标签关联
  • tag_article:标签-文章关联

wordpress的数据库设计

WordPress数据库的11个数据表,没有单独的tag:

  • wp_commentmeta: 文章评论额外信息表
  • wp_comments: 文章评论信息表
  • wp_links :链接信息表
  • wp_options :基本配置信息表,通常通过get_option来操作,该表通常作为插件存储数据的一个地方。
  • wp_postmeta: 文章额外数据表,例如文章浏览次数,文章的自定义字段等都存储在这里
  • wp_posts :文章信息表,包括了日志、附件、页面等等信息。是WordPress最重要的一个数据表。
  • wp_terms :词汇表,也就是系统中各类对象。如文章、链接、标签的信息表。
  • wp_term_relationships :对象和分类的对应关系,如分类与文章信息表(wp_posts)、链接表(wp_links)的关联表。
  • wp_term_taxonomy: 分类信息表,区分wp_terms信息的分类类型,有category、link_category和tag三种分类类型。
  • wp_usermeta: 用户额外信息表 wp_users 用户基本信息表。存放系统所有用户基本信息。

在这里插入图片描述
三张表结构如下:

CREATE TABLE wp_terms (term_id bigint(20) unsigned NOT NULL auto_increment,name varchar(200) NOT NULL default '',slug varchar(200) NOT NULL default '',term_group bigint(10) NOT NULL default 0,PRIMARY KEY  (term_id),KEY slug (slug($max_index_length)),KEY name (name($max_index_length))
) CREATE TABLE wp_term_taxonomy (term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,term_id bigint(20) unsigned NOT NULL default 0,taxonomy varchar(32) NOT NULL default '',description longtext NOT NULL,parent bigint(20) unsigned NOT NULL default 0,count bigint(20) NOT NULL default 0,PRIMARY KEY  (term_taxonomy_id),UNIQUE KEY term_id_taxonomy (term_id,taxonomy),KEY taxonomy (taxonomy)
) CREATE TABLE wp_term_relationships (object_id bigint(20) unsigned NOT NULL default 0,term_taxonomy_id bigint(20) unsigned NOT NULL default 0,term_order int(11) NOT NULL default 0,PRIMARY KEY  (object_id,term_taxonomy_id),KEY term_taxonomy_id (term_taxonomy_id)
) 

参考链接

  • https://www.mezgy.com/201.html

http://www.ppmy.cn/news/102026.html

相关文章

docker可视化管理工具portainer忘记密码重置教程

目录 前言: 1 停止portainer容器 2 借助仓库 portainer/helper-reset-password 重置密码 3 重新启动portainer容器 4 验证是否修改成功 5 修改登录密码 前言: 由于学习的深入,各种账号密码实在是太多了,建议各位配置账号密…

【线程池】线程池的7种创建方式,详细讲解

文章目录 一、什么是线程池?二、线程池的分类三、线程池的使用四、ThreadPoolExecutor详解 一、什么是线程池? 线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,…

「实在RPA·交通物流数字员工」促进数字化转型加「数」度

一、交通物流行业数字化转型的重要性 作为国家和地区相连接的枢纽,交通物流行业在国民生活中扮演着重要的角色。经济的发展以及电商行业的迅速崛起使得交通物流业的重要作用更加凸显。随着5G技术、大数据云计算、机器人流程自动化的迅速发展,以及交通强…

基于Python+百度语音的智能语音ChatGPT聊天机器人(机器学习+深度学习+语义识别)含全部工程源码 适合个人二次开发

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境ChatterBot 环境 模块实现1. 模型构建2. 服务器端3. 客户端4. 语音录入5. 接口调用6.模型训练及保存 系统测试1. 模型效果2. 模型应用 参考资料其它资料下载 前言 本项目基于机器学习和语义识别技术…

北醒Modbus协议在Python下实现功能配置

目录 实验目的测试环境Python库需求Benewake(北醒) TF雷达接口及通讯协议说明接口定义Modbus通信协议说明功能码说明 接线示意图库安装说明例程运行与测试 实验目的 实现485接口系列雷达Modbus协议在Python上实现功能配置。 本例程界面分为主菜单、测距子菜单、配置子菜单&…

OpenAI如何让ChatGPT遵守了伦理道德的底线

OpenAI如何让ChatGPT遵守了伦理道德的底线 AI为什么要守住伦理道德的底线 AI的伦理道德是探讨AI带来的伦理道德问题及风险、研究解决AI伦理问题、促进AI向善、引领人工智能健康发展的一个多学科研究领域。AI的伦理领域所涉及的内容非常丰富,是一个哲学、计算机科学、法律、经…

Unity3D:项目 ID 不匹配的情况下如何应对

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 如果在 Services 窗口的 Settings 中找不到项目 ID,或者如果发现项目 ID 不匹配,这可能是因为使用了较早版本的 Unity 来升级项目,或在脱机时创建…

.Net关于设计模式的面试题

设计模式面试题 1、那些地方用到了单例模式 答: 网站的计数器,一般也是采用单例模式实现,否则难以同步。应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。多线程…