论如何设计博客分类标签系统

本文描述了这个博客背后归档系统的设计与实现思路。

逻辑模型设计

通常博客所用的归档方式有三种:

  • 按发布时间归档
  • 分类体系
  • 标签体系
    这三种归档体系是可以同时存在的,而且这样的设计也非常常见。
    其中按时间归档实在是Trivial,而且归档逻辑性也相对较弱,故在此略去不提。

通常分类与标签体系最大的区别在于,文章和分类是多对一的关系,而标签和文章是多对多的关系。
实际上在使用中,我发现分类确实不如标签好用。
在使用OneNote整理笔记的时候,经常出现一类很让人头疼的Delimma。比如,用Python做的可视化演示,究竟是应当放入Python分类中呢?还是放在可视化分类中呢?
避免这个问题,需要分类设计做到完全正交,然而真正能做到完全正交的分类体系又往往不甚实用……。更重要的一点是,每当我检索笔记的时候,往往是通过类似标签形式的关键词搜索去定位文章的……分类体系更是显得累赘了……

不过完全不要分类体系好不好?当然也不好,当然,多级分类应该拍扁成一级分类,这样分类就可以做成一个字段放入文章表中了。

所以在我看来,博客的归档系统,应当以标签系统为主,分类系统为辅。
分类系统必须是扁平的,不可有过多的类目,且尽量做到正交。
我的博客目前拟采用以下分类


  1. INSERT INTO categories (cate_name)
  2. VALUES ('未分类'), ('随笔文章'), ('生活记录'), ('工作记录'), ('文档剪藏'), ('读书笔记'), ('前端戏法'), ('后端杂技'), ('算法心得'), ('数据库'), ('部署运维'),('知识积累'), ('游戏杂谈');

而标签就会显得比较随意了。

数据模型设计

传统方法

传统上,按照数据库设计理论Blabla,应当这样设计:


  1. ------------- 基础表定义 -------------
  2. -- 登录信息表
  3. CREATE TABLE IF NOT EXISTS login (
  4. user_id SERIAL PRIMARY KEY,
  5. email TEXT NOT NULL UNIQUE,
  6. hashed_password TEXT NOT NULL
  7. );
  8. -- 用户信息表
  9. CREATE TABLE IF NOT EXISTS users (
  10. user_id INTEGER PRIMARY KEY REFERENCES login (user_id),
  11. email TEXT NOT NULL UNIQUE,
  12. name TEXT NOT NULL,
  13. avatar TEXT
  14. );
  15. -- 博文分类表
  16. CREATE TABLE IF NOT EXISTS categories (
  17. cate_id SERIAL PRIMARY KEY,
  18. cate_name TEXT NOT NULL UNIQUE
  19. );
  20. -- 博客文章表
  21. CREATE TABLE IF NOT EXISTS articles (
  22. article_id SERIAL PRIMARY KEY,
  23. user_id INT NOT NULL REFERENCES users (user_id),
  24. title TEXT NOT NULL,
  25. content TEXT NOT NULL,
  26. description TEXT,
  27. thumb TEXT,
  28. cate_id INTEGER NOT NULL REFERENCES categories (cate_id) DEFAULT 1,
  29. private BOOLEAN DEFAULT FALSE,
  30. ctime TIMESTAMP NOT NULL DEFAULT current_timestamp,
  31. mtime TIMESTAMP NOT NULL DEFAULT current_timestamp,
  32. read_cnt INT DEFAULT 0,
  33. upvote_cnt INT DEFAULT 0
  34. );
  35. -- 标签表
  36. CREATE TABLE IF NOT EXISTS tags (
  37. tag_id SERIAL PRIMARY KEY,
  38. tag_name TEXT NOT NULL UNIQUE
  39. );
  40. -- 标签映射表
  41. CREATE TABLE IF NOT EXISTS tag_mapping (
  42. article_id INTEGER REFERENCES articles (article_id) ON DELETE CASCADE,
  43. tag_id INTEGER REFERENCES tags (tag_id),
  44. PRIMARY KEY (article_id, tag_id)
  45. );
  46. ---------------- 复合类型定义 ----------------
  47. -- 文章类型,包括文章的详细信息
  48. CREATE TYPE article AS (
  49. user_id INTEGER,
  50. cate_id INTEGER,
  51. article_id INTEGER,
  52. title TEXT,
  53. content TEXT,
  54. description TEXT,
  55. thumb TEXT,
  56. private BOOLEAN,
  57. ctime TIMESTAMP,
  58. mtime TIMESTAMP,
  59. read_cnt INTEGER,
  60. upvote_cnt INTEGER,
  61. cate_name TEXT,
  62. email TEXT,
  63. name TEXT,
  64. avatar TEXT,
  65. tags JSONB
  66. );
  67. -- 文章摘要,除了content字段外的所有信息
  68. CREATE TYPE article_entry AS (
  69. user_id INTEGER,
  70. cate_id INTEGER,
  71. article_id INTEGER,
  72. title TEXT,
  73. description TEXT,
  74. thumb TEXT,
  75. private BOOLEAN,
  76. ctime TIMESTAMP,
  77. mtime TIMESTAMP,
  78. read_cnt INTEGER,
  79. upvote_cnt INTEGER,
  80. cate_name TEXT,
  81. email TEXT,
  82. name TEXT,
  83. avatar TEXT,
  84. tags JSONB
  85. );
  86. -- 标签信息
  87. CREATE TYPE tag AS (
  88. tag_id INTEGER,
  89. tag_name TEXT,
  90. article_cnt INTEGER,
  91. articles INTEGER []
  92. );
  93. -- 类目信息
  94. CREATE TYPE category AS (
  95. cate_id INTEGER,
  96. cate_name TEXT,
  97. article_cnt INTEGER,
  98. articles INTEGER []
  99. );
  100. -- 用户信息
  101. CREATE TYPE user_entry AS (
  102. user_id INTEGER,
  103. email TEXT,
  104. hashed_password TEXT,
  105. nickname TEXT,
  106. avatar TEXT
  107. );

