ReactPress数据库表结构设计全面分析

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。
ReactPress

ReactPress是一个基于React框架开发的开源发布平台和内容管理系统(CMS)。它不仅支持用户在支持React和MySQL数据库的服务器上搭建自己的博客和网站,还提供了丰富的功能,如文章管理、阅读、评论管理等。为了实现这些功能,ReactPress的数据库表结构设计显得尤为重要。

ReactPress数据库表结构设计全面分析

一、用户与权限管理

  1. 用户表(users)

    • 存储用户的基本信息,如用户名、密码、邮箱、头像、注册时间、最后登录时间等。
    • 关键字段:id, username, password_hash, email, avatar_url, created_at, last_login_at等。
  2. 角色表(roles)

    • 存储用户角色的信息,如管理员、编辑、普通用户等。
    • 关键字段:id, name, description, permissions(权限列表,可以是JSON格式)。
  3. 用户角色关联表(user_roles)

    • 建立用户与角色之间的多对多关系。
    • 关键字段:user_id, role_id

二、文章与内容管理

  1. 文章表(articles)

    • 存储文章的基本信息和内容。
    • 关键字段:id, title, slug(文章的唯一URL路径),content, author_id, created_at, updated_at, status(如发布、草稿、审核中等),views_count(阅读次数)等。
  2. 文章分类表(categories)

    • 存储文章分类信息。
    • 关键字段:id, name, parent_id(用于表示分类层级关系),created_at, updated_at等。
  3. 文章分类关联表(article_categories)

    • 建立文章与分类之间的多对多关系。
    • 关键字段:article_id, category_id
  4. 标签表(tags)

    • 存储文章的标签信息。
    • 关键字段:id, name, created_at, updated_at等。
  5. 文章标签关联表(article_tags)

    • 建立文章与标签之间的多对多关系。
    • 关键字段:article_id, tag_id

三、评论与互动

  1. 评论表(comments)

    • 存储用户对文章的评论信息。
    • 关键字段:id, article_id, user_id(评论者ID,可为空表示匿名评论),content, created_at, status(如已审核、待审核、删除等),parent_id(用于表示回复关系,即子评论的父评论ID)等。
  2. 评论点赞表(comment_likes)

    • 存储用户对评论的点赞信息。
    • 关键字段:id, comment_id, user_id, created_at等。

四、媒体与资源管理

  1. 媒体文件表(media_files)

    • 存储用户上传的媒体文件信息,如图片、视频、音频等。
    • 关键字段:id, file_path, file_name, file_type, upload_user_id, created_at, description(文件描述)等。
  2. 媒体与文章关联表(article_media)

    • 建立媒体文件与文章之间的多对多关系。
    • 关键字段:article_id, media_id

五、系统设置与配置

  1. 设置表(settings)
    • 存储系统的全局设置信息,如站点名称、Logo、域名、SEO设置等。
    • 关键字段:id, key(设置项的唯一标识),value(设置项的值,可以是字符串、数字、JSON等),created_at, updated_at等。

六、日志与审计

  1. 用户操作日志表(user_actions_log)
    • 存储用户的操作日志,如登录、发布文章、删除评论等。
    • 关键字段:id, user_id, action(操作类型),action_details(操作详情,可以是JSON格式),created_at等。

七、ReactPress 数据库表结构设计与代码示例

  1. 用户表(users)
    • 存储用户的基本信息。
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,avatar_url VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,role VARCHAR(50) DEFAULT 'user' -- 可以是 'admin', 'editor', 'user' 等
);
  1. 文章表(articles)
    • 存储文章的基本信息和内容。
CREATE TABLE articles (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255) NOT NULL,slug VARCHAR(255) NOT NULL UNIQUE,content TEXT NOT NULL,author_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,status VARCHAR(50) DEFAULT 'draft', -- 可以是 'published', 'draft', 'pending' 等views_count INT DEFAULT 0,FOREIGN KEY (author_id) REFERENCES users(id)
);
  1. 分类表(categories)
    • 存储文章分类信息。
CREATE TABLE categories (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,parent_id INT DEFAULT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (parent_id) REFERENCES categories(id) -- 用于表示分类层级关系
);
  1. 文章分类关联表(article_categories)
    • 建立文章与分类之间的多对多关系。
CREATE TABLE article_categories (article_id INT,category_id INT,PRIMARY KEY (article_id, category_id),FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (category_id) REFERENCES categories(id)
);
  1. 评论表(comments)
    • 存储用户对文章的评论信息。
CREATE TABLE comments (id INT AUTO_INCREMENT PRIMARY KEY,article_id INT,user_id INT,content TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(50) DEFAULT 'approved', -- 可以是 'approved', 'pending', 'rejected' 等parent_id INT DEFAULT NULL, -- 用于表示回复关系FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (user_id) REFERENCES users(id),FOREIGN KEY (parent_id) REFERENCES comments(id) -- 子评论的父评论ID
);
  1. 媒体文件表(media_files)
    • 存储用户上传的媒体文件信息。
