Ale*_*zyk 6 python performance audit google-app-engine expando
我有一个很常见的设计问题:我需要为Google App Engine中的记录实现历史记录(审计跟踪).历史日志必须是结构化的,即我不能将所有更改加入到一些自由格式文本中并存储在字符串字段中.
我已经考虑了历史模型的以下选项,并且在注意到选项#1中的性能问题之后,我选择实现选项#3.但是,如果这个解决方案是高效和可扩展的,那么我们会有些怀疑.例如:随着选项#3中动态属性数量的增加,性能是否会显着下降?
您是否对每个选项的优缺点有更深入的了解,或者可以建议适用于Google App Engine数据库特征的其他审计跟踪设计模式?
fieldName
创建history_fieldName_n
字段(其中n = <0..N>是一些历史记录)
fieldName
创建一个fieldName_history
列表字段
如果我必须选择,我会选择选项 1。读取的性能与其他选项一样(如果不是更好)。所有其他选项仅在特定情况下(小或非常大的更改集)才具有速度优势。它还将为您提供很大的灵活性(更轻松),例如 x 天后清除历史记录或跨不同模型类型的查询历史记录。确保在同一事务中将历史实体创建为已更改实体的子实体,以保证一致性。你最终可能会得到以下之一:
class HistoryEventFieldLevel(db.Model):
# parent, you don't have to define this
date = db.DateTime()
model = db.StringProperty()
property = db.StringProperty() # Name of changed property
action = db.EnumProperty(['insert', 'update', 'delete'])
old = db.PickleProperty() # Old value for field, empty on insert
new = db.PickleProperty() # New value for field, empty on delete
class HistoryEventModelLevel(db.Model):
# parent, you don't have to define this
date = db.DateTime()
model = db.StringProperty()
action = db.EnumProperty(['insert', 'update', 'delete'])
change = db.PickleProperty() # Dictionary with changed fields as keys and tuples (old value, new value) as values
Run Code Online (Sandbox Code Playgroud)