我正在尝试使用nodejs和postgres构建多租户(/软件即服务),将sequelize作为ORM。由于安全原因,我决定为每个客户端使用单独的DB,而不是使用具有额外列的所有表的单个DB。我实现了结果,但性能并不好,因为我必须根据续集(几乎每个请求)初始化每个DB的模型。有没有更好的方法来做到这一点?我在续集中遗漏了什么吗?
答案 0 :(得分:2)
快速执行上述评论。
app.js:
const Sequelize = require('sequelize');
const connections = {
client1: new Sequelize('postgres://user:pass@example.com:5432/client1'),
client2: new Sequelize('postgres://user:pass@example.com:5432/client2'),
client3: new Sequelize('postgres://user:pass@example.com:5432/client3'),
};
const User = require('./models/user');
const Post = require('./models/post');
const Comment = require('./models/comment');
Object.keys(connections).forEach(connection => {
connection.define('User', userColumns);
connection.define('Post', postColumns);
connection.define('Comment', commentColumns);
});
模型/ user.js的:
module.exports = {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: Sequelize.STRING,
email: Sequelize.STRING
// etc, etc
};
显然,无论您使用哪种服务器框架,您都需要检测(从我想象的网址)用于给定请求的客户端连接。
或者,考虑编写单连接应用程序并部署它的多个实例(我目前正在这样做)。如果你设置在不同的数据库上,可能是一个更简单的选择。
答案 1 :(得分:2)
我更喜欢Postgres中的多租户模式方法。我对安全没有权威,但它应该比基于表的多租户更好。灾难恢复也应该比基于表格的MT稍微容易一些,但仍然比使用单独的数据库更糟糕。
我设法使用ES6 Proxies在Sequilize中实现了这一点。这对你的Node版本提出了一个严格的要求,但如果你愿意至少使用v6.9.2,你可以试试我的lib:
https://www.npmjs.com/package/sequelize-multi-tenant-enhancer