1. ホーム
  2. python

[解決済み] App Engine: 1対多の関係における構造化プロパティと参照プロパティの比較

2022-03-03 19:07:44

質問

私のデータストアの設計の背景には、iOSのCore Dataがあり、別のエンティティと1対多の関係を持つプロパティをサポートしています。

App Engineのプロジェクトで、現在3つのエンティティタイプを持っています。

  • User は、アプリを利用する人を表す。
  • Project で、プロジェクトを表します。A User は、多くのプロジェクトに関連付けることができます。
  • Post の背後にあるメインコンテンツである Project . A Project は、多くのポストを持つことができます。

現在 User はプロパティを持ちます。 projects との一対多の関係である。 Project エンティティになります。 Project はプロパティを持ちます。 posts との一対多の関係である。 Post エンティティになります。

この場合、DatastoreのReference PropertyとNDBのStructured Propertyのどちらが適しているのでしょうか(また、この2つは概念的にどう違うのでしょうか)。私のデータを構造化するためのより良い方法はありますか?

どのように解決するのですか?

参照プロパティというのは、おそらくキープロパティのことでしょう。これは、別のデータストアのエンティティへの参照です。これは、dbとndbの両方のAPIに存在します。これを使うと、多くのエンティティを別のエンティティのキーに向けることで、多対一の関係をモデル化することができます。

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

ここでは、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の最新バージョンを使用することが常に最善です)を使用して、次のようにお勧めします。

Postモデルは、Projectモデルの下に繰り返し構造化されたプロパティとして含まれています。 Userは、自分が権限を持つProjectのキーを含むKeyPropertyを繰り返し含む。

もう少し複雑にするには、プロジェクトと権限/役割を表す別のモデルを作成し、それをユーザーモデル内の反復構造化プロパティとして含めることができます。

キーを保持したい主な理由は、HRDの最終的な一貫性を考慮して、データにアクセスできる状態を維持するためです。

また何かあったら教えてください。

EDIT

明確にするために、構成案を示します。

モデル

  • ユーザー
  • User-Project-Mapping(オプション、パーミッションの処理に必要です。)
  • プロジェクト
  • ポスト

Userモデルは、User-Project-Mappingを繰り返し構造化されたプロパティとして含む必要があります。

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

User-Project-Mappingには、ProjectへのKey参照と関連するパーミッションの表現のみが必要です。

商業的なプロジェクトのようなので、さらに詳しいことが知りたいのであれば、喜んで相談に乗りますよ。あなたが成功するために十分であることを願っています。