我想在我的应用程序中记录用户活动,以便向用户展示以及进行管理。我的客户是公司,因此我可以在三个层次上介绍活动:
为了进行日志记录,我将创建一个模型来存储日志条目。我看到了几种方法。
首先,我可以将每个记录的活动存储在其自己的实体中,然后根据需要进行查询:
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
这三个选项的功能/性能折衷是什么?我知道,如果频繁进行看跌交易,第二和第三种选择会存在潜在的争用问题,但是为了讨论起见,我们假设这不是问题。
对于第二个和第三个选项,减少数据存储实体的总数是否有显着优势(因为它们将合并为更少的实体)?还是我应该选择第一种选择?
使用重复属性的唯一好处是可以避免最终的一致性问题:每当您阅读UserActivity或CompanyActivity实体时,您就会知道您已获得所有活动的 完整 列表。使用第一种方法时,您必须进行查询才能获得该列表,并且该列表可能会错过最近的活动,因为相应的查询索引可能尚未更新以反映它们。
UserActivity
CompanyActivity
但是,除了您提到的潜在争用问题之外,对于重复属性方法还需要考虑另一个缺点:随着越来越多的活动添加到列表中,这些实体的大小将逐渐增加,这意味着:
get()
put()
特别是第三种方法还需要一种获取每个用户活动报告的简单方法。
我坚持第一种方法,这是最灵活,可扩展的方法,缺点很小:
Activity