2

GAE Datastore APIについて読んだ後でも、エンティティのプロパティとしてキー名と親を複製する必要があるかどうかはわかりません。

従業員と部門の2種類のエンティティがあるとしましょう。各従業員には親として部門があり、アカウント名で識別されます。従業員のキー名としてアカウント名を使用しています。ただし、Employeeをモデル化するときは、次の2つをプロパティとして保持します。

division = db.ReferenceProperty(Division)
account_name = db.StringProperty()

明らかに、私は手動でその親とそのキー名divisionとの一貫性を保つ必要があります。account_name私がこの余分な仕事をしている理由は次のとおりです。

  1. GQL / Datastore APIは、通常のプロパティだけでなく、親とキーの名前もサポートしていない可能性があります。プロパティについてできることはありますが、親またはキーの名前はありません(または本質的にプロパティを参照していますか)?GQLクエリでキー名を使用するにはどうすればよいですか?
  2. キー名と親の意味は特に明確ではありません。名前はわかりやすいものではないため、アカウント名をキー名として使用していることを他の寄稿者に通知する必要があります...

しかし、これは本当に不要な作業であり、時間とストレージスペースを浪費します。私はSQLを取り除くことができません-それを考えて-なぜGoogleは私たちにプロパティをキーとして定義させないのですか?そしてもう一人は親になりますか?次に、それらに名前を付けて、通常のプロパティとして使用できます...

ここでのベストプラクティスは何ですか?

4

2 に答える 2

5

GAEデータストアでは、エンティティが作成された後は、エンティティの親またはkey_nameを変更できないことに注意してください。これらの値は、エンティティの存続期間中永続的です。

従業員のaccount_nameが変更される可能性が少しでもある場合は、それをkey_nameとして使用することはできません。変更されない場合は、非常に優れたkey_nameである可能性があり、高価なクエリの代わりにEmployee.get_by_key_name()を使用して従業員の安価な取得を行うことができます。

親は、外部キーと同等であることを意味するものではありません。外部キーに相当するのは、参照プロパティです。

親を使用する主な理由は、親エンティティと子エンティティが同じエンティティグループにあり、単一のトランザクションで両方を操作できるようにするためです。従業員から部門への参照が必要な場合は、参照プロパティを使用してください。これはGAEデータモデリングで非常に重要であるため、エンティティグループがどのように機能するかを理解することをお勧めします。

親を使用すると、単一のエンティティグループに書き込む速度に制限があるため(1秒あたり約1回の書き込み)、書き込みパフォーマンスの問題が発生する可能性もあります。親プロパティと参照プロパティのどちらを使用するかを決定するときは、同じトランザクションでどのエンティティを変更する必要があるかを考える必要があります。多くの場合、代わりにクロスグループ(XG)トランザクションを使用できます。それはあなたがしたいトレードオフについてのすべてです。

だから私の提案は:

  • 従業員のaccount_nameが絶対に変更されない場合は、それをkey_nameとして使用します。それ以外の場合は、基本的なプロパティにします。
  • 同じトランザクションで従業員と部門を変更する必要があり(XGトランザクションでこれを機能させることができない)、従業員の部門を変更しない場合は、部門を従業員の親にします。それ以外の場合は、この関係を参照プロパティでモデル化します。
于 2012-09-07T19:33:36.690 に答える
3

Divisonを親として新しいEmployeeオブジェクトを作成すると、次のようになります。

div = Division()
... #Complete the division properties
div.put()
emp = Employee(key_name=<account_name>, parent=div)
... #Complete the employee properties
emp.put()

次に、部門への参照を取得する場合、従業員は次の一部です。

div = emp.parent()
#Get the Employee account_name (which is the employees's key name):
account_name = emp.key().name()

RefrencePropertyは、親ですでに行われているため、従業員が所属する部門に保存する必要はありません。さらに、必要に応じて、Employeeエンティティのキ​​ーからaccount_nameを取得できます。

キーを照会するには:

emp = Employee.get_by_key_name(<account_name>, parent=<division>)
#OR 
div = Division.get_by_key_name(<keyname>)

#Get all employees in a division
emps = Employee.all().ancestor(div)
于 2012-09-07T16:29:43.780 に答える