2012-03-12 6 views
0

私はGoogle App Engineを使用しており、Big Tableを使用しています。大きなテーブルでは、子(サブ)コレクションのキー値は普通ですか?

私はこのようになりますpersonエンティティいます

{ 
    // This property would be encoded into JSON and saved un-indexed as db.Text() 
    phone_numbers: 
    { 
     'hHklams8akjJkaJSL': // <-- Should I key this object? 
     { 
      number:'555-555-5555', 
      type:'mobile', 
     }, 
     etc... 
    }, 
    // This property is an array of strings. 
    // It is searchable so that a query could be run to find all 
    // people with a particular phone number: 
    // "SELECT * FROM person WHERE phone_number_search_property =  
    //  '5555555555'" 
    phone_number_search_property:['5555555555','other phone numbers...'], 

    first_name:'...', 
    etc... 
} 

phone_numberプロパティは、JSON形式(db.Text)にインデックス付けされていないテキストのBLOBとして格納されます。この状況で特定の電話番号を参照したい場合は、jsonをデコードしてから、探している特定のキーで電話番号を取得します。

phone_number_search_propertyが検索に使用されます。 "SELECT * FROM person WHERE phone_number_search_property = '5555555555'"

このような状況でエンティティ内の電話番号を参照するには、どのような方法が適していますか?ここでは、UUIDを使用して各値をキー入力しています。これは物事を行うための「正常な」受け入れられた方法ですか?そうでない場合は、何ですか?

ありがとうございます!

答えて

1
  1. データオブジェクトは、実際に他のオブジェクトのほんの一部であり、(電話番号や人の場合のように)「親」オブジェクトせずにアクセスされることはありません場合、それはそれをシリアル化し、内部でそれを保存するために大丈夫だ私見"親"オブジェクト。あなたがしたことはOKです。

  2. 電話番号で人を検索するので、(正規化された)電話番号で追加のプロパティを持つソリューションが機能しています。追加のプロパティで検索する必要がある場合は、機能しません(例:検索を携帯電話番号に限定するなど)。

  3. なぜシリアル化された電話番号をハッシュされた文字列でキーしますか(UUID.fromString(String)で生成すると仮定します)? (正規化された)電話番号を使用してください - それは一意です。

+0

Hey Peter、私はUUIDを使用してキーを作成しました。私はデータそのものをキー入力しないようにするためです。ときには私が思うような情報は、ユニークではないことが判明します。この場合、電話番号だけでなく、電話番号と内線番号をキーにしなければなりません。そして、誰かが主要な会社の電話番号だった電話番号をつくろうとすると、問題の原因となる可能性があります。説明: "Ask for Carol"。誰かが間違った番号を入力して訂正した場合、項目を再入力する必要があります。 –

関連する問題