11

Python NDB との 1 対多の関係を効果的に実装する方法について、ご意見をお聞かせください。(例: Person(one)-to-Tasks(many))

私の理解では、それを実装するには3つの方法があります。

  1. 「親」引数を使用
  2. 「繰り返し」構造化プロパティを使用する
  3. 「反復」キー プロパティを使用する

私は通常、以下のロジックに基づいて方法を選択しますが、それはあなたにとって理にかなっていますか? もっといいロジックがあれば教えてください。

  1. 「親」引数を使用

    • これらのエンティティ間でトランザクション操作が必要です
    • これらのエンティティ間で双方向参照が必要です
    • 「親子」関係を強く志向
  2. 「繰り返し」構造化プロパティを使用する

    • 「多数の」エンティティを個別に使用する必要はありません (常に「1 つの」エンティティで使用されます)
    • 「多くの」エンティティは「1 つの」エンティティによってのみ参照されます
    • 「繰り返し」の数が 100 未満です
  3. 「反復」キー プロパティを使用する

    • 「多数」のエンティティを個別に使用する必要がある
    • 「多くの」エンティティは他のエンティティから参照できます
    • 「繰り返し」の数が 100 を超えています

No.2 はエンティティのサイズが大きくなりますが、データストア操作を節約できます。(ただし、逆シリアル化の CPU 時間を短縮するには、射影クエリを使用する必要があります)。したがって、私はできる限りこの方法を使用しています。

ご意見ありがとうございます。

4

2 に答える 2

7

あなたが見逃している重要なこと:データをどのように読んでいますか?

リクエストで特定の人物のすべてのタスクを表示している場合、2 が理にかなっています。その人物にクエリを実行して、その人物のすべてのタスクを表示できます。

ただし、特定の時間に予定されているすべてのタスクのリストをクエリする必要がある場合、繰り返し構造化されたプロパティのクエリはひどいものです。タスクには個々のエンティティが必要です。

4 番目のオプションは、タスクで Person を指す KeyProperty を使用することです。人のタスクのリストが必要な場合は、クエリを発行できます。

個々のタスクを検索する必要がある場合は、おそらく #4 を使用することをお勧めします。#3と組み合わせて使用​​することもできます。

また、繰り返されるプロパティの数は 100 とは関係ありません。これは、Person エンティティと Task エンティティのサイズ、および 1 MB にどれだけ収まるかに関係しています。Task エンティティが大きくなる可能性がある場合、予想よりも早く Person エンティティの領域が不足する可能性があるため、これは潜在的に危険です。

于 2013-02-06T22:25:28.077 に答える
6

ほとんどの GAE ユーザーが (遅かれ早かれ) 気がつくことの 1 つは、データストアは、リレーショナル データベースで良いアイデアと見なされる正式な正規化の原則に従った設計を推奨していないということです。代わりに、直感的ではなく、確立された規範に反するデザインを助長しているように見えることがよくあります。リレーショナル データベースの設計原則にはそれなりの役割がありますが、ここでは機能しません。

データストア設計の基礎は、次の 2 つの問題に分類されると思います。

  1. このデータを読み取る方法と、最小数の読み取り操作で読み取る方法を教えてください。

  2. そのように保存すると、書き込み操作とインデックス作成操作の数が爆発的に増えるのでしょうか?

この 2 つの質問に、できる限り先見の明と実際のテストで答えることができれば、かなりうまくやっていると思います。他の規則や特定のケースを形式化することもできますが、これらの質問はほとんどの場合有効です。

于 2013-02-07T10:37:40.563 に答える