2

今後のアプリケーションで Devise と Apartment を使用して、アカウントを作成する各組織のサブドメインを作成することを計画しています。アプリケーションを Heroku でホストしたいのですが、次の引用に出くわしました。

データベースで複数のスキーマを使用する最も一般的な使用例は、各顧客が独自のスキーマを持つサービスとしてのソフトウェア アプリケーションを構築することです。この手法は説得力があるように見えますが、運用上の問題が多数発生しているため、使用しないことを強くお勧めします。たとえば、スキーマの数が中程度 (> 50) であっても、Heroku のデータベース スナップショット ツールである PG バックアップのパフォーマンスに深刻な影響を与える可能性があります。

多くのユーザーが自分の一部であるサブドメインにログインできる Rails 4 で basecamp スタイルのサブドメインをホストするために、Heroku でうまく機能するテクニックはどれですか?

Heroku が機能しない場合、これをうまく機能させる PaaS オプションは他にあるでしょうか?

4

1 に答える 1

4

ドメイン

まず、サブドメインに独自のカスタム ドメインを使用していることを確認する必要があります。

Heroku の標準xxx.herokuapp.comでは、その上に別のサブドメインを処理することはできません。したがって、基本的には最初からカスタム ドメインを使用する必要があります。

詳細については、このドキュメントを参照してください。


マルチテナンシー

schemas私は PGSQL の経験はありませんがマルチテナンシー全体の経験はあります。

ここには多くの優れたリソースがあります。

本質的には、表示/対話するのはテナントのみになるようにデータのスコープmulti-tenancyを設定する方法にすぎません。DB の意味では、これを実現する 2 つの方法は、異なる DB を使用する (MYSQL の場合のように) か、スキーマを使用する (PGSQL のように) ことです。

問題を直接解決することはできませんが、いくつかのアイデアを提供できます。


モデル

特に MYSQL などでマルチテナンシーを実現する 1 つの方法は、モデルを使用して実現することです。

アクティブなレコードを持つレールで 2 つの異なるデータベースを操作するにはどうすればよいですか?

#lib/admin.rb
class Admin < ActiveRecord::Base
  self.abstract_class = true 
  establish_connection "#{Rails.env}_admin"
end

#app/models/option.rb
Class Option < Admin
  # do stuff
end

これは私たちにとって非常にうまく機能しますが、範囲指定されたアカウントではまだ機能していません. か何かにを設定することを考えていましたが@@class_variableAccount現在は取り組んでいません。

これはMYSQLを利用したデータベースでは非常にうまく機能しますが、アカウントごとにデータベースを作成する必要があり、PGSQLでは機能しません(私が知る限り)


PGSQL スキーマ

すべてのデータがまだ 1 つのデータベースに保存されているため、これは一種のチート方法だと思います。基本的には、さまざまな種類のデータを対象としているだけです。

ここでの問題は、真のマルチ テナンシーは、ユーザーのデータを完全に分離する必要があるため、必要に応じてアプリから完全に切り離すことができるということです。セキュリティとアクセスの観点から、これは最も柔軟でモジュラーな方法です。

Heroku の問題は、1 つのデータベースしか使用できないことです (AWS データベース インスタンスへのアクセス権を全員に付与します)。つまり、50 以上の無料データベースを作成することはできません (うまく機能しません)。

もちろん、独自のスタックを使用して必要なデータベースを作成することもできますが、PGSQL に関してはschemas、データ用に を作成し、次のようなものを使用Apartmentしてそれを実現するだけです。

新しいテナントを作成するとき、PostgreSQL は他のデータベースとは少し異なる動作をします。PostgreSQL を使用している場合、Apartment はデフォルトで新しいスキーマを設定し、そこに移行します。これにより、パフォーマンスが向上し、完全な新しいデータベースを作成できない Heroku などのシステムで Apartment を使用できるようになります。

于 2014-07-13T08:35:47.377 に答える