5

Googleアプリケーションエンジンで実行しているJavaアプリケーションがあります。連絡先と呼ばれる種類があります。アプリエンジンのデータストアとテキスト検索のモデリングを設計する最良の方法

両方のデータストアおよびテキスト検索で、次のサンプル・スキーマ

Contact 
{ 
    long id 
    String firstName 
    String lastName 
    ... 
} 

上記はexistigモデルであるが、いくつかの要件をサポートするために、我々はこのオブジェクトを格納している今、私たちは自分のページビューデータとの接点を統合したいです。

各コンタクトは、いくつかの連絡先にも、ページビューを記録または数百万、数千を持つことができます

次のサンプルページを訪問オブジェクトである[注:私たちは、今のところ、このオブジェクトを持っていない、これはただの情報を与えていますページの訪問]

PageVisit 
{ 

    long id 
    String url 
    String refUrl 
    int country 
    String city 
    .... 
} 

我々が接触コアプロパティでクエリを必要とし、彼のページは、元のため

データを訪れた要件、持っている:

select * from Contact where firstName = 'abc' and url = 'cccccc.com'; 
select * from Contact where firstName = 'abc' or url = 'cccccc.com'; 

この種のクエリを書くには、コンタクトのコアプロパティとそのページの訪問者の両方がコンタクトオブジェクト自体で利用可能である必要がありますが、コンタクト は膨大なページビューを持つ必要があります。これはエンティティの最大サイズ制限を超えます

データストアとテキスト検索の両方でこのような状況で連絡先モデルを設計する方法です。

答えて

1

クラウドデータストアがサポートしていません

おかげで参加するので、あなたは、クライアントコードからいくつかの方法でこれを処理する必要があります。これを処理する

2つの可能な方法があります。

- kind: PageVisit 
    ancestor: no 
    properties: 
    - name: firstName 
    - name: url 

PageVisit 
{ 

    long id 
    String firstName // Denormalized from Contact 
    String url 
    String refUrl 
    int country 
    String city 
    .... 
} 

これは、複合インデックスを作成する必要があります:

あなたはPageVisitに検索する必要がある連絡先を非正規化

複数のクエリを実行する

select id from Contact where firstName = 'abc' 

select * from PageVisit where contactId={id} and url = 'cccccc.com'; 
select * from PageVisit where contactId={id} or url = 'cccccc.com'; 

これは、あなたが複合インデックスを作成する必要があります。最終

- kind: PageVisit 
    ancestor: no 
    properties: 
    - name: contactId 
    - name: url 

を脇:をあなたのサイトがどのように大規模によっては、ページビューのデータのためのCloud Bigtableに探して価値があるかもしれません。 OLAPスタイルの高負荷書込みワークロードに適したソリューションです。

関連する問題