当前位置: 首页 > 知识库问答 >
问题:

GAE数据存储索引与标准化

关玮
2023-03-14

给定谷歌应用引擎数据存储中的以下实体,是最好在 reportingId定义索引还是定义一个只有 personIdreportingId 字段的单独实体?
根据我了解的文档,定义索引会导致针对数据存储配额的操作计数增加。

下面是GAE Go中的实体。我的代码需要经常扫描Person实体。它需要将其扫描限制为至少有1个报告人的Person实体。我看到了2种方法。

  • 通过指定过滤器来定义reportingIds和Query的索引。
  • 当一个人有了一个新的报告人时,创建/更新角色报告人实体。
type Person struct {
    Id string //unique person id
    //many other personal details, his personal settings etc
    reportingIds []string //ids of the Person this guy manages
}

type PersonWithReporters struct {
   Id string //Person managing reportees
   reportingIds []string //ids of the Person this guy manages
}

共有2个答案

傅穆冉
2023-03-14

除非AppEngine在Go中的数据存储与它在Java或Python中的工作方式非常不同,否则您无法对数组进行本机索引-因此选项1是不可能的,选项2也是不可能的。

我建议选择三,即定义一个

type PersonWithReporters {
    Id string // concatenate(managing_Person_id, separator, reporter_Person_id) to avoid id collisions
    reportingId string; // indexed
    managingId string; // probably indexed as well
}

您将创建多个这些实体,而不是一个具有数组的实体。此外,您还可以在 reportingId 上添加索引。现在,您可以对此实体创建筛选器查询,并且应该能够检索所需的信息。

我更担心性能,而不是配额限制,它们相当高。只是实现它,看看它是如何工作的,以及配额是否是您在这里主要关心的问题。

冯开诚
2023-03-14

使用单独实体的方法有两个优点。

>

  • 正如您已经提到的,您不需要索引/查询所有Person实体。

    每当一个人得到一个新的报告人时,您将创建一个新的实体,这可能比更新一个具有许多其他属性的Person实体要便宜得多,其中一些属性可能是索引的。

    您使用单独实体的方法也不理想。当您对具有多个值的属性进行索引时,在后台,Datastore会为每个值创建一个索引条目。因此,当您将报告人员编号3添加到此实体时,您必须更新3个索引条目而不是1。

    您可以通过创建一个没有属性的报告者实体来进一步优化您的数据模型!每次添加新的报告者时,您都会创建这个报告者实体,其ID设置为报告者的ID,并使其成为代表该报告者向其报告的人的Person实体的子实体。

    现在,当您需要遍历所有有人向其报告的人时,您可以对这个Reporter实体运行一个简单的查询——无过滤器。这个查询只能设置为键(无论如何,这个实体中只有一个键,但键查询的处理方式不同——它们基本上是免费的)。

    对于此查询返回的每个实体,检索其密钥,此密钥包含一个 ID(即报告人员的 ID)和一个父密钥,其中包括此报告者向其报告的人员的 ID。

  •  类似资料:
    • 问题内容: 进行GAE / J数据存储区备份的最简单方法是什么? 看起来好像有python bulkloader.py工具可以为Python应用程序执行备份,但是我应该怎么做才能备份Java应用程序?有什么方法可以使用python工具吗? 问题答案: 可以使用python工具bulkloader.py创建GAE Java应用的数据存储备份。您只需通过在web.xml中添加以下几行来设置remote

    • 问题内容: 我是个初学者。 我想在Google App Engine上使用Go语言制作一个信息管理系统。用户将创建,编辑,删除和搜索实体。 我已经浏览了GAE网站,但是在数据存储区中找不到“部分文本搜索”。部分文本搜索,我的意思是,搜索实体包含输入的“部分文本”。 或者,您能给我个提示来制作这样的系统吗?(免费) 非常抱歉低等级的问题。 问题答案: 您无法使用数据存储区执行此操作,需要使用全文本搜

    • 如何从Android客户端上传图像到GAE(Google App Engine)数据存储? 尚未找到教程,已尝试了7天。

    • 问题内容: 缓存解决方案和索引解决方案之间的真正区别是什么?在我看来,索引解决方案实际上是具有运行搜索查询功能(例如:Elastic Search)的缓存。是否有任何真正的理由在同一项目中同时使用缓存解决方案和索引解决方案,或者索引解决方案基本上会使其他任何缓存变得多余? 示例:假设我对ElasticSearch使用NEST,它将存储并返回POCO;如果我随后查询ElasticSearch并已将P

    • 更多面试题总结请看:【面试题】技术面试题汇总 存储引擎定义 现代数据库大体可以分为三层。最上层用于连接、线程处理等;中间层提供数据库的核心功能,包括 SQL 解析、分析、优化、视图等;底层就是数据库的存储引擎,负责数据的存储与提取。 简单来说,存储引擎是为数据库提供创建、查询、更新、存储数据的软件模块。不同的存储引擎的主要区别是数据的存储方式,此外功能、特性、速度等也有所差异。 存储引擎为数据库屏

    • 我们正在尝试为Google App Engine应用程序启用Google Cloud Datastore API,以便其他App Engine应用程序可以直接从其数据存储中获取数据。 我有一个问题配置这两个应用程序使这发生。在本页中: https://developers.google.com/datastore/docs/activate 在“Google Cloud Datastore for

    • 主要内容:1、面试题,2、面试官心里分析,3、面试题剖析1、面试题 事务的几个特点是什么? 数据库事务有哪些隔离级别? MySQL的默认隔离级别? 2、面试官心里分析 用mysql开发的三个基本面:存储引擎、索引,然后就是事务,你必须得用事务。 因为一个业务系统里,肯定要加事务保证一堆关联操作,要么一起成功要么一起失败,对不对?所以这是聊数据库必问的一个问题 最最最基本的用mysql来开发,就3点:存储引擎(了解),索引(能建索引,写的SQL都用上索引

    • ZtbCMS数据库的存储引擎 ZtbCMS所有表的存储引擎(包括创建模型)默认是: InnoDB [从v3.2.0.0] 考虑到大部分情况下: 对事务需要不高,除了支付,余额统计,收益记录等 查询远大于插入 MyISAM 本身支持FULLTEXT索引,InnoDB直到My SQL 5.6.4才支持 若需要事务需求,请自行对该表的存储引擎改为 InnoDB 阅读参考 MySQL 5.5手册 - 存储