1

私は客観とGoogleのデータストアをモデリングすることだし、私のデータストアの一部は、これらの3つの要素があります。客観POST/LIKE/USER関係

User post new Post which can be liked by many Users

ユーザーは多くのユーザーに好かできる新しいポストを投稿(典型的なソーシャルネットワーク)。

@Entity 
public class UserMW { 

    @Id 
    private Long id; 

    @Index 
    private String email; 

    ... 
} 

ポスト::

@Entity 
public class PostMW{ 

    @Id 
    private Long id; 

    @Load 
    private Ref<UserMW> owner; 

    ... 
} 

など:それは完璧に動作し、今までのすべての私のニーズを満たしている

@Entity 
public class LikeMW { 

    @Id 
    private Long id; 

    @Load 
    private Ref<UserMW> user; 

    private Key likedObject; 

    ... 
} 

は、これまでのところ私は、ユーザーが持っています。問題は現在、投稿と違って(Likesからエンティティを削除する)どのような方法で行かなければならないのか分かりません。私はそれは、リレーショナル・データベースにあったので、もしそれを削除するには、ユーザーとlikedObjectキーは非常に単純な(ちょうど「どこで」、ユーザーIDとlikedObjectIDによると、削除)が、客観化になります持って

...

私は2つの方法について考えてみることができます:

1 - @index Likesエンティティの両方の属性を照会して削除します(しかし、@Indexは非常に高価で、テーブルLikesは巨人になるでしょう!!アイデア)

2 - @Parent likesのエンティティと@Indexのユーザ属性に - 親がクエリし、次にlikovedオブジェクトでフィルタするdを削除する(ただし、@Parentを使用すると、1人のユーザーをロードするすべての時間を理解していました。すべてのライズをロードしますが、私が言ったように、テーブルLikesは巨大になります!

私の問題を解決するための提案はありますか?

ありがとう!

+0

あなたの 'Like'モデルにもう1つのインデックスを追加するのは、道のりです...高価であることについて - インデックスは今や無料です(しかし、インデックスによって取られたストレージはそうではありません)。あなたはそれがLikes - 巨人になると思いますか? –

+0

原因Likesはアプリケーション全体のすべてのお気に入りを保存するつもりです。今のところそれはただ好きな投稿を保存するために実装されていますが、すぐに私たちは写真、コメント、投稿などを好きになるような機能を追加します。だから、Likesは非常に多くのエンティティを持つ予定です。 GAE Datastoreが書き込みを請求し、各エンティティ内の各インデックスが2回書き込まれるため、インデックスは高価です。 私は@MihailRussuの権利ですか? –

+1

[Datastoreの新しい価格設定](https://cloudplatform.googleblog.com/2016/03/Google-Cloud-Datastore-簡略化 - 価格設定 - コスト - 費用 - 最少使用 - ケース - ケース) 1つのエンティティはインデックスに関係なく1つの書き込みしか必要とせず、100,000ドルあたり0.18ドルのコストがかかります。書き込みコストを増加させることなく、アプリケーションに必要な数の索引を使用できます。 ' 索引はまだストレージを使用し、パフォーマンスに影響を与えますが、索引を使用する場合は少し自由です。私は個人的にあなたがやっていることは時期尚早な最適化だと思うし、別のインデックスに行くだろうが、私は間違っていた... :) –

答えて

2

ことが最も簡単な実用的なソリューションであると私は特に、それが少し安くなりますどのdatastore's newish pricingを考慮すると、Likeエンティティに別のインデックスを追加することとなるだろう:

...単一のエンティティを書くだけ1のコストインデックスに関係なく書かれ、 は10万ドルで0.18ドルになります。つまり、複数のインデックスを使用している人には、書き込みはより手頃で です。書き込みコストが増加することなく、アプリケーションのニーズに応じて、 のインデックス数を使用できます。

インデックスがまだストレージを取り、可能性の高いパフォーマンスに影響を与えるが、それを使用しているときに、もう少しリベラルできることに注意してください...

1

はい、あなたは、単にインデックスのようなuserlikedObjectフィールドと実行クエリをすることができますリレーショナルデータベース/クエリがあることは、ユーザーが好きなので、もしあなたがmemcacheの

強い整合性を活用していません

  • が望ましい最終的に一致している

    • 何かとリロードをunlikes:しかし、これは2つの欠点がありますページには、すぐにその効果を確認することが保証されています。

      は、ここで私はどうなるのかです:

      @Entity 
      @Cache 
      public class Like { 
          @Parent 
          private Ref<User> user; 
      
          @Id 
          private String likedObjectKey; 
      
          public <T> Key<T> getLiked() { return Key.create(likedObjectKey); } 
      } 
      

      は事のtoWebSafeString()キーを使って文字列としてLikeエンティティのIDを言っていますされています。あなたはストリンジェンシー/デストリエーションを隠すために構文的な砂糖を加えることができます。

      これは、{user、thing}タプルのためにLikeをフェッチすることは、常にキーによるキー操作であることを意味します。バッチフェッチすることができ、フェッチはmemcacheを利用します(正と負両方のヒットがキャッシュされます)。結果は常に強く一貫しています。トランザクションでこれらをフェッチして簡単に変更できます。

      「これは誰がこの記事を好きですか?」という質問をすることはできません。 よくあるオブジェクトキーをLikeの通常のインデックスフィールドとして保存することもできます。すぐに使用する予定がなくても強くお勧めします。最終的にはデバッグのためだけにこのクエリを実行することになります。インデックスは誰もが恐れるように見えるほどコストはかかりません。