2016-07-11 98 views
1

我正尝试使用nodejs和postgres构建多租户(/软件作为服务),将其作为ORM续集。由于安全原因,我决定为每个客户端使用单独的数据库,而不是单个数据库,而所有表都具有额外的列。我达到了结果,但性能并不好,因为我必须根据每个数据库的初始化模型(几乎每个请求)。有没有更好的方法来做到这一点?我在续集中错过了什么吗?使用nodejs的多租户(SAAS)sequelize

+0

与单个数据库使用池(Postgres的),你将有更好的可扩展性和更少的头痛 – Sushant

+0

也许发布一些代码? FWIW,你只需要初始化你的模型一次(你肯定不需要在每个请求中重新定义它们)。如果您愿意,您可以保留单独的数据库 - 只需使用相关连接详细信息为每个数据库创建一个sequelize实例,并在应用程序启动时将模型定义传递给每个数据库。 –

回答

1

我更喜欢Postgres中的多租户模式方法。我在安全方面没有权威,但它应该比基于表格的多租户更好。灾难恢复应该比基于表格的MT稍微容易一些,但仍然比单独的数据库差。

我设法使用ES6代理在Sequilize中实现这一点。这使你的节点版本硬需求量的,但如果你愿意使用至少v6.9.2,你可以给我的lib一试:

https://www.npmjs.com/package/sequelize-multi-tenant-enhancer

1

快速实施我上面的评论。

app.js:

const Sequelize = require('sequelize'); 

const connections = { 
    client1: new Sequelize('postgres://user:[email protected]:5432/client1'), 
    client2: new Sequelize('postgres://user:[email protected]:5432/client2'), 
    client3: new Sequelize('postgres://user:[email protected]: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 
}; 

显然无论服务器框架,你使用你需要检测(从URL我想象)的客户端连接用于给定的请求。

或者,考虑编写一个单连接的应用程序并部署它的多个实例(我目前正在这样做)。如果你设置在不同的数据库上,可能会是一个更简单的选择。