本文是[链接]的一个章节,该系列文章将介绍 [链接] 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 本章我们主要介绍 Solo 的表结构定义。一些公共约定: 默认所有表都以 b3_so ..

Solo 表结构

本贴最后更新于 316 天前,其中的信息可能已经时移俗易

本文是《Solo 从设计到实现》的一个章节,该系列文章将介绍 Solo 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 ❤️

本章我们主要介绍 Solo 的表结构定义。一些公共约定:

可以说 Solo 是以“轻数据库重程序”的思路来主导设计和实现的。

关联表

关联表的表结构非常类似,用于记录一种数据和另一种数据的关联。

列名 类型 长度 备注
oId varchar 19 主键
type1_oId varchar 19 类型 1 的主键
type2_oId varchar 19 类型 2 的主键

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

其实理论上可以将这 3 张表合并为一张,通过加入一个“类型”列来区别关联类型,并预留一些各种类型的字段用于扩展。不过实际上我们并没有在 Solo 中这样做,因为表的数量并不重要,而且这样的抽象似乎意义不大。

不过既然都这样想了,我们在另一个博客系统中就真进行了尝试,有兴趣的话可以了解一下 Pipe

用户表 b3_solo_user

列名 类型 长度 备注
oId varchar 19 主键
userName varchar 255 用户名
userURL varchar 255 用户链接地址
userRole1 varchar 255 用户角色
userAvatar varchar 255 用户头像图片地址
userB3Key varchar 64 用户 B3 Key
userGitHubId varchar 32 用户 GitHub User Id

文章表 b3_solo_article

列名 类型 长度 备注
oId varchar 19 主键
articleTitle varchar 255 文章标题
articleAbstract1 text 文章摘要
articleAbstractText text 文章摘要纯文本
articleTags2 text 文章标签,英文逗号分隔
articleAuthorId varchar 19 文章作者 id
articleCommentCount int 11 文章评论计数
articleViewCount int 11 文章浏览计数
articleContent1 mediumtext 文章正文
articlePermalink varchar 255 文章访问路径
articlePutTop char 1 文章是否置顶
articleCreated bigint 20 文章创建时间戳
articleUpdated bigint 20 文章更新时间戳
articleRandomDouble3 double 文章随机数
articleSignId varchar 19 文章签名档 id
articleCommentable char 1 文章是否可评论
articleViewPwd4 varchar 100 文章浏览密码
articleImg1URL varchar 255 文章首图地址
articleStatus int 11 文章状态5

评论表 b3_solo_comment

列名 类型 长度 备注
oId varchar 19 主键
commentContent text 评论内容
commentCreated bigint 20 评论创建时间戳
commentName varchar 50 评论人名称
commentOnId varchar 19 评论文章或页面的 id
commentSharpURL varchar 255 评论访问路径,带 # 锚点
commentThumbnailURL varchar 255 评论人头像地址
commentURL varchar 255 评论人链接
commentOriginalCommentId1 varchar 19 父评论 id
commentOriginalCommentName varchar 50 父评论人名称

导航表 b3_solo_page

列名 类型 长度 备注
oId varchar 19 主键
pageOrder int 11 页面导航栏排序
pagePermalink varchar 255 页面访问路径
pageTitle varchar 255 页面标题
pageOpenTarget varchar 255 页面打开方式1
pageIcon varchar 255 页面小图标地址

标签表 b3_solo_tag

列名 类型 长度 备注
oId varchar 19 主键
tagTitle varchar 255 标签标题

分类表 b3_solo_category

列名 类型 长度 备注
oId varchar 19 主键
categoryTitle varchar 64 分类标题
categoryURI varchar 255 分类访问路径
categoryDescription text 分类描述
categoryOrder int 分类展现的排序
categoryTagCnt int 分类下聚合的标签计数

文章分类是通过聚合标签实现的:

  1. 将一组标签归类到一个分类下
  2. 用户发布文章时使用这组标签中的一个或多个
  3. 这篇文章将被自动聚合到该分类下
  4. 一篇文章可被归属于多个分类下

这样设计能让分类成为动态的,文章不用固定设置分类,可以随时通过调整分类包含的标签来达到动态聚合分类的效果。

存档日期表 b3_solo_archive

列名 类型 长度 备注
oId varchar 19 主键
archiveTime bigint 20 存档日期时间,该月份第一天的时间戳

友链表 b3_solo_link

列名 类型 长度 备注
oId varchar 19 主键
linkAddress varchar 255 链接地址
linkDescription varchar 255 链接描述
linkOrder int 11 链接展现的排序
linkTitle varchar 255 链接标题

