小编Ale*_*zyk的帖子

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

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

我已经考虑了历史模型的以下选项,并且在注意到选项#1中的性能问题之后,我选择实现选项#3.但是,如果这个解决方案是高效和可扩展的,那么我们会有些怀疑.例如:随着选项#3中动态属性数量的增加,性能是否会显着下降?

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

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

python performance audit google-app-engine expando

6
推荐指数
1
解决办法
1783
查看次数

在pycharm或eclipse + pydev中的C线程中不工作python断点

我有一个使用C++库的django应用程序(通过swig导入).C++库启动自己的线程,该线程在Python代码中调用回调.

我无法在python代码中设置断点,在PyDev和PyCharm中也是如此.也试过'gevent compatibility'选项也没有运气.

我验证了回调被正确调用,因为logging.info转储了预期的内容.在其他线程中设置的断点工作正常.因此,似乎python调试器无法管理在非python代码中创建的线程调用的python代码中的断点.

有没有人知道解决方法?也许我可以使用一些"魔术"线程初始化序列?

eclipse debugging multithreading pydev pycharm

5
推荐指数
1
解决办法
2215
查看次数

当最终类没有__init__时,不调用Python mixin构造函数

最终类用户可能想创建一个由Base和组成的类MixinMixin在第三方库类上提供了其他通用功能)。

但是,Mixin.__init__当按以下方式使用时不会调用。仅Base.__init__称为:

>>> class Base(object): #3rd party library class
...     def __init__(self): print "Base"
... 
>>> class Mixin(object): #my features useful as addendum for a few classes
...     def __init__(self): print "Mixin"
... 
>>> class C(Base, Mixin): pass
... 
>>> c = C()
Base
Run Code Online (Sandbox Code Playgroud)

如何执行调用都Mixin.__init__Base.__init__在这种情况下,无需用户记住把一个构造函数super()在C级呼叫?

>>> class Base(object):
...     def __init__(self): print "Base"
... 
>>> class Mixin(object):
...     def __init__(self): print "Mixin"
... 
>>> …
Run Code Online (Sandbox Code Playgroud)

python multiple-inheritance super mixins

1
推荐指数
1
解决办法
640
查看次数