1

2 つのモデルに基づく数百万のアドレスがあるとします。

  1. Addressモデルには、次のような一般的なプロパティであっても、プレーンな文字列プロパティがありますcounty

    class Address(ndb.Model):
    
      house_no = ndb.StringProperty()
      street = ndb.StringProperty()
      locality = ndb.StringProperty() # City/town
      county = ndb.StringProperty()
      zipcode = ndb.StringProperty()
    
  2. StructuredAddressmodel は、それぞれを として定義することにより、より一般的なプロパティを他のモデルへの参照として保持しますKeyProperty

    class StructuredAddress(ndb.Model):
    
      house_no = ndb.StringProperty()
      street = ndb.StringProperty()
      locality = ndb.KeyProperty(kind=Locality) # City/town
      county = ndb.KeyProperty(kind=County)
      zipcode = ndb.KeyProperty(kind=Zipcode)
    

質問は次のとおりです。

  • のような一般的なプロパティに基づいてクエリを実行する場合、どのモデルがより効率的zipcodeですか?

  • countyプロパティの数が約50で、プロパティの数が約100万の場合を想定しzipcodeます。何百万もの住所レコードがある場合、この場合、どのモデルがより効率的でしょうか?

  • この例での使用KeyPropertyは、より多くの読み取り操作を意味し、実質的に請求額が高くなることを意味しますか? 組み込みの ndb キャッシングはすでにこれを回避していますか?

4

2 に答える 2

2

KeyPropertyバージョンは、通常の郵便番号や町/郡名よりも多くのバイトを使用するため、より高価になります。(各キーは、それが指す種類のフルネームを繰り返します。)

パッシブストレージのコストに加えて、キーによって参照されるフィールドを読み取るための追加の読み取りコストを支払うことになります。

最後に、これらのクエリを実行するために必要なJOINを直接実行する方法はありません(ただし、1回のルックアップのみの問題である可能性があります)。

キーを使用することで購入できるのは、町や郡の名前を変更できることだけです。しかし、それは実際にどのくらいの頻度で起こりますか?

于 2012-07-09T20:15:14.223 に答える
1

郵便番号などの一般的なプロパティに基づいてクエリを実行する場合、どのモデルがより効率的ですか?

ZipCode クラスが単に郵便番号を含む String/Int プロパティを保持すると仮定すると、(1) 1 つの RPC でこのクエリが実行され、(2) 2 つの RPC が必要になります。

(1)

# Get the first 100 adresses with zipcode 55555
addresses = Address.query().filter('zipcode','55555').fetch(limit=100)

(2)

# Get the key of the zipcode 55555
zip = Zipcode.query().filter('code','55555').get()
# Get the first 100 addresses with the zipcode 55555
addresses = StructuredAddress.query().filter('zipcode',zip.key()).fetch(limit=100)

したがって、ここでは (1) が優れています。

国のプロパティの数が約 50 で、郵便番号のプロパティの数が約 100 万の場合を想定します。何百万もの住所レコードがある場合、この場合、どのモデルがより効率的でしょうか?

もう一度、郵便番号に関連付けられた文字列が 1 つだけであると仮定すると、(1) 数百万のアドレスを格納するだけで済み、(2) 数百万のアドレスを格納する必要があるストレージ効率について効率的に話していることになります。何百万もの郵便番号があるため、(1) の方が効率的です。

繰り返しになりますが、(1) が優れています。

この例で KeyProperty を使用することは、より多くの読み取り操作を意味し、実質的に請求額が高くなることを意味しますか? 組み込みの ndb キャッシングはすでにこれを回避していますか?

つまり、最初の質問への回答が示すように、はい。実際に KeyProperty を使用したいのは、参照モデルに格納される複数のフィールドがある場合だけです。

于 2012-07-09T19:25:17.407 に答える