绝大多数的Web应用在处理一个为了以后的请求作检索用的请求时,需要存储信息。一个小网站的典型安排就是包含一个数据库服务器,然后一个或多个Web服务器连接到这个数据库进行数据的存储与获取。使用一个中央数据库服务器使得数据有一个正规表示(canonical representation)变得容易。所以多个用户访问多个Web服务器看到的是相同的最新的数据。但是一旦中央服务器达到了它的同时连接量时,很难扩展。
在这过去二十年里,用于Web应用的最流行的存储系统就是关系型数据库。用行列构成表实现空间上的高效简洁(space efficiency and concision)。使用原始计算能力(raw computing power)和索引执行查询。Join查询可以将多个相关的记录作为一个查询单元。其他的数据存储系统包括层次数据存储(hierarchical datastores,如:文件系统,XML数据库)和对象数据库。每种数据库都有有缺点,哪一种是最适合于应用的,这取决于应用数据的类型和访问方式。每一种数据库有它自己的技术来跨越一个服务器。(grow past the first server)
Google App Engine的数据库系统极其类似于一个对象数据库。它不是一个Join查询的关系型数据库。如果你来自使用关系型数据库的Web应用,你很有可能需要改变原有的思考应用数据的方式。使用运行时,App Engine数据存储的设计是一个抽象。允许App Engine处理分发和扩展的的细节,而你的应用可以关注于其他方面。
实体和属性(Entities and Properties)
App Engine应用把它的数据存存存储为一个或多个datastore实体(datastore entity)。一个实体有一个或多个属性,每个属性有一个名字和一个值,值是几种原始值类型的一种。每个实体属于一个种类(each entity is of a named kind)。种类将实体进行分类以便查询。
初看,这就像是一个关系型数据库:种类的实体就像表的行,属性就像列(字段)。然而,在实体和行之间有两个主要的不同点。一是,给定的种类的一个实体和相同种类的其他实体不一定有相同的属性。二是,两个实体的相同属性的值可以有不同的类型。在这方面,datastore实体是无模式的。正如将会看到的,这种设计提供了强大的灵活性的同时也面临着维护的挑战。
实体和表的行还有一个不同点是实体的属性可以有多个值。这个特性有一点诡异但是一旦理解了相当有用。
每一个实体都有一个唯一的键。由应用提供或App Engine生成。和关系型数据库不同,这个键不是一个字段或属性,而是实体的一个独立部分。使用key,你可以快速获取一个实体,可以用key值执行查询。
在实体创建之后它的key是不可以改变的。种类也不能改变。App Engine使用实体的种类和key来决定这个实体被存储在一个大型服务器集的什么位置。然而key和种类却不能确保两个实体保存在同一个服务器上。
查询和索引(Queries and indexes)
一个datastore查询返回零个或多个同一个种类的实体。查询可以返回实体的key。查询可以根据条件过滤出属性值满足的实体,也可以返回根据属性值排过序的实体。查询还可以使用key过滤排序。
在一个典型的关系型数据库中,查询是根据表结构进行设计和执行的。表又是由开发人员设计好存储的。开发人员可以让数据库产生和维护确定列上的索引来加快某些查询。
App Engine却不相同。