当前位置: 首页 > 面试题库 >

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

华景焕
2023-03-14
问题内容

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

  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

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

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


问题答案:

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

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

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

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

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

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


 类似资料:
  • 您如何让新启动的活动在Android TalkBack中宣布自己? 我能找到的所有文档都只提到视图,而不是活动,这些视图只有在触摸时才宣布自己。我需要的是,在更改“活动”时,使用一些语音文本来告诉用户他们在应用层次结构中的位置。现在,在每次活动更改时,TalkBack每次都只声明应用程序名称,这没有用。 我尝试过将 contentDescription 添加到活动布局 XML 中的根布局元素,但这

  • 如果您在开发共享库的公司工作,或者您在开源或商业库中工作,则可能需要开发自己的自动配置。 自动配置类可以捆绑在外部jar中,仍然可以通过Spring Boot获取。 自动配置可以与“启动器”相关联,该“启动器”提供自动配置代码以及您将使用它的典型库。 我们首先介绍了构建自己的自动配置需要了解的内容,然后我们将继续介绍创建自定义启动器所需的典型步骤。 可以使用演示项目来展示如何逐步创建启动器。 4.

  • 我将遵循“Pro Spring Boot”一书中的“扩展Spring Boot应用程序”一章。在本章中,作者首先解释如何创建自己的spring boot starter-。源代码可以在这里找到。我对maven和spring都是新手。 如果我使用与编写器1.3.3相同的Spring启动版本,它可以正常工作。释放。但是它不适用于当前版本的Spring引导,我想让它适用于当前版本。 基本文件夹结构: 当

  • 好吧,所以我试图在Java创建自己的LinkedList类(带有泛型类型),但是遇到了一些问题。我创建了一个LinkedListNode类,它基本上设置并获取next和right指针以及节点的键。我的LinkedList类代码发布在下面,如果您编译并运行,您会发现它没有按照应该的方式设置列表。此刻,我正在尝试在节点x之后插入节点y,但我的打印输出看起来像: 键:5-上一键:6-下一键:6键:6-上

  • 本文向大家介绍ActionScript 3 添加自己的活动,包括了ActionScript 3 添加自己的活动的使用技巧和注意事项,需要的朋友参考一下 示例 您可以通过扩展Event类来创建自己的事件并进行调度。 然后,您可以使用调度和收听它EventDispatcher。请注意,大多数Flash对象是事件分派器。 请注意,clone如果要重新分派事件,则需要使用该方法。

  • 如果你只需要掌控一个应用的全部的消息和触发的事件,那么使用默认的**/**命名空间即可。如果你想要利用第三方代码,或者分享你的代码给别人,http://socket.io提供了一种命名一个socket的途径。 使用多路由控制一条单一的连接是有好处的。比如下方的示例代码,客户端发起两个WebSocket连接,而服务器端使用多路由技术仅仅只需要建立一个连接。 服务器端(app.js) var io =