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

news2024/11/24 0:06:23

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/bash

DB_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.coloradmin.cn/o/2238403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小菜家教平台(四):基于SpringBoot+Vue打造一站式学习管理系统

前言 昨天配置完了过滤器&#xff0c;权限检验&#xff0c;基本的SpringSecurity功能已经配置的差不多了&#xff0c;今天继续开发&#xff0c;明天可能会暂停一天整理一下需求&#xff0c;然后就进行CRUD了。 今日进度 补充SpringSecurity异常处理和全局异常处理器 详细操作…

零基础Java第十五期:抽象类接口(一)

目录 一、抽象类 1.1. 抽象的概念 1.2. 抽象类语法 1.3. 抽象类的特性 1.4. 图形类例子 二、 接口 2.1. 接口的概念 2.2. 语法规则 2.3. 接口的特性 2.4. 接口的使用 2.5. 实现多个接口 2.6. 工作当中常用的接口 一、抽象类 1.1. 抽象的概念 如果 一个类中没…

13.UE5流星火雨,引导施法技能制作

2-15 流星火雨&#xff0c;引导施法技能制作、随机数_哔哩哔哩_bilibili 目录 1.为流星火雨添加按键映射 2.创建流星火雨的动画蒙太奇 3.实现播放动画蒙太奇的逻辑 ​编辑 4.定义发射一波流星火雨的发射物 5.使用动画通知释放流星火雨 1.为流星火雨添加按键映射 创建名为流…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

【安装配置教程】二、VMware安装并配置ubuntu22.04

一、准备&#xff1a; 虚拟机安装ubuntu&#xff0c;首先要先找到一个镜像&#xff0c;可以去ubuntu官方下载一个&#xff0c;地址&#xff1a;下载Ubuntu桌面系统 | Ubuntu&#xff0c;下载好iso的镜像文件后保存好&#xff0c;接下来打开VMware。 二、安装&#xff…

Latex中给公式加边框

1、这里使用的不是 amsmath 的 \boxed 命令, 而是 empheq 的 empheq 环境以及 xcolor 的 \fcolorbox 命令, 下面是代码, 可以分别阅读这两个手册来获取更多的信息 \documentclass{article} \usepackage{xcolor} \usepackage{empheq} \usepackage{amsmath} \begin{document}\be…

Android Parcelable和Serializable的区别与联系

在Android开发中&#xff0c;Parcelable和Serializable是两种用来在组件之间传递数据的序列化机制。它们有不同的使用场景和性能特点。 以下是它们之间的关系和区别&#xff1a; 1. 什么是 Parcelable Parcelable 是 Android 特有的接口&#xff0c;用于高效地在进程间传递数…

Android 实现柱形图

在 Android 中实现柱状图&#xff0c;可以使用流行的图表库 MPAndroidChart&#xff0c;它支持多种类型的图表&#xff0c;包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤&#xff0c;具体分为以下几个部分&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在 …

通过交互式网页学习相机成像原理

​ 入门摄影这门艺术&#xff0c;你是否有以下这些问题&#xff1f; 焦距、光圈、CMOS是什么&#xff1f;为什么光圈越大&#xff0c;背景虚化效果越好&#xff1f;什么是过曝&#xff1f;… 今天我将分享一个简单的、可交互的相机成像模型&#xff0c;可供大家以可视化的方式…

web——sqliabs靶场——第一关

今天开始搞这个靶场&#xff0c;从小白开始一点点学习,加油&#xff01;&#xff01;&#xff01;&#xff01; 1.搭建靶场 注意点&#xff1a;1.php的版本问题&#xff0c;要用老版本 2.小p要先改数据库的密码&#xff0c;否则一直显示链接不上数据库 2.第一道题&#xff0…

自监督学习:机器学习的未来新方向

引言 自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;是近年来机器学习领域的一个重要发展方向&#xff0c;迅速成为许多研究和应用的热点。与传统的监督学习不同&#xff0c;自监督学习利用未标注数据&#xff0c;通过设计自我生成标签的任务&#xff0c;帮…

探索 HTML 和 CSS 实现的 3D 开关按钮

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个3D风格的开关按钮&#xff08;通常用于控制某些设置的开启或关闭&#xff09; HTML <label class"switch"><input type"checkbox" checked"checked"><div cl…

车载诊断架构---NRC 78和NRC 21那些你不知道的事情!

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【计算机基础——数据结构——红黑树】

1. 红黑树&#xff08;RBTree&#xff09; 为什么HashMap不直接使用AVL树&#xff0c;而是选择了红黑树呢&#xff1f; 由于AVL树必须保证左右子树平衡&#xff0c;Max(最大树高-最小树高) < 1&#xff0c;所以在插入的时候很容易出现不平衡的情况&#xff0c;一旦这样&…

linux物理内存管理:node,zone,page

一、总览 对于物理内存内存&#xff0c;linux对内存的组织逻辑从上到下依次是&#xff1a;node&#xff0c;zone&#xff0c;page&#xff0c;这些page是根据buddy分配算法组织的&#xff0c;看下面两张图&#xff1a; 上面的概念做下简单的介绍&#xff1a; Node&#xff1a…

CKA认证 | 使用kubeadm部署K8s集群(v1.26)

一、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; ① kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 ② 二进制包 从github下…

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17&#xff08;Java Development Kit 17&#xff09;是Java平台的一个重要版本&#xff0c;它带来了许多新特性和改进&#xff0c;进一步提升了…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …