scp*_*ntm 0 java google-app-engine google-cloud-datastore
我正处于设计非常大的系统(它是企业级销售点系统)的早期阶段.正如你们中的一些人所知,这些事情的数据模型会变得非常复杂.我想在谷歌应用引擎上运行这个东西,因为我想把更多的资源用于开发软件,而不是建立和维护基础设施.
在这种精神的情况下,我一直在GAE和DataStore上做很多阅读.我是一个古老的学校关系数据库建模师,我已经看到了几个不同的无模式数据库的概念,我想我已经找出了什么数据存储,但我想确保我有正确的
所以,如果我正确的gae是一个基于排序表的系统.所以如果我创建一个java实体
class user
public string firstname
public string lastname
Run Code Online (Sandbox Code Playgroud)
并部署它,"表"用户自动创建并运行.然后在次要版本中,如果我修改类用户
class user
public string firstname
public string lastname
public date addDate
Run Code Online (Sandbox Code Playgroud)
并部署它,"表"用户将使用新字段自动更新.
现在,在有关数据,按照我的理解,它非常类似于一些像SAP在数据其实非常有组织的,但大规模复杂系统由于体积的引用完整性是应用,而不是数据库的功能发动机.所以我会有这样的代码
class user
public long id
public string firstname
public string lastname
class phone
public string phonenumber
public user userentity
Run Code Online (Sandbox Code Playgroud)
并从头开始为用户提取电话号码而不是
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)
Run Code Online (Sandbox Code Playgroud)
我会做点什么的
select user from user where user.id = 5
then
select phone from phone where phone.userentity = user
Run Code Online (Sandbox Code Playgroud)
这将检索用户的所有电话号码.
所以,正如我所理解的那样,它在如何考虑构建数据和组织数据方面没有太大的变化,因为它是如何访问它的一个重大变化.我手动加入代码而不是自动加入数据库引擎.除此之外.我是正确还是我无能为力
根本没有桌子.如果您使某些用户只使用名字和姓氏,然后再添加addDate,那么您的原始实体仍然没有addDate属性.完全没有任何用户实体以任何方式连接.它们不在用户表中.
您可以访问您写入数据库的所有名称为"User"的对象,因为appengine保留了具有每个名称的所有对象的大,长列表(索引).因此,您放在那里的任何具有名称(种类)"用户"的对象将在此列表中获得一个条目.稍后,您可以读取该索引以获取每个对象的位置,并使用这些位置(键)来获取对象.他们不在桌子旁,他们只是漂浮在周围.其中一些有一些共同的属性,但这是巧合,而不是要求.
如果要获取具有特定名称的所有User对象(从User中选择*,其中firstname ="Joe"),则必须维护另一个较大的长键索引.此索引具有firstname属性以及每行上实体的键.稍后您可以扫描索引firstname,获取所有密钥,然后查找使用这些密钥存储的实际实体.所有这些实体都将拥有该firstname属性(因为您不会firstname在firstname索引中没有属性的情况下输入实体),但它们可能没有任何其他共同字段,因为它们不在一个强制执行任何数据结构的表中.
这些复杂性会极大地影响数据的访问方式,并且会影响事务和复杂查询等事务.你基本上是对的,你不必过多地改变你的想法,但在规划数据结构之前,你应该明白索引和事务的工作方式.这是不总是简单的,你不觉得你有开始前的额外查询有效粘性,它是相当昂贵的,以保持这些索引,所以越少,你可以更好的得到通过.
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |