代码之家  ›  专栏  ›  技术社区  ›  Shawn

为Google App Engine博客应用程序映射数据:

  •  1
  • Shawn  · 技术社区  · 14 年前

    • 它不是关系数据库。
    • 默认情况下,跨存储空间进行数据复制。
    • 不能在数据存储级别“联接”表。
    • 针对不频繁写入的读取进行了优化。

    下面是博客系统的数据模型:

    博客有一组相对已知的“列”:id、日期、作者、内容、评级、标记。数据存储允许根据需要添加其他列,但众所周知,动态添加其他列的可能性很小,因为它需要更多的后端专用编码以及对整个博客系统的更多考虑。

    博客没有的是一定数量的评论和标签。在传统的关系数据库结构中,这些数据库是通过连接映射的。由于这些在GAE中是不可能的,因此我考虑实施以下内容:

    • 评论->文章编号、作者、日期、内容、评分
    • 标签->标签,物品ID

    例子:

    文章- 1-管理员-01/01/2011-问题?-答案-5-问题,答案,推测,沉思

    评论- 1-约翰·史密斯-01/02/2011-愚蠢,愚蠢,愚蠢..-0 1-无名氏-01/03/2011-聪明,聪明,聪明..-5

    标签- 问题-1,2 答案-1 推测-1

    这就是我的理由。当你浏览一个博客时,你的浏览方式是:日期、作者、标签/主题、评分、评论等。日期、作者和评分是静态的,因此可以很容易地与相关文章一起存放在一个表中。

    同样的事情也会发生在评论上。联接将通过传递检索到的项目ID的额外方法调用在应用程序级别发生。

    现在,为什么要在应用程序级别处理连接?我曾考虑过在每篇文章中插入所有内容,在创建时添加评论,但考虑到一旦一个博客被放入数千篇文章中,排序和搜索的时间复杂性,以及回报大小的限制,不知道文章/评论可能会有多大。我还没有测试过,但考虑到时间复杂性,我开始得出结论,在尝试通过标记搜索这些文章时,文章检索将线性增长到文章数。我在这方面是正确的吗?这种方法是克服这个问题的一种方法吗?另外,一般来说,这个数据模型看起来像是在GAE中有效实现持久数据存储的一种方法吗?

    谢谢, 试着把我的头绕过去。。。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Nick Johnson    14 年前

    你的方法听起来很合理。通过标签检索文章最容易实现的方法是在文章上拥有标签的ListProperty,并对其进行过滤—这将花费与返回结果数量成比例的时间,不是数据存储中的数字-你应该保留一组单独的“标记”实体,这样你就可以单独列出所有正在使用的标记。

    你可以看看我的 series of posts 在appengine上编写博客系统。