我有一个包含大约500条记录的小型数据库。我正在尝试实现一个版本控制方案,我将表单及其当前版本保存到我的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.1s时非常昂贵!
如果我通过删除使用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 s时几乎没有变化,但序列化时间提高了24x到1.14s。我真的不明白为什么使用嵌入式文档会导致序列化时间的大量惩罚......?在嵌入对象中解除引用更难吗?