论坛帖子回复某个人说的话而不是发帖者,这个数据库Nodejs要怎么设计呢

论坛帖子回复某个人说的话而不是发帖者,这个数据库Nodejs要怎么设计呢

论坛帖子回复某个人说的话,而不是发帖者,这个数据库要怎么设计呢

5 回复

在设计一个论坛系统时,如果需要实现回复特定用户的功能(例如回复某个人说的话),我们需要确保数据模型能够支持这种复杂的交互。以下是一个基于Node.js的简单设计方案,包括数据库模型和示例代码。

数据库设计

  1. 帖子(Post)

    • postId (String): 帖子的唯一标识符。
    • title (String): 帖子标题。
    • content (String): 帖子内容。
    • authorId (String): 发布帖子的用户的ID。
    • createdAt (Date): 创建时间。
    • updatedAt (Date): 更新时间。
  2. 评论(Comment)

    • commentId (String): 评论的唯一标识符。
    • postId (String): 所属帖子的ID。
    • replyToUserId (String): 被回复用户的ID(可选)。
    • replyToCommentId (String): 被回复评论的ID(可选)。
    • content (String): 评论内容。
    • authorId (String): 发布评论的用户的ID。
    • createdAt (Date): 创建时间。
    • updatedAt (Date): 更新时间。

示例代码

使用MongoDB作为数据库

const mongoose = require('mongoose');

// 定义评论Schema
const commentSchema = new mongoose.Schema({
    postId: { type: String, required: true },
    replyToUserId: { type: String, default: null },
    replyToCommentId: { type: String, default: null },
    content: { type: String, required: true },
    authorId: { type: String, required: true },
    createdAt: { type: Date, default: Date.now },
    updatedAt: { type: Date, default: Date.now }
});

// 定义帖子Schema
const postSchema = new mongoose.Schema({
    title: { type: String, required: true },
    content: { type: String, required: true },
    authorId: { type: String, required: true },
    createdAt: { type: Date, default: Date.now },
    updatedAt: { type: Date, default: Date.now },
    comments: [commentSchema]
});

// 创建模型
const Post = mongoose.model('Post', postSchema);

module.exports = Post;

实现逻辑

  • 当用户回复某个评论时,需要指定replyToCommentId和/或replyToUserId
  • 在获取评论列表时,可以根据这些字段来展示回复关系。

示例API

app.post('/posts/:postId/comments', async (req, res) => {
    const { postId } = req.params;
    const { content, replyToUserId, replyToCommentId } = req.body;

    try {
        const newComment = new Comment({
            postId,
            replyToUserId,
            replyToCommentId,
            content,
            authorId: req.user.id // 假设req.user包含当前登录用户信息
        });

        await newComment.save();
        res.status(201).json(newComment);
    } catch (error) {
        res.status(400).json({ message: error.message });
    }
});

通过这种方式,我们可以灵活地处理复杂的关系,并在前端根据这些字段来构建评论树结构。


具体要看你的布局要求和使用的数据库,设计方案也很多,就那Cnodejs的回复布局来说:

可以维护两张表,一个是对帖子的评论,一个是对评论的回复,使用外键关;

也可以在同一张表中添加字段child判断该纪录是对帖子的回复还是对评论的回复;

如果用mongodb,类似{comments: []}这样做就可以,(当然可以更加优化);

如果允许回复 “针对某条评论的回复” 等更多层次的子回复,可以维护一个level字段,来标记缩进的级别……

如果你有点数据库基础的话,多试几次,就能摸索出来。如果不够熟练,就去查一下外键关联,很容易就想到解决方案了。或者你可以玩一玩 mongodb,更容易实现。自己摸索出接过来会更有趣,也会让你学到更多……

如果实在弄不出来,欢迎继续留言提问

能否给个该论坛回复的例子,谢谢

每个帖子都包含一个referrer字段,如果是新帖,为空,如果是回复某帖,就是要回复帖子的_id。 在浏览器显示页面的时候,再用js把这个树状结构重建起来再显示。数据库没有保持树状显示视图的义务。

在设计一个论坛系统时,如果需要支持对某个回复进行引用(即回复某个人说的话),而不是直接回复帖子的原始作者,我们需要考虑以下数据库模型设计。我们将使用关系型数据库作为示例,假设我们使用的是MySQL。

数据库设计

  1. 帖子表 (posts)

    • id (INT, 主键)
    • title (VARCHAR)
    • content (TEXT)
    • created_at (TIMESTAMP)
    • user_id (INT, 用户ID)
  2. 评论表 (comments)

    • id (INT, 主键)
    • post_id (INT, 外键,关联posts表的id)
    • parent_comment_id (INT, 可为空,用于表示这条评论是回复哪条评论)
    • reply_to_user_id (INT, 可为空,用于表示回复的是哪个用户的评论)
    • content (TEXT)
    • created_at (TIMESTAMP)
    • user_id (INT, 用户ID)

示例代码

以下是创建上述表结构的SQL语句:

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    user_id INT
);

CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT,
    parent_comment_id INT,
    reply_to_user_id INT,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    user_id INT,
    FOREIGN KEY (post_id) REFERENCES posts(id),
    FOREIGN KEY (parent_comment_id) REFERENCES comments(id)
);

Node.js 实现

在Node.js中,你可以使用Sequelize这样的ORM框架来简化数据库操作。以下是如何定义模型和查询的简单示例:

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

const Post = sequelize.define('Post', {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  title: {
    type: DataTypes.STRING,
    allowNull: false
  },
  content: {
    type: DataTypes.TEXT
  },
  created_at: {
    type: DataTypes.TIMESTAMP,
    defaultValue: DataTypes.NOW
  },
  user_id: {
    type: DataTypes.INTEGER
  }
}, {});

const Comment = sequelize.define('Comment', {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  post_id: {
    type: DataTypes.INTEGER
  },
  parent_comment_id: {
    type: DataTypes.INTEGER
  },
  reply_to_user_id: {
    type: DataTypes.INTEGER
  },
  content: {
    type: DataTypes.TEXT
  },
  created_at: {
    type: DataTypes.TIMESTAMP,
    defaultValue: DataTypes.NOW
  },
  user_id: {
    type: DataTypes.INTEGER
  }
}, {});

// 同步数据库
(async () => {
  await sequelize.sync();
})();

以上就是如何设计和实现一个可以支持回复特定用户评论的论坛系统的数据库模型和基本代码示例。

回到顶部