支持友链这个特性其实颇为画蛇添足,因为完全可以用自定义页面来实现友链页面。更进一步,自定义页面其实也是比较累赘的,其实只需要自定义导航,然后将这个导航跳转到某篇文章链接即可。这些过度设计在 Pipe 中得到了改进。

插件表 b3_solo_plugin

列名 类型 长度 备注
oId varchar 19 主键
author text1 插件作者
name varchar 255 插件名称
status varchar 10 插件状态2
version varchar 10 插件版本
setting text 插件数据,JSON3

配置表 b3_solo_option

列名 类型 长度 备注
oId1 varchar 19 主键
optionValue text 配置项值
optionCategory varchar 20 配置项分类

表设计小节

Solo 的数据库设计我们一直在进行着修正和完善,相信最终我们会让它达到一个简约的状态,让大家能够一目了然的同时不影响功能和性能。

当然,这不仅仅是数据库设计的目标,在整个项目的技术方面,我们都会尽量朝着这个目标努力,好用并可读的程序才有可能成为一个受欢迎的项目,才有可能让更多的开源爱好者参与进来。


回到全文目录:《Solo 从设计到实现》

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    920 引用 • 6985 回帖 • 665 关注
  • 设计
    89 引用 • 593 回帖 • 1 关注
  • 文档
    50 引用 • 1087 回帖 • 1 关注
29 回帖
请输入回帖内容...
  • alanfans 1

    文章 评论表那里显示有问题

    imagepng

    1 回复
  • yang17762622

    solo 中文章搜索好像没有带 ID,我用一个一般用户,也能看到管理员的文章?

    1 回复
  • 88250

    能看,但是不能改。 如果有独立的多用户场景,建议用 [Pipe] 博客平台,因为 Solo 的多用户主要是用来给团队内部用的,不适合在公网上作为博客平台来使用。

    1 回复
  • yang17762622

    感谢 ~

  • vinasis

    👌

  • vinasis

    表格里的 tip 标注是怎么变小的

    1 回复
  • 88250 1 1 赞同

    HTML 标签 <sup>上标</sup>,类似还有下标 <sub>下标</sub>

  • Lakewis

    默认字符集是 latin1?????我数据库是 utf-8。

    1 回复
  • 88250 1

    建库时必须要用 utf8mb4。

    2 回复
  • Lakewis

    那自动生成的 b3_solo_xxx 表字段默认都是 latin1,建库使用 utf8mb4 不会冲突吗?

  • Lakewis

    感谢,初始化时数据库遇到两三个 bug,字符集 utf8 换成 utf8mb4 就没问题了。

    1 回复
  • PeterChu 1

    😏 这里这里有个小小的问题,也是格式问题
    imagepng

  • cxylive

    你们的数据库表时手动建的还是生成的

    1 回复
  • 88250

    自动生成的,不需要手动创建。

    1 回复
  • cxylive

    我怎么生成不了?

    2 回复
  • 88250

    点初始化按钮以后有报错?

    2 回复
  • cxylive

    15420995811png
    初始化按钮在哪?😂

  • cxylive

    找到了,要登录

  • betou

    时间戳使用 timestamp 会不会好一些。

    @88250

    1 回复
  • 88250

    timestamp 会自动转换时区,这个是不希望的。

  • EvilCodes

    这才是最有价值的干货

  • PeterChu

    学习学习
    这里的精华博大精深,够菜鸟的我学习好多次啦,嘎嘎

  • PeterChu

    做个笔记:

    文章浏览量如何统计计算

    1. 每次增加浏览量都变更该文章的在文章表中的记录吗?
    2. 从哪个层调用增加浏览量的方法,
    3. 是否需要处理同 IP 或同 user 的同一篇文章的浏览,
    4. 是否区别处理 Web 和 app 端的浏览,
    5. 如果将文章浏览量单独建表存储浏览量数据是否必要。

    文章表b3_solo_article

    articleViewCount int 11 文章浏览计数

  • rainningLovexiang

    启动项目后,直接浏览器启动:localhost:8080,会自动生成表

  • 17611165193

    用户角色是怎么创建的, 登陆过的都是管理员吗

    1 回复
  • 88250

    默认是访客用户,没有后台权限。管理员可以在用户管理中手动调整用户角色。

    1 回复
  • 17611165193 1 评论
    该回帖仅作者和楼主可见
    88250
  • AlismVY

    使用到的图片是保存在楼主的服务器吗

    1 回复
  • 88250

    是的

请输入回帖内容 ...