2016-04-08 16 views
0

基本的に私はUserエンティティを持ち、そのユーザーにはフォロワーがあります。これをモデル化する方法について考えられる1つの可能な方法は、Key型の複数値のプロパティを持つことです。このプロパティは、フォロワーのキーをリストに格納します。このようエンティティにキーのリストを関連付ける方法

..

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

Entity userEntity; 

Key k = entity.getKey(); 

Entity user = new Entity("User"); 
List<Key> followers = new ArrayList<Key>(); 
followers.add(k); 
user.setProperty("FollowersList", followers); 
datastore.put(user); 

私は、App Engineは、私は絶対にしたくないものです複数の値を持つプロパティで5000個のエントリにあなたを制限することをどこかで読みました。

私は一般的にNoSQLデータベースを初めて使用しています。私はこれをどのようにするべきですか?

答えて

2

リストがインデックスに登録されているか頻繁に変更されている場合は、値のリストを格納することはお勧めできません。

すべての変更によってエンティティの再保存がトリガーされ、不要な書き込みコストが発生します。今、Googleは価格設定モデルを変更したため、これまでと同じくらい高価ではありませんが、まだ留意しておくべきことがあります。

また、ユーザーエンティティ自体も大きくなります。ほとんどの場合、フォロワー5,000人のリストは必要ありませんが、このエンティティが必要なたびにすべてのデータを移動します。

考えられる解決策の1つは、「フォロワー」と呼ばれるエンティティの種類を作成することです。これらの種類のエンティティにはプロパティはありません(ただし、各関係について追加のデータを保存する必要がない場合)。これらのエンティティはユーザーエンティティの子エンティティになり、IDはフォロワーのIDと一致します。

Query q = new Query("Follower").setAncestor(userKey).setKeysOnly(); 

は「フォロワー」を削除することを忘れないでください:

Key userKey = KeyFactory.createKey("User", userID); 
Entity followerEntity = new Entity("Follower", followerUserID, userKey); 
datastore.put(followerEntity); 

今、あなたはすぐに(可能な最も安いと最速オプション)祖先クエリキーのみを実行して、すべてのフォロワーのリストを取得することができますあなたが親である "User"エンティティを削除した場合、自動的には起こらず、単に孤立したままになります。

+0

非常にいいです、ありがとう – kidustiliksew

1

IMHOユーザーが代わりに選択するリーダーにキーを格納する方が良いでしょう(スケーラビリティの見込みから)。なら、私は...それは5000人のリーダー:)

あなたが指導者のリストのリーダーの鍵を持っているユーザーのためのクエリを経由してリーダーのフォロワーを獲得したいをフォローするユーザーのために、むしろそうだ

を思うだろう(Andrei勧告のように)キーのリストを保存したくない場合は、関係を保存するために別のエンティティタイプを持つことができます。leader_key, follower_keyペアです。

この場合、リーダーのキーがleader_keyであるリレーションシップに関するクエリを使用して、リーダーのフォロワーのキーのリストを取得し、クエリ結果の各リレーションシップから1つのフォロワーキーを抽出します(follower_keyプロパティ)。

関連する問題