在GAE/P中创建自己的活动记录

gae*_*fan 5 python google-app-engine

我想在我的应用程序中记录用户活动,以便向用户演示,也可以用于管理目的.我的客户是公司,所以我可能会在三个级别上展示活动:

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

要进行日志记录,我将创建一个模型来存储日志条目.我看到了一些这样做的方法.

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

class Activity(ndb.Model):
    activity = ndb.StringProperty()
    user_id = ndb.StringProperty()
    company_id = ndb.StringProperty()
Run Code Online (Sandbox Code Playgroud)

其次,我可以将用户的所有活动存储在单个实体中:

class UserActivity(ndb.Model):
    activity = ndb.StringProperty(repeated=True) # Note this is now a list
    company_id = ndb.StringProperty()
Run Code Online (Sandbox Code Playgroud)

第三,我可以将公司的所有活动存储在一个实体中:

class CompanyActivity(ndb.Model):
    activity = ndb.StringProperty(repeated=True) # Would store user_id here somehow
Run Code Online (Sandbox Code Playgroud)

这三个选项中的功能/性能权衡是什么?我知道如果频繁出现交易,第二和第三选项存在潜在的争用问题,但我们假设这不是一个问题,为了讨论.

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

Dan*_*scu 3

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

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

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

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

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