[解決済み] App Engine: 1対多の関係における構造化プロパティと参照プロパティの比較
質問
私のデータストアの設計の背景には、iOSのCore Dataがあり、別のエンティティと1対多の関係を持つプロパティをサポートしています。
App Engineのプロジェクトで、現在3つのエンティティタイプを持っています。
-
User
は、アプリを利用する人を表す。 -
Project
で、プロジェクトを表します。AUser
は、多くのプロジェクトに関連付けることができます。 -
Post
の背後にあるメインコンテンツであるProject
. AProject
は、多くのポストを持つことができます。
現在
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参照と関連するパーミッションの表現のみが必要です。
商業的なプロジェクトのようなので、さらに詳しいことが知りたいのであれば、喜んで相談に乗りますよ。あなたが成功するために十分であることを願っています。
関連
-
Pythonコンテナのための組み込み汎用関数操作
-
python implement mysql add delete check change サンプルコード
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] Google App EngineとGoogle Compute Engineの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み] データ型が理解できない
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].