小编典典

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

python

我想在我的应用程序中记录用户活动,以便向用户展示以及进行管理。我的客户是公司,因此我可以在三个层次上介绍活动:

  1. 单个用户的活动
  2. 公司所有用户的活动
  3. 所有活动

为了进行日志记录,我将创建一个模型来存储日志条目。我看到了几种方法。

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

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

这三个选项的功能/性能折衷是什么?我知道,如果频繁进行看跌交易,第二和第三种选择会存在潜在的争用问题,但是为了讨论起见,我们假设这不是问题。

对于第二个和第三个选项,减少数据存储实体的总数是否有显着优势(因为它们将合并为更少的实体)?还是我应该选择第一种选择?


阅读 202

收藏
2021-01-20

共1个答案

小编典典

使用重复属性的唯一好处是可以避免最终的一致性问题:每当您阅读UserActivityCompanyActivity实体时,您就会知道您已获得所有活动的
完整 列表。使用第一种方法时,您必须进行查询才能获得该列表,并且该列表可能会错过最近的活动,因为相应的查询索引可能尚未更新以反映它们。

但是,除了您提到的潜在争用问题之外,对于重复属性方法还需要考虑另一个缺点:随着越来越多的活动添加到列表中,这些实体的大小将逐渐增加,这意味着:

  • 逐渐变慢get()/put()次,因此逐渐降低整体应用程序性能
  • 存在达到最大数据存储实体大小(约1MB,请参见Limits)的风险,这将需要其他逻辑才能将列表拆分到多个实体中

特别是第三种方法还需要一种获取每个用户活动报告的简单方法。

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

  • 最终的一致性问题是恕我直言,这不是一个阻碍因素(可能有减少其影响的方法)
  • 额外的存储空间(对于存储在每个Activity实体中的用户/公司ID属性,以及由于实体数量较多而导致的更大索引)是恕我直言的(很便宜)。
2021-01-20