为什么实体需要Appengine数据存储区中的密钥

时间:2014-02-12 00:31:30

标签: google-app-engine app-engine-ndb

appengine数据存储区中键的用法是什么:我是Appengine的新手,任何关于它的信息都会很棒。

2 个答案:

答案 0 :(得分:4)

比较

为了简单起见,我们假设MySQL将表的所有行存储在一个文件中。这样,它可以通过扫描该文件找到所有行。

App Engine的数据存储区(BigTable)没有表格的概念。每个实体(MySQL中的〜行)都是单独存储的。 [它也可以有一个单独的结构(〜列)。] 因为实体没有以任何方式连接,所以没有“默认”方法来完成所有这些。每个实体都需要一个ID,必须编入索引

密钥结构

密钥包括:

  • App ID(MySQL中最接近的是数据库)。
  • Kind(MySQL中最接近的是)。
  • ID或名称(MySQL中最接近的是主键)。
  • (可选)父键(所有上述另一个实体)。 (为简单起见,省略了详细信息。)

请注意,最接近的是概念相似性从技术上讲,这些事情无关。在MySQL中,数据库和表格代表实际的存储结构。在BigTable中,它们只是ID,存储实际上是平的,即每个实体本质上都是一个文件。

换句话说,以身份身份a keyan entity,因为the database + table + primary key在MySQL表中是a row

Key的职责

实体的关键:

  • 说明该实体属于哪个应用程序。
  • 它是什么类(类,表)。
  • 通过上述的数字键ID或文本键名称,唯一标识该实体。
  • (可选)实体的父实体是什么。 (为简单起见,省略了详细信息。)

用法

为了能够检索所有类型的实体,App Engine会自动构建索引。这意味着App Engine会维护您所有实体的列表。更具体地说,它维护了实体密钥的列表 可以定义复杂索引以在多个属性(〜列)上运行查询。

与MySQL相比,每个BigTable查询都需要一个索引。无论何时运行查询,都会扫描相应的索引以查找满足查询条件的实体,然后按键检索各个实体。

常见的高级用法是识别URL中的实体,因为每个键都可以表示为URL安全字符串。当在URL中传递实体的密钥时,可以明确地检索实体,因为密钥唯一地标识它。

此外,通过其键检索实体是非​​常一致的,而不是对索引的查询,这意味着当实体被其键检索时,它保证是最新版本。

提示

  • 存储在BigTable中的每个实体都有一个密钥。可以在应用程序中以编程方式创建此类密钥,并为其指定任意密钥。如果不是,则在存储实体时将透明地分配数字ID。
  • 存储实体后,其密钥可能不会更改。
  • 可选的父组件可用于定义实体的层次结构,但它真正重要的是事务和强一致性。
    • 分享父母的实体据说属于同一实体组。
    • 组内的查询非常一致。
  • 重申一下,通过其密钥检索实体或通过父密钥查询索引是非常一致的。以其他方式检索实体(例如,通过对属性的查询)最终是一致的。

词汇表

  • 实体 - 单个键值文档。
  • 最终一致性 - 检索实体(通常是其中一些实体)而不保证复制已完成,这可能导致某些实体为旧版本而某些实体丢失,因为它们尚未从服务器中获取它们存放在。
  • 密钥 - 实体的ID。
  • Kind - 一类实体的任意文本名称,例如User或Article。
  • 密钥ID - 密钥的数字标识符。通常会自动分配。
  • 密钥名称 - 密钥的文本标识符。
  • 强一致性 - 以检索其最新版本的方式检索实体。

(我在示例中故意使用MySQL,因为我对它比对任何其他关系数据库更熟悉。)

答案 1 :(得分:0)

请阅读https://developers.google.com/appengine/docs/java/datastore/#Java_Entities ...您可能要删除自己的问题,并在完成本文档部分的研究后再次提问。

(这是为了帮助你,而不是抱怨。)