私は新しいWebアプリの計画段階にあり、マルチテナンシーモデルに強く傾いています。このアプリには、ユーザーがファイルをアップロード(および操作)できるファイルストレージ機能があります。
ただし、ユーザーがこれらのファイルを共有できるようにしたいと思います。これは通常、マルチテナントモデルでどのように実現されますか?
例は、googledocsのようなものです。各ユーザーには独自のファイルがあります。これらのファイルを使用してコレクションを編集、タグ付け、構築できます。次に、ドキュメントやコレクションを他の人と共有して共同作業を行うことができます。
すべてのユーザーが独自のデータベースとテーブルを持っている場合、ファイルと関連するメタデータの重複を最小限に抑えながら、この種の共有を可能にするためにどのような戦略を使用しますか?
単一のデータベース、単一のファイルストアが必要です。
マルチテナンシー用に設計されていないアプリがあり、単一のデータベースを使用するようにアプリを適応させることが不可能な場合にのみ、複数のデータベースを使用できます。
論理エンティティが複数のデータベースに散在している場合、データベースは整合性を強制できず、それによって引き起こされる問題に対処する必要があります。これは、発生する多くの問題の1つにすぎません。
マルチテナントアプリ用に単一のデータベースを用意することは、アプリを最初から設計する場合には問題になりません。異なるテナントを実際に分離するには、間違いなくより多くの作業が必要になります[つまり、すべてのクエリにはcustomer = xxx条件が必要であり、それを忘れることはできません]が、複数のデータベースを使用するよりも問題が少ないことは確かです。
データベースが1つになると、スキーマの設計とn-mの関係の問題になります(つまり、1つのドキュメントがn人のユーザーに属し、1人のユーザーがm個のドキュメントを持つことができます)。
正規化されたスキーマがある場合、定義上、データの重複はありません:)
その結果、ファイルが重複したり、ロックメカニズムや競合解決に対処したりすることは避けたいと思うでしょう。他の当事者が編集するファイルを複製するのではなく、ファイルの編集権限を共有するモデルに従うことができます。
複数のユーザーが同じドキュメントを同時に編集できるようにすることで(アプリにそのような機能がある場合)、編集権限の共有を強化でき、ユーザーがお互いの変更を上書きしないようにすることができます。もちろん保存の履歴を保持することで上書きの問題を回避できますが、私の経験では、UIでその事実が目立たない限り、ユーザーは作業中またはアップロード中のドキュメントが更新されたことに気付かない場合があります。