0

アプリケーションを db から ndb に変換する作業を行っており、クエリをより効率的にする作業を行っています。データ量の増加に伴い、アプリケーションが少し遅くなり、クエリがかなり非効率的であることがわかりました。

バックグラウンド:

簡略化したデータ モデルは次のようになります (批判は自由です)。

class ServiceRequest(ndb.Model):
  technician = ndb.UserProperty()
  application = ndb.KeyProperty()  # ServiceRequestApplication kind


class ServiceRequestApplication(ndb.Model):
  applicant = ndb.UserProperty()

管理者は ServiceRequest の ServiceRequestApplication を「承認」できます。ServiceRequestApplications は、親 ServiceRequest でインスタンス化されます。ServiceRequestApplication が承認されると、アプリケーションのキーが要求のアプリケーション プロパティに格納されます。

トリッキーな部分:

1 つの実際のサービス予定 (技術者ごとに 1 つ) に対して複数の ServiceRequest エンティティが存在する場合があります。1 つの ServiceRequest があり、複数の技術者が必要な場合は、メインの ServiceRequest を親として追加の ServiceRequest を作成します。このデータがクエリ/表現される方法に関するいくつかの他の理由を含め、祖先クエリは非常に簡単であるため、最初はこの方法で問題に取り組みました。

子 ServiceRequests を持たないServiceRequest エンティティを照会する方法を考えられる人はいますか?

ありがとう!

4

1 に答える 1

1

件名で、親を持たないエンティティのクエリについて質問します。本文では、子を持たないエンティティのクエリについて尋ねます。ただし、どちらの場合も答えは同じです。これは、標準の App Engine インデックスでは不可能です。前者はキーに存在しないものを検索する必要があり (インデックスが構造化されている方法では不可能です)、後者は他のエンティティのプロパティ (または存在) に基づいてエンティティを選択しているため、結合が必要です。

代わりに、非正規化する必要があります。必要に応じて、それがルート エンティティかどうか、または子を持つかどうかを示すプロパティを ServiceRequest に追加します。

于 2012-05-02T00:44:49.063 に答える