gpt4 book ai didi

python - 在 Google App Engine 中实现记录更改的高效审计跟踪 - 设计模式

转载 作者:太空狗 更新时间:2023-10-30 00:12:09 24 4
gpt4 key购买 nike

我有一个很常见的设计问题:我需要为 Google App Engine 中的记录实现一个历史日志(审计跟踪)。历史日志必须是结构化的,即我不能将所有更改加入一些自由格式的文本并存储在字符串字段中。

我考虑了历史模型的以下选项,在注意到选项 #1 中的性能问题后,我选择实现选项 #3。但是,如果这个解决方案是有效的和可扩展的,仍然会有一些疑问。例如:在选项 #3 中,随着动态属性数量的增加,性能是否有显着下降的风险?

您是否对每个选项的优缺点有更深入的了解,或者可以建议适用于 Google App Engine 数据库特征的其他审计跟踪设计模式?

  1. 使用经典 SQL“主从”关系
    • 优点
      • 具有 SQL 背景的数据库开发人员易于理解
      • clean:直接定义历史记录及其属性
      • 搜索性能:轻松搜索历史(可以使用索引)
      • 故障排除:通过管理工具轻松访问 (_ah/admin)
    • 缺点
      • 通常不建议在 GAE DB 中以这种方式实现一对多关系
      • 读取性能:过多的记录读取操作以显示较长的审计跟踪,例如在大记录列表的详细信息 Pane 中。
  2. 将历史记录存储在 BLOB 字段中(腌制的 Python 结构)
    • 优点
      • 易于实现且灵活
      • 读取性能:非常高效
    • 缺点
      • 查询性能:无法使用索引进行搜索
      • 故障排除:无法通过 admin db viewer (_ah/admin) 检查数据
      • 不干净:SQL 开发人员不太容易理解/接受(他们认为这很难看)
  3. 将历史记录存储在 Expando 的动态属性中。例如。为每个字段 fieldName 创建 history_fieldName_n 字段(其中 n=<0..N> 是一些历史记录)
    • 优点:
      • 简单:易于实现和理解
      • 故障排除:可以通过管理界面读取所有历史属性
      • 读性能:一次读操作获取记录
    • 缺点:
      • 搜索性能:不能简单地搜索历史记录(它们有不同的名称)
      • 不太干净:属性的数量乍一看可能令人困惑
  4. 将历史记录存储在主记录的某些列表字段集中。例如。为每个 fieldName 创建一个 fieldName_history 列表字段
    • 优点:
      • clean:直接定义历史属性
      • 简单:SQL 开发人员易于理解
      • 读性能:一次读操作获取记录
    • 缺点:
      • 搜索性能:可以使用索引仅搜索任何时候都有一定值(value)的记录,而不能搜索在某个特定时间具有组合值的记录;
      • 故障排除:在 admin db viewer 中检查列表很困难

最佳答案

如果我必须选择,我会选择选项 1。读取与其他选项的性能相同(如果不是更高的话)。而所有其他选项仅在特定情况下(小或非常大的更改集)才具有速度优势。它还将为您带来很大的灵 active (更轻松),例如在 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

关于python - 在 Google App Engine 中实现记录更改的高效审计跟踪 - 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4417130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com