8

データ ストアの設計に関する私のバックグラウンドは、iOS の Core Data に由来します。これは、別のエンティティと 1 対多の関係を持つプロパティをサポートします。

現在、次の 3 つのエンティティ タイプを持つ App Engine プロジェクトに取り組んでいます。

  • User、アプリを使用している人を表します。
  • Project、プロジェクトを表します。Userは多くのプロジェクトに関連付けられている場合があります。
  • Postの背後にあるメイン コンテンツProjectです。AProjectは複数のポストを持つ場合があります。

現在、 には、エンティティとの 1 対多の関係であるUserというプロパティがあります。には、エンティティとの 1 対多の関係であるというプロパティがあります。projectsProjectProjectpostsPost

この場合、データストアの参照プロパティと NDB の構造化プロパティのどちらが仕事に適していますか (また、この 2 つは概念的にどのように異なるのですか)? データを構造化するためのより良い方法はありますか?

4

2 に答える 2

11

参照プロパティとは、おそらくキー プロパティを意味します。これは別のデータストア エンティティへの参照です。db API と ndb API の両方に存在します。これらを使用して、多くのエンティティを別のエンティティのキ​​ーにポイントすることで、多対 1 の関係をモデル化できます。

構造化されたプロパティは、まったく異なる獣です。データ構造を定義し、それを別のエンティティに含めることができます。

1 つの連絡先に複数のアドレスを含めるドキュメントの例を次に示します。

class Address(ndb.Model):
  type = ndb.StringProperty() # E.g., 'home', 'work'
  street = ndb.StringProperty()
  city = ndb.StringProperty()

class Contact(ndb.Model):
  name = ndb.StringProperty()
  addresses = ndb.StructuredProperty(Address, repeated=True)

guido = Contact(name='Guido',
                addresses=[Address(type='home',
                                   city='Amsterdam'),
                           Address(type='work',
                                   street='Spear St',
                                   city='SF')])

guido.put()

特定のアプリケーションでは、次のように NDB を使用することをお勧めします (利用可能な API の最新バージョンを使用することが常に最善です)。

繰り返し構造化されたプロパティとしてプロジェクト モデルに含まれる投稿モデル。ユーザーには、アクセス許可を持つプロジェクトのキーを含む KeyProperty が繰り返されます。

もう少し複雑にするために、プロジェクトとパーミッション/ロールを表す別のモデルを作成し、それを繰り返し構造化されたプロパティとしてユーザー モデル内に含めることができます。

キーを保持する主な理由は、HRD の結果整合性を考慮してデータにアクセスできるようにするためです。

これについてさらにサポートが必要な場合はお知らせください。

編集:

明確にするために、提案された構造は次のとおりです。

モデル:

  • ユーザー
  • User-Project-Mapping (オプション、パーミッションの処理に必要)
  • 計画
  • 役職

ユーザー モデルには、繰り返される構造化プロパティとして User-Project-Mapping が含まれている必要があります。

プロジェクト モデルには、繰り返される構造化プロパティとして Post が含まれている必要があります。

User-Project-Mapping には、プロジェクトへのキー参照と関連する権限表現のみを含める必要があります。

これは商用プロジェクトのように聞こえるので、これについてさらにサポートが必要な場合は、喜んで相談させていただきます。あなたが成功するのに十分であることを願っています!

于 2012-12-28T17:29:58.607 に答える
3

言及されておらず、関連する可能性のある別のポイントがあります。ドキュメントのこの部分で言及されているように、 StructuredPropertyに挿入されたエンティティは「本格的なエンティティではありません」。以下は完全な引用です(@Sologoubによる回答で言及されているのと同じ例を参照しています):

Address インスタンスはモデル クラスと同じ構文を使用して定義されますが、本格的なエンティティではありません。データストアに独自のキーはありません。それらが属する連絡先エンティティから独立して取得することはできません。

データを複製しないとエンティティのプロパティを再利用できないため、設計にいくつかの制限が生じる可能性があります。一方、 KeyPropertyは別のエンティティのキ​​ーを参照するため、より「リレーショナル」な方法でエンティティの関係を表します。KeyPropertiesは繰り返すrepeated=Trueこともできます:パラメータを含めるだけです。

于 2014-06-06T08:13:21.613 に答える