約 500 レコードの小さな DB があります。フォームを現在のバージョンと共に Record コレクションに保存するバージョン管理スキームを実装しようとしています。理想的には、フォームをバージョン番号とともに埋め込みドキュメントに保存して、物事をきちんと整頓したいと考えています。
class Structure(db.EmbeddedDocument):
form = db.ReferenceField(Form, required = True)
version = db.IntField(required = True)
@property
def short(self):
return {
'form': self.form,
'version': self.version
}
class Record(db.Document):
structure = db.EmbeddedDocumentField(Structure)
@property
def short(self):
return {
'structure': self.structure.short
}
このようにして、レコードを思い出すと、その時点で使用されていたフォームとバージョンを取得できます。いくつかのタイミング テストの実行:
start = time.clock()
records = Record.objects.select_related()
print ('Time: ', time.clock() - start)
response = [i.short for i in records]
print ('Time: ', time.clock() - start)
すべてのレコードのクエリ時間はRecord.objects.select_related()
約 1.12 秒で妥当であることがわかりましたが、JSON 転送を目的としたシリアル化は約 24.1 秒で非常に高価であることがわかりました!
EmbeddedDocument の使用を削除してわずかな変更を加えると、次のようになります。
class Record(db.Document):
form = db.ReferenceField(Form, required = True)
version = db.IntField(required = True)
@property
def short(self):
return {
'form': self.form,
'version': self.version
}
同じテストを実行すると、クエリ時間は約 1.36 秒とほとんど変わらないことがわかりましたが、シリアル化時間は 24 倍改善されて 1.14 秒になりました。埋め込みドキュメントを使用すると、シリアル化時間に大きなペナルティが発生する理由が本当にわかりません...? 埋め込みオブジェクトでの逆参照はより困難ですか?