0

私はファイルシステムを実装しています。各フォルダーにはACLがあります。これは基本的に、フォルダーの読み取り/書き込みが許可されているユーザーIDのリストにすぎません。ACLを上位レベルのフォルダーから下位レベルのフォルダーにコピーしてこれを実装したい-継承されたアクセス許可が必要ですが、読み取り時にそれらを検索する必要はありません。フォルダー間の関係を、サブフォルダー内のスーパーフォルダーへの参照として保存します。

したがって、次の操作の順序は、HRDで解決するのは困難です。

  1. フォルダーBを、既に存在するフォルダーAのサブフォルダーとしてデータストアに配置します。
  2. Aの権限を変更します。

問題は、手順2でAの権限を変更するときに、Aのすべての子を検索して、それらにも権限の変更を適用できるようにする必要があることです。残念ながら、これはクエリを意味するため、Bがそのクエリに表示されない場合があります。Bは許可の変更を見逃す可能性があります!

これまでに考えた唯一の解決策は、「サブフォルダー」の関係を双方向に格納することです。Aにはすべてのサブフォルダーへの参照があり、Bにはスーパーフォルダーへの参照があります。次に、グループ間トランザクションを使用してAとBを同時に更新でき、手順2でクエリを実行する必要はありません。直接取得を簡単にキャッシュできるため、インデックススキャンが不要なため、とにかくこれが適している可能性があります。

他に何かアイデアはありますか?このソリューションの冗長ストレージのニーズやXGトランザクションの必要性は好きではありません。

4

1 に答える 1

1

データストア内の唯一のトランザクションで強一貫性のあるユニットは、エンティティグループです。したがって、Bの読者にトランザクション保証付きのAの変更について知ってもらいたい場合は、AとBが同じグループに属している必要があります。そのアプローチの欠点(競合、グループごとの書き込み速度)を回避しようとしているように思われるため、許容できるトレードオフを見つける必要があります。

たとえば、AエンティティとBエンティティが同じグループに含まれることは許容されないが、この種のメタデータのインスタンスが同じグループに存在し(ほとんど更新されない場合など)、元のエンティティ(エンティティのXG更新とこのメタデータに問題がない場合)は、データを分離して類似した状態に保つことができます。

Bのすべての階層の祖先をすばやく識別できるデータ構造がある場合は、Bとその祖先の集約メタデータプロパティを決定するときに、すべての祖先の非同期読み取りを実行できます。これは、エンティティとともにフルパスを保存することで管理できます。これには、より多くのデータストア操作(パス長のオーダー)が含まれますが、要求時間はそれほど多くなく、このデータを正規化しておくことができます。

于 2012-01-28T23:07:43.050 に答える