如何在MySQL中创建类似Mongoose的含嵌套评论结构的表Schema
MySQL实现Mongoose嵌套评论结构的表设计方案
你提到的Mongoose结构对应MongoDB的文档嵌套存储逻辑,代码如下:
mongoose.Schema({ title: { type: String }, subtitle: { type: String }, comments: [{ commentSubject: { type: String }, commentBody: { type: String } }] })
要在MySQL中实现完全一致的功能,采用主内容表+评论从表的一对多关联方案即可,具体建表和使用方式如下:
1. 建表语句
主内容表(兼容文章、商品等场景,表名可自行修改)
CREATE TABLE items ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键唯一ID', title VARCHAR(255) NOT NULL COMMENT '内容标题', subtitle VARCHAR(500) COMMENT '内容副标题', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '内容创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
评论从表
通过item_id字段关联主内容表的主键,实现一条主内容对应多条评论的关联关系:
CREATE TABLE comments ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '评论唯一ID', item_id INT UNSIGNED NOT NULL COMMENT '关联的主内容ID', comment_subject VARCHAR(255) NOT NULL COMMENT '评论主题', comment_body TEXT NOT NULL COMMENT '评论正文', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '评论发布时间', -- 外键约束,主内容删除时对应评论自动删除,不需要可去掉 FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. Node.js中查询示例
查询时先查主内容,再关联查询对应评论,拼接后即可得到和Mongoose查询完全一致的结构,以下是基于mysql2库的原生查询示例:
const mysql = require('mysql2/promise'); // 根据ID查询单条主内容及对应全部评论 async function getItemWithAllComments(itemId) { const conn = await mysql.createConnection({ host: '127.0.0.1', user: '你的数据库用户名', password: '你的数据库密码', database: '你的数据库名称' }); // 查询主内容 const [itemRes] = await conn.execute('SELECT * FROM items WHERE id = ?', [itemId]); if (itemRes.length === 0) { await conn.end(); return null; } // 查询对应评论,按发布时间倒序排列 const [commentRes] = await conn.execute('SELECT * FROM comments WHERE item_id = ? ORDER BY created_at DESC', [itemId]); // 拼接结构 const result = { ...itemRes[0], comments: commentRes }; await conn.end(); return result; }
如果使用Sequelize、TypeORM等ORM框架,直接配置一对多关联关系,查询时通过关联查询语法可直接返回拼接好的结构,无需手动查两次。
内容的提问来源于stack exchange,提问作者hesam botorabi
相关产品推荐
相关产品推荐

