我正处于设计非常大的系统(它是企业级销售点系统)的早期阶段。正如你们中的一些人所知,这些事情的数据模型会变得非常复杂。我想在谷歌应用引擎上运行这个东西,因为我想把更多的资源用于开发软件,而不是建立和维护基础设施。
在这种精神方面,我一直在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
这将检索用户的所有电话号码。
所以,正如我所理解的那样,它在如何考虑构建数据和组织数据方面没有太大的变化,因为它是如何访问它的一个重大变化。我手动加入代码而不是自动加入数据库引擎。除此之外。我是对的还是我一无所知。
答案 0 :(得分:5)
根本没有桌子。如果您使某些用户只使用名字和姓氏,然后再添加addDate
,那么您的原始实体仍然没有addDate
属性。完全没有任何用户实体以任何方式连接。它们不在用户表中。
您可以访问您写入数据库的所有名称为“User”的对象,因为appengine会保留具有每个名称的所有对象的大,长列表(索引)。因此,您放在那里的任何具有名称(种类)“用户”的对象将在此列表中获得一个条目。稍后,您可以读取该索引以获取每个对象的位置,并使用这些位置(键)来获取对象。他们不在桌子旁,他们只是漂浮在周围。其中一些有一些共同的属性,但这是巧合,而不是要求。
如果要获取具有特定名称的所有User对象(从User中选择*,其中firstname =“Joe”),则必须维护另一个较大的长键索引。此索引具有firstname
属性以及每行上的实体的键。稍后您可以扫描某个firstname
的索引,获取所有密钥,然后查找使用这些密钥存储的实际实体。所有这些实体都将具有firstname
属性(因为您不会在firstname
索引上输入没有firstname
属性的实体),但它们可能没有任何其他共同字段,因为它们不在一个强制执行任何数据结构的表中。
这些复杂性会极大地影响数据的访问方式,并且会影响事务和复杂查询等事务。你基本上是对的,你不必过多地改变你的想法,但在规划数据结构之前,你应该明白索引和事务的工作方式。 不总是很容易有效地处理您在开始之前没有想到的额外查询,维护这些索引的成本非常高,因此越少越好。
答案 1 :(得分:3)
Google数据存储区的精彩介绍由客观框架的创建者撰写:Fundamental Concepts of the Datastore