20

マルチテナント データベース モデルについて私が見たすべてのチュートリアルでは、すべてのテーブルに TenantID を配置するように指示されています。

zoos
-------
id
zoo_name
tenant_id

animals
-------
id
zoo_id
animal_name
tenant_id

しかし、これは私には冗長に思えます。tenant_idテーブルだけに列を追加して、 と の間の外部キー関係を活用してみませんzoosか?zoosanimals

tenant_id結合が狂ってしまわないようにするためだけに、すべてのテーブルに追加しますか? バグに対するセーフガードですか?パフォーマンスの考慮事項ですか?

4

6 に答える 6

15

重要な設計上の考慮事項の 1 つがセキュリティである場合 (具体的には、あるクライアントが別のクライアントのデータにアクセスするときに、どのようにアクセスできないかなど)、このセキュリティの実装方法によっては、すべてのテーブルに該当する列を貼り付けることが必要になる場合があります。ここで説明するそのような戦術の 1 つは、すべてのテーブルでビューを構築する必要があります。各テーブルに tenantId 列が含まれていると仮定すると、適切に構成されていれば、各ビューに「WHERE tenantId = SUSER_SID()」句を含めることができます (もちろん、クライアントがビューにのみアクセスできるようにデータベースを構成します)。

もう 1 つの要因 (私の現在の仕事と同様) は、ウェアハウス データ (ETL) の読み込みです。テーブルは tenantId でパーティション分割され (テーブルのパーティション分割を使用しますが、パーティション分割されたビューも機能します)、他のクライアントに深刻な影響を与えることなく、クライアントのデータを簡単にロードまたはアンロードできます。

しかし、いつものように、多くの「場合による」関係があります。明確な現在の必要性がなく、将来必要なる可能性が非常に低い場合は、その列を正規化します。概念的または論理的なデータベース設計よりも、物理的な実装の工夫であることを認識してください。

于 2009-11-16T15:36:41.157 に答える
10

利便性とパフォーマンスのためにそこにあります-正規化に関しては、あなたは絶対に正しいです。問題は、いくつかのデータ (動物園 -> 動物 -> 食品 -> サプライヤーなど) を取得するために、概念的には非常に単純なクエリに対して、恐ろしく複雑な結合が必要になることです。

したがって現実の世界では、妥協しなければなりません。

この記事Maybe Normalizing Isn't Normalとその結論を参照してください。

古い格言にあるように、痛むまで正常化し、機能するまで非正規化する

テーマの探求を開始する場所として

于 2009-11-16T15:14:08.300 に答える
9

階層の最上位 (動物園レベル) にテナント ID がある場合、考慮すべきいくつかの問題があります。

  1. 階層の最上位は変更できません。たとえば、動物園レベルより上のツリーにノードを追加する必要がある場合 (たとえば、地域 -> 動物園 -> 動物)、毎回再編成が強制されます。
  2. 特定のクエリでは、階層の最上位から開始する必要があります。つまり、利用可能なすべての動物のリストを教えてください。ツリーの最上位から開始する必要があります。
  3. スキーマを使用しないのはなぜですか? 各テナントは、独自のスキーマ内で分離されています。これにより、データセットもうまく分離されます。
于 2009-11-16T21:34:59.800 に答える
6

最初に頭に浮かぶのは、animals > zoos > tenants単純に検索するよりも検索する方が遅いということですanimals > tenantsそして、これはおそらく頻繁に行うルックアップです(たとえば、「動物園に関係なく、特定のテナントのすべての動物を取得する」)。

小規模から中規模のアプリケーションの場合は、より正規化された構造を使用できますが、効率を高めるために、余分なデータを使用する必要があります (一般的に言えば、マルチテナンシー アプリケーションは小さくありません)。「非同期」にならないことを確認してください。これは、冗長データを持つことに伴うリスクです。

最後の段落に答えるには、その理由は純粋で単純なパフォーマンスです。結合は悪いことではありません。データを 3 つではなく 1 つの場所に保持するのに役立ちます。バグを防ぐためではありません。より多くのテーブルにフィールドを追加するtenant_idと、バグのリスクが高まります (ただし、決して変更されない ID の場合、それほど問題にはなりません)。

于 2009-11-16T15:13:20.207 に答える
0

ボブは動物園 No1 でキリンを飼っているかもしれませんが、ジョーは同じ動物園でライオンを飼っているかもしれません。彼らはお互いのデータを見るべきではありません。

于 2009-11-16T16:53:43.827 に答える
-1

N1 の理由はセキュリティのためです。

マルチテナント アプリケーションでは、セキュリティを強力なコンセプトにする必要があります。

動物を変更する機能をユーザーに付与するとします。現在のテナントの動物園を表示する選択を含むフォームを作成します。ユーザーがフォームをハッキングして、別のテナントの動物園 ID を渡すとどうなりますか?

動物は別のテナントの別の動物園に移動します!!

これは、マルチテナント アプリでは非常に苦痛です。

于 2010-11-12T09:57:38.820 に答える