首页 > 解决方案 > 以编程方式将表添加到节点并使用 Sequelize 表达应用程序的最佳方法

问题描述

我已经对此进行了一些研究,但似乎找不到正确的答案。我正在使用 node、Express 和 Sequelize 构建一个个人 bugetting 应用程序。为了给用户尽可能多的灵活性,我希望应用程序为用户预算动态生成表格。用户可以根据需要创建任意数量的预算,最多可以添加 10 或 12 列。我正在考虑使用 Sequelize 原始查询,但动态生成查询很麻烦,我不确定这是一个很好的做法。我应该使用迁移和 umzug 库吗?问题是我对服务器端开发和数据库还很陌生,所以我只需要一些指导。这是我当前的原始查询。我还没有测试它,因为我一直在构建应用程序的其他核心组件。

/* Handle dynamic budget table creation and queries */

const Db = require('./lib/Db.js');

module.exports = class Budget extends Db
{
    /**
     * Create a new budget table
     * @param {String} name - budget name
     * @param {Object} columns - object of column names and their values
     * @param {String} user - user name
     * @param {Number} userId - user id
     */
    async createNewBudget(name, columns, user, userId)
    {
        let query = `CREATE TABLE ${name}_budget (`;
        for (let key in columns) {
            query += `${key} NUMERIC, `;
        }
        query += ")";
        await this.db.sequelize.query(query);
        let insert = `INSERT INTO ${name}_budget(`;
        for (let key in columns) {
            insert += `${key}, `;
        }
        insert += ") VALUES (";
        for (let key in columns) {
            insert += `${columns[key]}, `;
        }
        insert += ")";
        await this.db.sequelize.query(insert);
    }
}

该类Db是一个使sequelize实例可用的简单类:

/* Base class for all classes interacting with the database via raw queries */

module.exports = class Db 
{
    constructor()
    {
        this.db = require('../models/index.js');
    }
}

我的lib目录中有这些文件。我只是觉得我处理这件事的方式不太好。任何有用的建议将不胜感激。

标签: node.jsexpresssequelize.js

解决方案


我有点好奇为什么您希望用户能够创建新表...我认为您应该使用迁移来设置原始数据库,并仔细考虑到用户拥有 id 的程度,然后您有一个 user_budget 表,它是多对多连接,之后预算一系列选项,数据库设计确实需要一些计划,但它不是火箭科学,如果/当你没有做对时,改变并不难... postgres、mySQL 等非常擅长有效地处理大量行和许多关系,但我认为您可能会创建一堆技术债务和不可扩展的解决方案来为新预算创建新表,这对于 RDBMS 来说是不必要的. 您正在为设计良好的数据库中可能只是几行的东西创建一个新表


推荐阅读