CREATE TABLE media_files (id INT AUTO_INCREMENT PRIMARY KEY,file_path VARCHAR(255) NOT NULL,file_name VARCHAR(255) NOT NULL,file_type VARCHAR(50) NOT NULL,upload_user_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (upload_user_id) REFERENCES users(id)
);
  1. 媒体与文章关联表(article_media)
    • 建立媒体文件与文章之间的多对多关系。
CREATE TABLE article_media (article_id INT,media_id INT,PRIMARY KEY (article_id, media_id),FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (media_id) REFERENCES media_files(id)
);

代码示例

以下是一个简单的 Node.js(使用 Sequelize ORM)代码示例,用于连接数据库并定义上述表结构中的一个(例如,用户表)。

const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = new Sequelize('database_name', 'username', 'password', {host: 'localhost',dialect: 'mysql' // 或者 'postgres', 'sqlite', 'mariadb', 'mssql'
});class User extends Model {}User.init({username: {type: DataTypes.STRING,allowNull: false,unique: true},password_hash: {type: DataTypes.STRING,allowNull: false},email: {type: DataTypes.STRING,allowNull: false,unique: true},avatar_url: {type: DataTypes.STRING,allowNull: true},role: {type: DataTypes.STRING,allowNull: false,defaultValue: 'user'}
}, { sequelize, modelName: 'User' });// 同步模型到数据库
sequelize.sync().then(() => {console.log('Database & tables created!');}).catch(err => {console.error('Unable to create tables:', err);});

Shell 脚本

以下是一个简单的 Shell 脚本,用于在 MySQL 数据库中创建上述表结构。

#!/bin/bashDB_NAME="reactpress_db"
DB_USER="root"
DB_PASS="your_password"TABLES_SQL="
$(cat <<EOF
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,avatar_url VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,role VARCHAR(50) DEFAULT 'user'
);-- 其他表的创建语句...EOF
)
"mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME;"
mysql -u $DB_USER -p$DB_PASS $DB_NAME < <(echo "$TABLES_SQL")echo "Database and tables created successfully!"

总结

ReactPress的数据库表结构设计充分考虑了用户、文章、评论和媒体文件等核心元素,并通过关联表实现了它们之间的复杂关系。这样的设计不仅保证了数据的完整性和一致性,还为ReactPress提供了强大的功能和灵活性。同时,随着ReactPress的不断发展和完善,其数据库表结构也可能会进行相应的调整和优化。

ReactPress 系列文章

ReactPress 是什么?:https://blog.csdn.net/m0_37981569/article/details/143495843
ReactPress—基于React的免费开源博客&CMS内容管理系统:https://blog.csdn.net/m0_37981569/article/details/143455403
ReactPress数据库表结构设计全面分析:https://blog.csdn.net/m0_37981569/article/details/143662572
ReactPress 安装指南:从 MySQL 安装到项目启动:https://blog.csdn.net/m0_37981569/article/details/143662086
ReactPress – An Open-Source Publishing Platform Built with React:https://blog.csdn.net/m0_37981569/article/details/143635836
ReactPress:构建高效、灵活、可扩展的开源发布平台:https://blog.csdn.net/m0_37981569/article/details/143635551
ReactPress技术揭秘:https://blog.csdn.net/m0_37981569/article/details/143634709
ReactPress:深入解析技术方案设计与源:https://blog.csdn.net/m0_37981569/article/details/143610300
ReactPress:重塑内容管理的未来:https://blog.csdn.net/m0_37981569/article/details/143610158
ReactPress系列—NestJS 服务端开发流程简介:https://blog.csdn.net/m0_37981569/article/details/143536219
ReactPress系列—Next.js 的动态路由使用介绍:https://blog.csdn.net/m0_37981569/article/details/143535847

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANDROIDWORLD: A Dynamic BenchmarkingEnvironment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过&#xff0c;是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态&#xff0c;与静态的数据集&#xff08;比如说我自己的工作&#xff09;不同&#xff0c;因此…

华为ENSP--ISIS路由协议

项目背景 为了确保资源共享、办公自动化和节省人力成本&#xff0c;公司E申请两条专线将深圳总部和广州、北京两家分公司网络连接起来。公司原来运行OSFP路由协议&#xff0c;现打算迁移到IS-IS路由协议&#xff0c;张同学正在该公司实习&#xff0c;为了提高实际工作的准确性和…

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表 一.简介 在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置&#xff0c;同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy&#xff1b; PyMySQL — MySQL 数据库…

ADSP21489 M25P16启动后无法使用USBi的问题

项目背景是ADSP21489 使用SPI MASTER 启动模式,程序存储在M25P16中 编译cces产生运行代码 第二步,插上USBi仿真器下载sigma topo 发现无法正常下载 操作多次发现需要目标板重新上点后需要拔插usbi才能下载和启动dsp程序 原因分析: 就是第一次插上usbi后,在给目标板上电,可…

量子计算包kaiwu安装过程踩过的坑

