java - 了解 Google App Engine 数据存储区

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

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

本着这种精神,我阅读了大量有关 GAE 和 DataStore 的文章。我是一名老派关系数据库建模者,我看到了无模式数据库的几个不同概念,我想我已经弄清楚什么是数据存储,但我想确保我的理解是正确的

所以,如果我没猜错的话,gae 是一个基于表格的系统。所以如果我创建一个java实体

class user
public string firstname
public string lastname

并部署它,“表”用户将自动创建并运行。然后在后续版本中如果我修改类用户

class user
public string firstname
public string lastname
public date addDate

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

现在,据我了解,在关联数据方面,它与 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

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

因此,据我了解,与其说是如何思考构建数据和组织数据的巨大变化,不如说是如何访问数据的巨大变化。我确实使用代码手动连接,而不是使用数据库引擎自动连接。除此之外都是一样的。我是正确的还是我一无所知。

最佳答案

实际上根本没有 table 。如果您创建一些仅具有名字和姓氏的用户,然后添加 addDate,那么您的原始实体仍然没有 addDate 属性。任何用户实体都没有以任何方式连接。它们不在用户表中。

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

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

这些复杂性极大地影响了数据的访问方式,并且确实影响了事务和复杂查询等内容。您基本上是对的,您不必改变太多想法,但在规划数据结构之前,您绝对应该了解索引和事务的工作原理。有效地处理您在开始之前没有想到的额外查询并不总是那么简单,而且维护这些索引的成本相当昂贵,因此您可以使用的索引越少越好。

关于java - 了解 Google App Engine 数据存储区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696383/

相关文章:

java - 使用 EC X509 证书加密电子邮件

java - 编写java卡小程序的有效方法是什么?

java:中断线程是绝对必要的

java - 了解 Java API 中 AppEngine 键名的最大长度

java - 在 appengine 本地开发服务器数据存储区中生成高值 ID

java - 将数据插入 google appengine 的数据库

java - 是否可以从元数据_property_解码属性类

java - 如何在 Java 中将字符串解析为 XML 文档?

javascript - 使用 Node.js 对应用程序引擎进行本地单元测试

google-app-engine - 基于 GAE/GO 标准的 MIP 求解器