我们如何设计Bigtable / Datastore(GAE)的数据模型?
由于Google App Engine数据存储区基于Bigtable,并且我们知道它不是关系数据库,因此我们如何为使用这种数据库系统的应用程序设计数据库架构/数据模型?
解决方案
回答
由于GAE建立在Django中数据管理方式的基础上,因此在Django文档中有很多有关如何解决类似问题的信息(例如,请参见此处,向下滚动到"第一个模型")。
简而言之,我们将db模型设计为常规对象模型,并让GAE整理出所有对象关系映射。
回答
设计bigtable模式是一个开放的过程,基本上需要我们考虑以下事项:
- 我们将使用的访问模式以及使用频率
- 类型之间的关系
- 我们将需要什么索引
- 我们将使用的写入模式(以有效分散负载)
GAE的数据存储区会自动对数据进行非规范化处理。也就是说,每个索引都包含(大部分)数据的完整副本,因此每个索引都会显着增加执行写入所花费的时间以及所使用的存储空间。
如果不是这种情况,那么设计数据存储架构将需要做更多的工作:我们将必须仔细考虑每种类型的主键,并考虑决策对数据局部性的影响。例如,在呈现博客帖子时,我们可能需要显示注释以使其与之一同显示,因此每个注释的键可能都以相关帖子的键开头。
使用数据存储区,这没什么大不了的:我们使用的查询将看起来像" Select * FROM Comment WHERE post_id = N"。 (如果要分页注释,我们还将有一个限制子句,可能的后缀为" AND comment_id> last_comment_id"。)添加此类查询后,数据存储区将为我们建立索引,并且读入神奇的快。
需要记住的是,每个额外的索引都会产生一些额外的开销:最好使用尽可能少的访问模式,因为这会减少GAE构造的索引数量,从而减少数据所需的总存储量。
仔细阅读这个答案,我发现它有点模糊。也许动手设计的问题会有助于缩小范围? :-)
回答
我们可以使用www.web2py.com。我们只需构建模型和应用程序一次,即可在GAE上运行,也可以在SQLite,MySQL,Posgres,Oracle,MSSQL,FireBird上运行