了解Google App Engine数据存储区

时间:2011-04-17 20:55:45

标签: java google-app-engine google-cloud-datastore

我正处于设计非常大的系统(它是企业级销售点系统)的早期阶段。正如你们中的一些人所知,这些事情的数据模型会变得非常复杂。我想在谷歌应用引擎上运行这个东西,因为我想把更多的资源用于开发软件,而不是建立和维护基础设施。

在这种精神方面,我一直在GAE和DataStore上做很多阅读。我是一个古老的学校关系数据库建模师,我已经看到了无模式数据库的几个不同的概念,我想我已经找出了什么数据存储,但我想确保我有正确的

所以,如果我正确的gae是一个基于排序表的系统。所以如果我创建一个java实体

class user
public string firstname
public string lastname

并部署它,“table”用户自动创建并运行。如果我修改类用户

,则在次要版本中
class user
public string firstname
public string lastname
public date addDate

并部署它,“table”用户将使用新字段自动更新。

现在,在相关数据中,据我所知,它非常类似于SAP这样的大型复杂系统,其中数据实际上非常有条理,但由于卷的参照完整性是应用程序的一个功能,不是数据库引擎。所以我会有像这样的代码

class user
public long id
public string firstname
public string lastname

class phone
public string phonenumber
public user userentity

并从头开始为用户提取电话号码而不是

select phone from phone inner join user as phone.userentity = user where user.id = 5
(lay off i know the syntax is incorrect but you get the point) 

我会做类似

的事情
select user from user where user.id = 5
then
select phone from phone where phone.userentity = user

这将检索用户的所有电话号码。

所以,正如我所理解的那样,它在如何考虑构建数据和组织数据方面没有太大的变化,因为它是如何访问它的一个重大变化。我手动加入代码而不是自动加入数据库引擎。除此之外。我是对的还是我一无所知。

2 个答案:

答案 0 :(得分:5)

根本没有桌子。如果您使某些用户只使用名字和姓氏,然后再添加addDate,那么您的原始实体仍然没有addDate属性。完全没有任何用户实体以任何方式连接。它们不在用户表中。

您可以访问您写入数据库的所有名称为“User”的对象,因为appengine会保留具有每个名称的所有对象的大,长列表(索引)。因此,您放在那里的任何具有名称(种类)“用户”的对象将在此列表中获得一个条目。稍后,您可以读取该索引以获取每个对象的位置,并使用这些位置(键)来获取对象。他们不在桌子旁,他们只是漂浮在周围。其中一些有一些共同的属性,但这是巧合,而不是要求。

如果要获取具有特定名称的所有User对象(从User中选择*,其中firstname =“Joe”),则必须维护另一个较大的长键索引。此索引具有firstname属性以及每行上的实体的键。稍后您可以扫描某个firstname的索引,获取所有密钥,然后查找使用这些密钥存储的实际实体。所有这些实体都将具有firstname属性(因为您不会在firstname索引上输入没有firstname属性的实体),但它们可能没有任何其他共同字段,因为它们不在一个强制执行任何数据结构的表中。

这些复杂性会极大地影响数据的访问方式,并且会影响事务和复杂查询等事务。你基本上是对的,你不必过多地改变你的想法,但在规划数据结构之前,你应该明白索引和事务的工作方式。 总是很容易有效地处理您在开始之前没有想到的额外查询,维护这些索引的成本非常高,因此越少越好。

答案 1 :(得分:3)

Google数据存储区的精彩介绍由客观框架的创建者撰写:Fundamental Concepts of the Datastore