论如何设计博客分类标签系统
本文描述了这个博客背后归档系统的设计与实现思路。
逻辑模型设计
通常博客所用的归档方式有三种:
- 按发布时间归档
- 分类体系
- 标签体系
这三种归档体系是可以同时存在的,而且这样的设计也非常常见。
其中按时间归档实在是Trivial,而且归档逻辑性也相对较弱,故在此略去不提。
通常分类与标签体系最大的区别在于,文章和分类是多对一的关系,而标签和文章是多对多的关系。
实际上在使用中,我发现分类确实不如标签好用。
在使用OneNote整理笔记的时候,经常出现一类很让人头疼的Delimma。比如,用Python做的可视化演示,究竟是应当放入Python分类中呢?还是放在可视化分类中呢?
避免这个问题,需要分类设计做到完全正交,然而真正能做到完全正交的分类体系又往往不甚实用……。更重要的一点是,每当我检索笔记的时候,往往是通过类似标签形式的关键词搜索去定位文章的……分类体系更是显得累赘了……
不过完全不要分类体系好不好?当然也不好,当然,多级分类应该拍扁成一级分类,这样分类就可以做成一个字段放入文章表中了。
所以在我看来,博客的归档系统,应当以标签系统为主,分类系统为辅。
分类系统必须是扁平的,不可有过多的类目,且尽量做到正交。
我的博客目前拟采用以下分类
INSERT INTO categories (cate_name)
VALUES ('未分类'), ('随笔文章'), ('生活记录'), ('工作记录'), ('文档剪藏'), ('读书笔记'), ('前端戏法'), ('后端杂技'), ('算法心得'), ('数据库'), ('部署运维'),('知识积累'), ('游戏杂谈');
而标签就会显得比较随意了。
数据模型设计
传统方法
传统上,按照数据库设计理论Blabla,应当这样设计:
------------- 基础表定义 -------------
-- 登录信息表
CREATE TABLE IF NOT EXISTS login (
user_id SERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
hashed_password TEXT NOT NULL
);
-- 用户信息表
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY REFERENCES login (user_id),
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
avatar TEXT
);
-- 博文分类表
CREATE TABLE IF NOT EXISTS categories (
cate_id SERIAL PRIMARY KEY,
cate_name TEXT NOT NULL UNIQUE
);
-- 博客文章表
CREATE TABLE IF NOT EXISTS articles (
article_id SERIAL PRIMARY KEY,
user_id INT NOT NULL REFERENCES users (user_id),
title TEXT NOT NULL,
content TEXT NOT NULL,
description TEXT,
thumb TEXT,
cate_id INTEGER NOT NULL REFERENCES categories (cate_id) DEFAULT 1,
private BOOLEAN DEFAULT FALSE,
ctime TIMESTAMP NOT NULL DEFAULT current_timestamp,
mtime TIMESTAMP NOT NULL DEFAULT current_timestamp,
read_cnt INT DEFAULT 0,
upvote_cnt INT DEFAULT 0
);
-- 标签表
CREATE TABLE IF NOT EXISTS tags (
tag_id SERIAL PRIMARY KEY,
tag_name TEXT NOT NULL UNIQUE
);
-- 标签映射表
CREATE TABLE IF NOT EXISTS tag_mapping (
article_id INTEGER REFERENCES articles (article_id) ON DELETE CASCADE,
tag_id INTEGER REFERENCES tags (tag_id),
PRIMARY KEY (article_id, tag_id)
);
---------------- 复合类型定义 ----------------
-- 文章类型,包括文章的详细信息
CREATE TYPE article AS (
user_id INTEGER,
cate_id INTEGER,
article_id INTEGER,
title TEXT,
content TEXT,
description TEXT,
thumb TEXT,
private BOOLEAN,
ctime TIMESTAMP,
mtime TIMESTAMP,
read_cnt INTEGER,
upvote_cnt INTEGER,
cate_name TEXT,
email TEXT,
name TEXT,
avatar TEXT,
tags JSONB
);
-- 文章摘要,除了content字段外的所有信息
CREATE TYPE article_entry AS (
user_id INTEGER,
cate_id INTEGER,
article_id INTEGER,
title TEXT,
description TEXT,
thumb TEXT,
private BOOLEAN,
ctime TIMESTAMP,
mtime TIMESTAMP,
read_cnt INTEGER,
upvote_cnt INTEGER,
cate_name TEXT,
email TEXT,
name TEXT,
avatar TEXT,
tags JSONB
);
-- 标签信息
CREATE TYPE tag AS (
tag_id INTEGER,
tag_name TEXT,
article_cnt INTEGER,
articles INTEGER []
);
-- 类目信息
CREATE TYPE category AS (
cate_id INTEGER,
cate_name TEXT,
article_cnt INTEGER,
articles INTEGER []
);
-- 用户信息
CREATE TYPE user_entry AS (
user_id INTEGER,
email TEXT,
hashed_password TEXT,
nickname TEXT,
avatar TEXT
);
这样设计的好处,当时只要对映射表轻松地聚合,就可以实现查询文章所有的标签和查询标签对应的所有文章,正查倒查效率都很高。当然坏处就是特么的查个标签最后我要Join三张表……
JSON方法
事实上,如果把标签作为一个Json字段放在文章表里,就可以省却很多这类破事了。
尤其是当PostgreSQL支持JSON索引的时候,直接通过where子句筛选标签字段,同样可以实现传统方法的功能,而且不需要额外的Join了。
不过后来,我发现JSON的设计还是不给力,因为如果我想统计每个标签下面究竟挂着多少文章,JSON的设计就蛋疼了。仔细想想,关系型数据库的崛起确实是因为它的确具有优越性。当然,最后定义了视图里面,还是采用了一些JSON字段的。
论如何设计博客分类标签系统相关推荐
- 数据库设计-博客系统数据库的设计
数据库设计-博客系统数据库的设计 数据库整体设计 问题: 一个博客系统会有哪些功能呢,肯定会有的是博客列表,博客详情,评论,登陆注册等等这些功能,那应该建多少张表呢?应该给这些表添加哪些字段呢?字段的 ...
- 博客-评论系统数据库设计及实现
前言 最近在开发一个小型个人博客,在数据库设计方面遇到了一些问题,这里做一个记录. 我设计的博客包含博客的基本信息,包括标题.内容等,此外还包括博客的标签.类型和评论. 实际效果如下: 设计 一条博客 ...
- 基于java个人空间博客网站系统
个人空间博客系统基于java的servlet进行开发,基于B/S架构模式,开发软件有:Myeclipse,mysql数据库,Tomcat服务器,使用MVC三层分层思想,通过这些技术的实现,整个系统的性 ...
- 计算机毕业设计Java抑郁症患者博客交流平台(系统+源码+mysql数据库+Lw文档)
计算机毕业设计Java抑郁症患者博客交流平台(系统+源码+mysql数据库+Lw文档) 计算机毕业设计Java抑郁症患者博客交流平台(系统+源码+mysql数据库+Lw文档) 本源码技术栈: 项目架构 ...
- asp.net921旅游博客网站系统
项目编号:asp.net921旅游博客网站系统 运行环境:VS+SQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术:HTML+JS+HTML 开发语言:C#,框架:a ...
- 简单个人博客系统java web_JavaWeb个人博客项目:手把手教你实现博客后台系统之登录与注册...
JavaWeb个人博客项目:手把手教你实现博客后台系统之登录与注册 发布时间:2020-07-17 17:10阅读:( )字号: 大 中 小 后台系统的所有界面图以及之前的准备工作欢迎看我之前的博文& ...
- html5设计博客论文,基于HTML5的综合类博客设计与实现-计算机本科毕业论文
基于HTML5的综合类博客设计与实现-计算机本科毕业论文 (35页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 HUNAN JtfSlVE ...
- java毕业设计博客论坛系统Mybatis+系统+数据库+调试部署
java毕业设计博客论坛系统Mybatis+系统+数据库+调试部署 java毕业设计博客论坛系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...
- OO--第三单元规格化设计 博客作业
OO--第三单元规格化设计 博客作业 前言 第三单元,我们以JML为基础,先后完成了 PathContainer -> Graph -> RailwaySystem 这是一个递进的过程,代 ...
- Web前端开发工程师必读de设计博客
2019独角兽企业重金招聘Python工程师标准>>> Web设计是一个不断变化的领域,因此掌握最新的发展趋势及技术动向对设计师来说非常重要,无论是学习新技术,还是寻找免费资源与工具 ...
最新文章
- RPC的超时设置,一不小心就是线上事故
- Python3学习笔记-使用list和tuple
- Linux查找文件内容(grep)
- php 手机唯一标示_Php获取移动设备唯一标识
- 搭建基于Docker社区版的Kubernetes本地集群
- 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
- bcd编辑工具Linux,​快启动pe系统工具之BCD编辑工具各个功能详细介
- php十六进制字符串转成字节数组_10 天 5 千 Star!21 岁本科生给程序员开发的十六进制编辑器...
- logger异常日志要点总结
- 学习OpenCV时 ,添加:#includeopencv2/core/core.hpp等头文件出现无法编译的错误
- 身处小公司,如何在2年内快速突破,拿到大厂offer?
- 系统软件设计原则_软件系统设计原则
- 【May Be DNK】JSON.parse() and JSON.stringify()的两个实用技巧
- C语言编程,将26个英文字母大小写输出
- [UVALive - 4329] Ping pong 树状数组入门
- 工程文件参考——CubeMX+STM32F4+FreeRTOS+IIC实现JY901通讯
- 电脑端知乎不显示图片
- 新一轮勒索病毒变种全球肆虐 中国已遭攻击
- Procmon 的使用
- 2018海康威视前端面经