2016-07-11 15 views
1

nodejsとpostgresを使用してマルチテナント(/ソフトウェア)を構築しようとしていますが、ORMとして続行しています。私はセキュリティの理由から、余分な列を持つすべてのテーブルを持つ単一のDBを持つのではなく、クライアントごとに個別のDBを使用することに決めました。私は結果を達成しましたが、パフォーマンスは良くありませんでした。なぜなら、各DBのモデルを後継に応じて(各要求ごとに)初期化する必要があったからです。これを行うための良い方法はありますか?私は後遺症で何かを見逃していますか?nodejsを使用するマルチテナント(SAAS)

+0

使用プールはるかに良いスケーラビリティと頭痛の少ない – Sushant

+0

多分いくつかのコードを投稿しますか? FWIWでは、モデルを一度しか初期化する必要はありません(要求ごとに再定義する必要はありません)。必要に応じて別のDBを保持することができます。関連する接続の詳細を使用して各データベースの後継インスタンスを作成し、アプリケーションの起動時にモデル定義を渡すだけです。 –

答えて

1

私は、Postgresのマルチテナントに対するスキーマアプローチを好んでいます。私はセキュリティに関する権限はありませんが、テーブルベースのマルチテナントよりも優れているはずです。ディザスタリカバリは、テーブルベースのMTよりもわずかに簡単ですが、別のDBよりもさらに悪いです。

私はES6プロキシを使用してこれをSequilizeで実装することができました。これはあなたのノードのバージョンにハードのrequirmentを置きますが、あなたは、少なくともv6.9.2を使用するために喜んでいる場合は、私のlibを試してみることができます:

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

あなたが持っているでしょう単一のデータベース(Postgresの)と
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から)を検出する必要があります使用するクライアント接続特定のリクエストに使用する

また、単一接続のアプリケーションを作成し、複数のインスタンスを展開することを検討してください(現在はこれをやっています)。個別のDBに設定すると、より簡単な選択肢になるかもしれません。

関連する問題