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已经很好地阐述了最重要的几点。谢谢,这一切都是有意义的,并且证实了我的倾向,即使实体大小不是一个问题(我将删减日志),最终的一致性也不是一个问题(不需要最新的更新)。