Solo 表结构

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

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

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

  • 默认所有表都以 b3_solo_ 为表前缀
  • 对于日期时间类型,我们使用的是 UTC 毫秒时间戳,这样主要是为了避免引入时区问题。统一使用 bigint 存储 UTC 时间戳,程序里面处理时区转换
  • 没有外键约束
  • 没有关联查询,关联查询场景通过多次查询实现

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

关联表

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

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

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

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

其实理论上可以将这 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
  • 1 用户角色的取值:
    • 管理员:adminRole
    • 普通用户:defaultRole
    • 访客用户:visitorRole

文章表 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
  • 1 摘要和正文都是存的 markdown 原文,因为 md 也支持直接用 HTML,所以存 HTML 也是没有问题的,这主要看 markdown 渲染引擎的支持了
  • 2 虽然有 tag_article 关联表,但这里也进行了标签存储,主要原因是 tag_article 关联表是为了展示标签-文章列表,这里在 article 中单独存了 tag titles 是为了性能考虑,在渲染文章时不用多查(或者 join)一次关联表
  • 3 文章随机数是用来实现随机文章的,MySQL 和 H2 虽然都提供了 RAND() 函数,但是性能实在太差。通过查询时指定一个随机数作为条件和该字段比较就可以非常简单高效地查询随机文章列表
  • 4 文章浏览密码如果留空表示不需要浏览密码,文章是公开可访问的
  • 5 文章状态
    • 已发布:0
    • 草稿:1

评论表 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 父评论人名称
  • 1 评论因为可以回复,所以是个树形结构。用关系型数据库表示即需要一个 parent id 来保存父子关系

导航表 b3_solo_page

列名 类型 长度 备注
oId varchar 19 主键
pageOrder int 11 页面导航栏排序
pagePermalink varchar 255 页面访问路径
pageTitle varchar 255 页面标题
pageOpenTarget varchar 255 页面打开方式1
pageIcon varchar 255 页面小图标地址
  • 1 打开方式指的是 a 标签里的 target 属性值

标签表 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_archivedate

列名 类型 长度 备注
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
  • 1 插件作者列值允许使用 HTML,所以这个字段用了 text 类型
  • 2 插件状态
    • 启用:ENABLED
    • 禁用:DISABLED
  • 3 插件相关的数据以 JSON 字符串形式保存

配置表 b3_solo_option

列名 类型 长度 备注
oId1 varchar 19 主键
optionValue text 配置项值
optionCategory varchar 20 配置项分类
  • 1 主键没有用时间戳,而是配置项键名,在 Option.java 中的 OPTION_ID_C_* 定义

表设计小节

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

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

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1434 引用 • 10054 回帖 • 490 关注
  • 设计
    114 引用 • 797 回帖 • 1 关注
  • 文档
    56 引用 • 1289 回帖 • 2 关注
1 操作
88250 在 2020-05-25 18:32:36 更新了该帖

相关帖子

优质回帖
  • 88250 1 1 赞同

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

  • PeterChu 1

    存档日期表 b3_solo_archive

    存档日期表 表名已经更换为 b3_solo_archivedate

34 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 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

    articleViewCountint11文章浏览计数

  • rainningLovexiang

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

    1 回复
  • 17611165193

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

    1 回复
  • 88250

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

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

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

    1 回复
  • 88250

    是的

  • poordickey

    评论者的图片,如果用户更换了图片,评论显示可不就是用户老的图片吗?

    1 回复
  • 88250

    没错。

  • PeterChu 1

    存档日期表 b3_solo_archive

    存档日期表 表名已经更换为 b3_solo_archivedate

    1 回复
  • 88250

    感谢,已经更正。

  • caryfang

    但是数据库里的数据没有生成,程序会报各种 null 错误

请输入回帖内容 ...