node.js - 以编程方式将表添加到节点并使用 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
目录中有这些文件。我只是觉得我处理这件事的方式不太好。任何有用的建议将不胜感激。
解决方案
我有点好奇为什么您希望用户能够创建新表...我认为您应该使用迁移来设置原始数据库,并仔细考虑到用户拥有 id 的程度,然后您有一个 user_budget 表,它是多对多连接,之后预算一系列选项,数据库设计确实需要一些计划,但它不是火箭科学,如果/当你没有做对时,改变并不难... postgres、mySQL 等非常擅长有效地处理大量行和许多关系,但我认为您可能会创建一堆技术债务和不可扩展的解决方案来为新预算创建新表,这对于 RDBMS 来说是不必要的. 您正在为设计良好的数据库中可能只是几行的东西创建一个新表
推荐阅读
- java - Spring Boot V 2.4.0 使用 DaoAuthenticationProvider SHA-512
- javascript - 我收到 TypeError:注册新用户时无法读取未定义的属性“getPosts”
- google-sheets - 如何按标题查找列?
- html - 如何在引导代码中更改元素的宽度
- python - 每 20 个字符后添加换行符并将结果另存为新字符串
- reactjs - 需要帮助来修改我的受保护路线的反应代码
- c# - 为什么我的 serial.write 发送数据两次
- r - 加入并匹配 R 中的两个数据框
- python - 在 python 运行时创建变量
- javascript - Svelte“未捕获的 TypeError:无法在 'HTMLProgressElement' 上设置 'value' 属性”