如何为Bigtable/Datastore(GAE)设计数据模型?
因为谷歌的应用引擎数据存储是基于Bigtable的,而我们知道这并不是一个关系型数据库,那么我们该如何为使用这种数据库系统的应用设计数据库结构/数据模型呢?
3 个回答
因为GAE是基于Django的数据管理方式,所以在Django的文档中有很多关于如何处理类似问题的信息(比如可以查看这里,往下滚动到“你的第一个模型”部分)。
简单来说,你可以把数据库模型设计成普通的对象模型,然后让GAE来处理所有对象和关系之间的映射。
你可以使用 www.web2py.com。你只需要一次性建立模型和应用程序,它不仅可以在谷歌的应用引擎(GAE)上运行,还可以和SQLite、MySQL、Postgres、Oracle、MSSQL、FireBird等数据库一起使用。
设计一个大表的结构是一个开放的过程,基本上需要你考虑以下几点:
- 你将使用的访问方式,以及每种方式的使用频率
- 你不同类型之间的关系
- 你需要哪些索引
- 你将使用的写入方式(为了有效分散负载)
GAE的数据库会自动对你的数据进行“去规范化”。也就是说,每个索引几乎都包含了一份完整的数据副本,因此每增加一个索引,就会显著增加写入所需的时间和占用的存储空间。
如果不是这样,设计一个数据库结构会变得更加复杂:你需要仔细考虑每种类型的主键,并考虑你的选择对数据存储位置的影响。例如,当你展示一篇博客文章时,可能需要显示与之相关的评论,所以每条评论的键可能会以对应文章的键开头。
但在使用数据库时,这就没那么麻烦了:你使用的查询可能看起来像“选择所有评论,条件是post_id = N。”(如果你想分页显示评论,还会有一个限制条件,可能会加上“并且comment_id大于last_comment_id”。)一旦你添加了这样的查询,数据库会为你自动生成索引,这样读取数据就会变得非常快。
需要记住的是,每增加一个索引都会产生额外的成本:最好尽量减少访问方式的数量,因为这会减少GAE构建的索引数量,从而减少你数据所需的总存储空间。
读完这个回答,我觉得有点模糊。也许一个实际的设计问题能帮助更好地理解?:-)