目录 1 安装过程 2 官方代码测试 3 踩坑说明 首先&#xff0c;目前的kaiwu版本仅支持python3.8&#xff0c;所以必须要下载python3.8才能运行kaiwu 1 安装过程 step1: 在页面的SDK标签下&#xff0c;找到对应操作系统的kaiwu包。 step2: 下载python3.8到本地&#xff0c;可…

线程相关概念

线程概念 线程是操作系统中一种基本的执行单元&#xff0c;是程序的最小调度单位。一个程序可以包含多个线程&#xff0c;每个线程代表一个独立的执行路径&#xff0c;使得程序可以并发地处理多个任务。 线程的基本概念 线程与进程的区别&#xff1a; 进程是资源分配的单位&…

SSH实验5密钥登录Linuxroot用户(免密登录)

当用户尝试通过SSH连接到远程服务器时&#xff0c;客户端会生成一对密钥&#xff1a;公钥和私钥。公钥被发送到远程服务器&#xff0c;并存储在服务器的~/.ssh/authorized_keys文件中。而私钥则由客户端保管&#xff0c;不会传输给服务器。 在连接过程中&#xff0c;客户端使用…

域名邮箱推荐:安全与稳定的邮件域名邮箱!

域名邮箱推荐及绑定攻略&#xff1f;最好用的域名邮箱服务推荐&#xff1f; 域名邮箱&#xff0c;作为一种个性化且专业的电子邮件服务&#xff0c;越来越受到企业和个人的青睐。烽火将详细介绍域名邮箱登录的全过程&#xff0c;从注册到登录&#xff0c;帮助您轻松掌握这一重…

政治经济学笔记

【拯救者】政治经济学速成&#xff08;基础习题&#xff09; 研究生产关系必须联系生产力和上层建筑 1.生产力与生产关系 生产力代表生产的物质内容&#xff0c;生产关系是生产的社会形式。生产力决定生产关系&#xff0c;生产关系对生产力具有 反作用 *其中的”反作用”指的是…

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接

《TCP/IP网络编程》学习笔记 | Chapter 7&#xff1a;优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7&#xff1a;优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭&#xff1f;基于半关闭…

python | 包

1. 在python中什么是包&#xff1f; ​ 包是一种组织代码的方式&#xff0c;如下图所示红色部分目录mypackage就称为一个包&#xff0c;它之所以称为一个包完全是因为它里面有蓝色方框里的文件__init__.py。 ​ 这个目录被定义为一个包之后&#xff0c;我们就可以通过import来…

Qt信号和槽-->day04

Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

腾讯首个3D生成大模型Hunyuan3D-1.0分享

Hunyuan3D-1.0是腾讯混元团队开发的首个同时支持文字、图像转3D的大模型&#xff0c;可以基于文本描述或单张图像生成3D模型。 Hunyuan3D-1.0采用了多视图生成和多视图重建两阶段的方法&#xff0c;能够从不同视角捕捉对象的纹理和几何信息。 在多视图生成阶段&#xff0c;Hu…

【JavaEE初阶 — 多线程】内存可见性问题 volatile

1. 内存可见性问题 内存可见性的概念 什么是内存可见性问题呢&#xff1f; 当一个线程对共享变量进行了修改&#xff0c;那么另外的线程都是立即可以看到修改后的最新值。在Java中&#xff0c;可以借助 synchronized、volatile 以及各种Lock 实现可见性。如果我们将变量声…

排序算法.

排序算法是最常用的一种算法.它解决的主要问题是在一定的时间复杂度和空间复杂度的条件下,对n个数按照一定的顺序进行排序.排序算法主要分为四大类,即插入类,交换类,选择类和归并类,不同的排序算法的时间复杂程度和空间复杂程度差别很大. 排序算法主要有以下几种: 1.插入类排…

iOS18.1通話錄音實測 錄音夠清晰 文字轉錄廣東話用唔到?

iOS 18.1功能實測&#xff5c;期待已久的通話錄音功能終在iOS18.1推出&#xff0c;讓用家可以在通話過程中輕鬆錄音&#xff0c;並附上逐字稿功能&#xff0c;為使用者提供更靈活的通話記錄方式。記者實測通話錄音功能&#xff0c;看看錄音清晰度、方便性、逐字轉錄的表現。 打…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障&#xff0c;说是测试环境的附件上传功能报了 403 的错误&#xff0c;错误信息&#xff1a;403 Request Entity Too Lager。我尝试复现问题&#xff0c;发现传个几兆的文件都费劲啊&#xff0c;一传一个失败。不用说&#xff0c;项目用到 ng 代理&#x…

【C++】新手入门指南

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

ElasticSearch备考 -- Cross cluster replication(CCR)

一、题目 操作在cluster1&#xff08;local&#xff09;中操作索引task&#xff0c;复制到cluster2&#xff08;remote&#xff09;中 二、思考 CCR 我们可以对标MySQL 理解为为主从&#xff0c;后者备份。主节点负责写入数据&#xff0c;从/备节点负责同步时主节点的数据。 …