适用于 Google App Engine 数据存储区和其他 NoSQL 数据库的无模式设计指南

Posted

技术标签:

【中文标题】适用于 Google App Engine 数据存储区和其他 NoSQL 数据库的无模式设计指南【英文标题】:Schema-less design guidelines for Google App Engine Datastore and other NoSQL DBs 【发布时间】:2011-02-08 19:58:05 【问题描述】:

我相信很多其他人都是关系数据库背景,我正在寻找一些可靠的指南来在 Google App Engine 上设置/设计我的数据存储。人们有什么好的经验法则来设置这些无模式的数据存储吗?我了解一些基础知识,例如非规范化,因为您不能进行联接,但我想知道人们还有什么其他建议。

我正在处理的一个特别简单的示例涉及存储搜索及其结果。例如,我使用 Python 在我的 Google App Engine 应用中定义了以下两个模型:

class Search(db.Model):
    who = db.StringProperty()
    what = db.StringProperty()
    where = db.StringProperty()

    createDate = db.DateTimeProperty(auto_now_add=True)

class SearchResult(db.Model):
    title = db.StringProperty()
    content = db.StringProperty()

    who = db.StringProperty()
    what = db.StringProperty()
    where = db.StringProperty()

    createDate = db.DateTimeProperty(auto_now_add=True)

为了非规范化,我在模型之间复制了一堆属性,因为我不能将 SearchSearchResult 连接在一起。这有意义吗?或者我应该将搜索 ID 存储在 SearchResult 模型中,并在我从数据存储中检索它们时有效地“加入”代码中的两个模型?请记住,这是一个简单的示例。两种模型都会有更多的属性,而我现在处理这个的方式,我会将我放在搜索模型中的任何属性都放在 SearchResult 模型中。

【问题讨论】:

【参考方案1】:

如果SearchResultSearch 之间的属性始终相同,请不要重复这些属性。如果SearchResult 应该引用Search,请保持ReferenceProperty 指向搜索。这基本上将相关的SearchKey存储在模型中。

class SearchResult(db.Model):
    search = db.ReferenceProperty(Search, required=True)
    # other stuff...

我还强烈建议您观看一些 App Engine videos from last year's Google I/O(以及来自 2008),尤其是 Brett Slatkin 的 this one,以及 this one 瑞安·巴雷特。如果你有时间,它们都是非常有用的视频,但我发现这两个特别棒。

【讨论】:

以上是关于适用于 Google App Engine 数据存储区和其他 NoSQL 数据库的无模式设计指南的主要内容,如果未能解决你的问题,请参考以下文章

Mux 和 http.HandleFunc 甚至适用于 Google App Engine 上的 helloworld 端点

如何在 Google App Engine 上设置暂存环境

Google App Engine - 多个域

/user/.* 正则表达式的 Google App Engine app.yaml 配置

使用 Python 在 Google App Engine 上提供 Gtalk 服务

google-app-engine:google api python客户端hello world中的ImportError httplib2