这样设计的好处,当时只要对映射表轻松地聚合,就可以实现查询文章所有的标签和查询标签对应的所有文章,正查倒查效率都很高。当然坏处就是特么的查个标签最后我要Join三张表……

JSON方法

事实上,如果把标签作为一个Json字段放在文章表里,就可以省却很多这类破事了。
尤其是当PostgreSQL支持JSON索引的时候,直接通过where子句筛选标签字段,同样可以实现传统方法的功能,而且不需要额外的Join了。
不过后来,我发现JSON的设计还是不给力,因为如果我想统计每个标签下面究竟挂着多少文章,JSON的设计就蛋疼了。仔细想想,关系型数据库的崛起确实是因为它的确具有优越性。当然,最后定义了视图里面,还是采用了一些JSON字段的。

时间: 2024-10-05 23:10:43

论如何设计博客分类标签系统的相关文章

想做一个类似博客的系统,用的是百度编辑器,请问如何保存数据格式?

问题描述 想做一个类似博客的系统,用的是百度编辑器,请问如何保存数据格式? RT: 问题:1.如何将编辑器的内容保存? 2.数据库表改如何设计?字段给多大合适 3.最好有整个流程的事例参考一下 补充:jsp + ssh +oracle 这种效果难道是保存了多个HTML? 诉我是一个小白 ![图片说明](http://img.ask.csdn.net/upload/201508/03/1438588677_733913.jpg) 解决方案 一般是直接存html.数据库表用nvtext,不定长度 具

23个最具影响力的网页设计博客

  CSS-Tricks CSS-Tricks是Chris Coyier公众博客,专门讲一些有关CSS的话题.不过近几年来,CSS-Tricks有了下面一些扩展: Chris和Dave Rupert一起创造了ShopTalk 播客,在里面可以讨论所以有关网页设计和开发的事情. Chris 出过几本书,做了一个 Lynda.com的Wordpress主题课程,并且他还创建了一个The Lodge的课程教人们学习如何制作一个颇具现代感的网站. 超多很酷的项目,像 CodePen,HTML-Ipsum

Web前端开发工程师必读的15个设计博客

导读:Web设计是一个不断变化的领域,因此掌握最新的发展趋势及技术动向对设计师来说非常重要,无论是学习新技术,还是寻找免费资源与工具,设计博客都是很不错的去处.本文向大家推荐15个非常不错的设计博客. 1. Smashing Magazine Smashing Magazine创建于2006年,是最好的设计博客之一,有很多Web设计和开发方面的高质量文章,内容涉及HTML5.CSS.JavaScript.Photoshop.Wordpress.壁纸和网站可用性. 2. Net Tuts Net

国外设计参考:以web设计为主的国外设计博客

以web设计为主,兼之前端技术.平面.矢量.摄影以及素材.来源都是国外的blog.虽然都是英文的,但基本图像就可以说明一切,所以英语不好的同学也不用有负担. -----------------------------– Interview With Digital Artist Ferdi Rizkiyanto aka Pepey Pepey.是来自印尼著名平面设计师,他关于温室效应的招贴设计全球闻名(有沙漏的那幅).他的作品中既有激动人心的创造力,又具备无与伦比的细节.在一些广告设计中使用的三

网页设计参考:推荐20个网页设计/开发博客

文章描述:要从因特网上浩如星辰.眼花缭乱的网页设计博客中找到值得一读的,实非易事.为此,我们准备了一张清单,向大家推荐20个网页设计/开发博客.其中一部分相信大家已有耳闻,还有一些虽然名不经传却内容出色,希望大家能从博客精彩的内容中获益. 要从因特网上浩如星辰.眼花缭乱的网页设计博客中找到值得一读的,实非易事.为此,我们准备了一张清单,向大家推荐20个网页设计/开发博客.其中一部分相信大家已有耳闻,还有一些虽然名不经传却内容出色,希望大家能从博客精彩的内容中获益. Design Instruct

博客网站设计参考:主流的博客网站排版样式

到博客网站的排版设计,很多人都不会觉得默认.因为大多数博客都不会采用很另类的设计方法,而使用传统的比如左右分栏等,当然每种排版方式都有自己的优势和特点,也和博客本身的信息量以及博主的喜好有关. 本文来自国外博客网站,收录了当下主流的一些博客网站排版样式.如果单从布局上来看都差别不大.但每个博客都自己的特色与想要表达的主题,这也可能就是设计博客最迷人的地方所在 Inspect Element Burciaga Nuwomb Creative Down With Webster

设计理论:WordPress博客导航设计技巧

我的博客的导航的内容主要分为以下几种:博客分类导航(即放在页面顶部或者左侧/右侧的导航).标题.翻页/分页导航.其他导航(文章内链接.关键字.友情链接.文章内容导航等). 博客分类导航 1.导航的放置位置会影响到访客对博客内容的关注度和二次点击.在设计博客导航之初,只有页面的导航,而且习惯性地放在了头部(header.php).后来我发现,网页访客统计里有很多访客在点击顶部的页面(page),点击数大大超过了访问量最多的单篇文章的点击量,所以我在头部的导航里又加入了博客文章分类的导航,设计的时候

我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯 Android笔记本--半年来的研究笔记,导航. - 思想实践地 - CSDN博客 [魏祝林]Android中级教程 - Androi

QBlog博客 V2.5 版本发布 增加健康频道[支持多语言、多用户、多数据库、目录级URL]

QBlog发布历史回顾: 1:2010年11月08日---支持多语言.多用户.多数据库.目录级URL之路过秋天版博客发布[绝对有杀伤力的博客] 2:2010年11月10日---基础却容易被忽略的那点事--web入侵方式及注意事项总结 3:2010年11月15日---支持多语言.多用户.多数据库.目录级URL之路过秋天版博客 V1.0正式版 发布[含详细部署安装说明] 4:2010年11月17日---路过秋天版博客-皮肤制作指南 [附犀利哥入侵攻防站话题] 5:2010年11月29日---路过秋天