Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在GAE/P中创建自己的活动日志_Python_Google App Engine - Fatal编程技术网

Python 在GAE/P中创建自己的活动日志

Python 在GAE/P中创建自己的活动日志,python,google-app-engine,Python,Google App Engine,我想在我的应用程序中记录用户活动,以便向用户演示和管理。我的客户是公司,因此我可以在三个级别上介绍活动: 单个用户的活动 公司所有用户的活动 所有活动 要进行日志记录,我将创建一个模型来存储日志条目。我看到了一些这样做的方法 首先,我可以将每个记录的活动存储在自己的实体中,然后根据需要进行查询: class Activity(ndb.Model): activity = ndb.StringProperty() user_id = ndb.StringProperty()

我想在我的应用程序中记录用户活动,以便向用户演示和管理。我的客户是公司,因此我可以在三个级别上介绍活动:

  • 单个用户的活动
  • 公司所有用户的活动
  • 所有活动
  • 要进行日志记录,我将创建一个模型来存储日志条目。我看到了一些这样做的方法

    首先,我可以将每个记录的活动存储在自己的实体中,然后根据需要进行查询:

    class Activity(ndb.Model):
        activity = ndb.StringProperty()
        user_id = ndb.StringProperty()
        company_id = ndb.StringProperty()
    
    其次,我可以将用户的所有活动存储在单个实体中:

    class UserActivity(ndb.Model):
        activity = ndb.StringProperty(repeated=True) # Note this is now a list
        company_id = ndb.StringProperty()
    
    class CompanyActivity(ndb.Model):
        activity = ndb.StringProperty(repeated=True) # Would store user_id here somehow
    
    第三,我可以将公司的所有活动存储在一个实体中:

    class UserActivity(ndb.Model):
        activity = ndb.StringProperty(repeated=True) # Note this is now a list
        company_id = ndb.StringProperty()
    
    class CompanyActivity(ndb.Model):
        activity = ndb.StringProperty(repeated=True) # Would store user_id here somehow
    
    这三个选项的功能/性能权衡是什么?我知道,如果存在频繁的卖出交易,那么第二和第三种期权可能存在争用问题,但为了便于讨论,我们假设这不是一个问题


    对于第二个和第三个选项,减少数据存储实体的总数(因为它们将合并为更少的实体)是否有显著的优势?或者我应该只使用第一个选项吗?

    使用repeated属性的唯一好处是避免了最终的一致性问题:无论何时阅读
    用户活动
    公司活动
    实体,您都会知道您得到了所有活动的完整列表。当使用第一种方法时,您必须进行查询以获得此类列表,并且该列表可能会错过最近的活动,因为相应的查询索引可能尚未更新以反映这些活动

    但是,除了您提到的潜在竞争问题之外,重复属性方法还有另一个缺点:随着越来越多的活动被添加到列表中,这些实体的大小将逐渐增加,其转化为:

    • 越来越慢的
      get()
    • 达到最大数据存储实体大小(~1MB,请参阅)的风险,这将需要额外的逻辑来跨多个实体拆分列表
    第三种方法尤其需要一种不那么琐碎的方法来获取每个用户的活动报告

    我坚持第一种方法,它是最灵活和可扩展的方法,缺点很小:

    • 最终的一致性问题是IMHO不是展会的阻碍因素(可能有办法减少其影响)
    • 额外的存储空间(用于存储在每个
      活动
      实体中的用户/公司ID属性,加上由于实体数量较多而产生的较大索引)非常值得(存储成本较低)

    我还建议第一种方法,但使用
    KeyProperty

    class Activity(ndb.Model):
        activity = ndb.StringProperty()
        user_id = ndb.KeyProperty(kind='User')
        company_id = ndb.KeyProperty(kind='Company')
    
    代码从一开始就要干净得多,以后可以随时进行微调


    接下来,Dan已经很好地阐述了最重要的几点。

    谢谢,这一切都是有意义的,并且证实了我的倾向,即使实体大小不是一个问题(我将删减日志),最终的一致性也不是一个问题(不需要最新的更新)。