Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解谷歌应用引擎数据存储_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Java 了解谷歌应用引擎数据存储

Java 了解谷歌应用引擎数据存储,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我正在设计一个非常大的系统,它是一个企业级的销售点系统。正如你们中的一些人所知,这些东西的数据模型可能变得非常复杂。我想在google app engine上运行这个东西,因为我想把更多的资源用于开发软件,而不是构建和维护基础设施 本着这种精神,我一直在大量阅读GAE和数据存储。我是一个老派的关系数据库建模者,我看到了关于什么是无模式数据库的几个不同概念,我想我已经弄明白了什么是数据存储,但我想确保我做对了 所以,如果我是对的,gae是一个基于排序表的系统。所以如果我创建一个java实体 cla

我正在设计一个非常大的系统,它是一个企业级的销售点系统。正如你们中的一些人所知,这些东西的数据模型可能变得非常复杂。我想在google app engine上运行这个东西,因为我想把更多的资源用于开发软件,而不是构建和维护基础设施

本着这种精神,我一直在大量阅读GAE和数据存储。我是一个老派的关系数据库建模者,我看到了关于什么是无模式数据库的几个不同概念,我想我已经弄明白了什么是数据存储,但我想确保我做对了

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

class user
public string firstname
public string lastname
并部署它,表用户将自动创建并运行。然后在后续版本中,如果我修改类user

class user
public string firstname
public string lastname
public date addDate
并部署它,表用户将自动使用新字段更新

现在,在关联数据方面,据我所知,它与一些大型复杂系统(如SAP)非常相似,在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
这将检索用户的所有电话号码


因此,据我所知,与其说它是如何思考数据结构和组织数据的重大变化,不如说它是如何访问数据的重大变化。我用代码手动连接,而不是用数据库引擎自动连接。除此之外,一切都一样。我是对的还是一无所知。

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

您可以访问写入数据库的所有名为User的对象,因为appengine保留了所有具有每个名称的对象的大而长的列表索引。因此,您放入其中的任何名为kind User的对象都将在该列表中获得一个条目。稍后,您可以读取该索引以获取每个对象的位置,并使用这些位置键获取对象。它们不在桌子上,它们只是漂浮着。它们中的一些有一些共同的属性,但这是巧合,而不是要求

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


这些复杂性极大地影响了数据的访问方式,并真正影响了事务和复杂查询等事项。您基本上是对的,您不必太多地改变您的想法,但您应该在规划数据结构之前明确了解索引和事务是如何工作的。有效地添加在开始之前没有想到的额外查询并不总是简单的,而且维护这些索引非常昂贵,所以越少越好。

objectify framework的创建者编写了谷歌数据存储的精彩介绍:

嗯。。。我的客户对将他们的销售数据存储在其他公司的数据库中持保留态度。那么第二部分呢,层次数据?如果我理解你说的是正确的,我会按照上面描述的方式访问层次数据。获取相关用户的密钥,然后查询该密钥的电话号码实体。正确吗?是的,这是正确的,尽管您应该直接转到键,而不是在索引中查找它然后获取它的查询。您还可以创建层次键,该键直接指向保存查找的父对象,但您需要了解实体组及其限制才能有效地使用它们。