0

私はアイテムとアイテムのトランザクションを持つGAEPythonプロジェクトに取り組んでいます。

最初は、参照プロパティを持つアイテムの種類とトランザクションの種類を使用しようとしましたが、クエリが非常に複雑になりました。

そのため、トランザクションデータがアイテムに直接格納されているオールインワンバージョンに切り替えました。これにより、すべてのアイテムがトランザクションに関係しているわけではないため、多くの属性が使用されなくなりました。

アプリの速度が上がると思っていましたが、これが最善の方法ですか?

知っています:

  • たくさんの取引ともっとたくさんのアイテムがあると予想しています。
  • トランザクションのステータスを確認する必要があります(実際にはアイテムのステータスに保存されています)。
  • アイテムごとに可能なトランザクションは1つだけですが、さまざまな種類のトランザクションがあります。

より良い解決策はありますか?

編集:

問題は、ほとんどの場合、トランザクション属性を使用してアイテムをクエリすることですが、一度に最大で2つのwhere句のみを使用し、トランザクションを頻繁に更新します。

実際、私はこのようなものを持っています:

クラスMyItem(db.Model):

owner = db.ReferenceProperty(MyUser)  
descr = db.StringProperty()  

status = db.IntegerProperty()  # contains item status / transaction status

tx_actor = db.emailProperty()
tx_token = db.StringProperty()
latest_tx_date = db.DateTimeProperty()
4

1 に答える 1

1

これは1対1のマッピングであるため、クエリを実行する必要があるアイテムまたはトランザクションの属性の数に要約されます。これらの属性にはインデックスを付ける必要があり、アイテムまたはトランザクションを作成する頻度です。

それらをマージしても問題ない例:-マージされたアイテム/トランザクションオブジェクトを作成することはめったにありません。-属性の小さなセットでクエリを実行します。属性の多くはインデックス付けする必要がありません。-クエリを実行するときは、通常、アイテムとトランザクションの両方が必要です。

それらをマージするのは悪い考えの例:-アイテムには多くのインデックス付き属性がありますが、トランザクションにはほとんどありません。ただし、トランザクションを頻繁に更新する必要があります。この場合、トランザクションを作成するたびに、アイテムのインデックスを更新するためのすべての書き込みコストが発生するため、それらを分離しておくことをお勧めします。

トランザクションをクエリする必要がない場合のもう1つのオプションは、トランザクションをJSONエンコードとして保存することです。その場合、すべての属性を事前に定義する必要はありません。Expandoクラスを使用することもできます。

より良い答えを得るには、アイテム/トランザクションがどのように見えるか、および実行したいクエリのタイプの例を投稿することをお勧めします。

于 2012-04-25T20:27:44.233 に答える