1

顧客データを保存するアプリを検討しています。CouchBaseでのバケットの動作方法を考えると、すべての顧客データは1つのバケットに含まれます。私には2つの選択肢があるようです。

  1. 所属する顧客を示すフィールドを各レコードに割り当てることにより、ビューにマルチテナンシーを実装します。

  2. 顧客IDであるすべてのキーに係数を設定して実装します。

ただし、ビューを使用するので、両方を実行したいと思います。ケース2の場合、インデックスを作成できるように(または、マップフェーズでキーの一部を引き出して顧客のインデックスを作成できるように)、レコードにデータを含める必要があります。オプション1では、データが必要です。これは、データを取得する際のチェックとしてキーの一部となり、間違った顧客データを送信しないようにします。

問題は、これは複数の顧客が対話するサービスであり、最初の顧客の要求に応じて、一方の顧客がデータを作成し、もう一方の顧客がそれを表示する場合があることです。しかし、控えめに言っても、それを表示することを許可されたすべての人をリストする各レコードにACLを配置することは問題があります。

この質問に答えるための一般的な方法論またはデザインパターンがあるに違いありません。ベストプラクティスへのいくつかの指針をいただければ幸いです。

また、インデックスが特定の関連データと顧客IDの両方でインデックスを作成している場合のパフォーマンスについても懸念しています...多数の異なる顧客は、おそらくインデックスの効率を大幅に低下させます。(しかし、そうではないかもしれません。)

4

1 に答える 1

1

これがあなたの質問に対する私の考えです:

【項目1、2について】-でも、ビューを使うので、本当に両方やりたいと思います。

これは私には意味がないようです。Couchbaseでは、マップフェーズにキーと値の両方のコンテンツを含めることができます。キーと値の両方にデータを格納することはほとんど意味がありません。1:1の複製が保証されているからです。保存するのが最も理にかなっている場所に保存してください。この場合、おそらく値です。

問題は、これは複数の顧客が対話するサービスであり、最初の顧客の要求に応じて、一方の顧客がデータを作成し、もう一方の顧客がそれを表示する場合があることです。しかし、控えめに言っても、それを表示することを許可されたすべての人をリストする各レコードにACLを配置することは問題があります。

私のサイトには、単一のデータベースに保存されているマルチテナントデータもあります。私の場合、オブジェクトの一意の識別子をキーとして使用します。デフォルトでは、顧客は自分に属するすべてのオブジェクトにアクセスできます(私はユーザーオブジェクトを持っており、ユーザーは顧客アカウントに関連付けられています)。ユーザーには追加の権限が割り当てられている場合もあります。これにより、別の顧客からの単一のオブジェクトをユーザーアカウントに追加して、オブジェクトを表示するためのアクセス権をユーザーに付与できます。

別の方法は「隠すことによるセキュリティ」であり、GUIDをランダムな識別子として使用して、顧客がGUIDを持っているオブジェクトを表示できるようにします。

ただし、オブジェクト自体にアクセス許可を保存しようとはしません。それはすぐに扱いにくくなります。特定のユースケースについて考え、ほとんどのケースでどのような単純なアプローチが機能するかを判断する必要があります。他の1〜2%のケースはサポートしません。

于 2013-03-15T20:00:00.533 に答える