Google App Engine数据存储区中的高效NoSQL建模

时间:2013-01-06 01:53:31

标签: google-app-engine nosql google-cloud-datastore data-modeling

我正在Google App Engine上编写应用程序,以帮助我更好地学习它。我将数据保存在数据存储区中。

应用程序是类似于StackOverflow的模型:你有一个Story实体,它有一组Comment实体,而这些实体又可以被很多用户所喜欢/讨厌。我现在建模的方式如下:

class Story {
    Comment[] comments;
    ...
}

class Comment {
    User[] likes;
    User[] hates;
    ...
}

因此,当您加载给定的故事时,您可以列出所有评论,以及每条评论的喜欢和讨厌的百分比。您还可以跟踪给定用户是否已投票评论。

我假设我可以延迟加载Comment实体中的所有实际用户,但即便如此,我还是认为有更好的方法可以做到这一点。

如何处理一个包含数百条评论的故事,每条评论都有数十万票?

在NoSQL中建模这样一个概念的常用方法是什么?

1 个答案:

答案 0 :(得分:7)

可能的答案:

(1)这将如何处理数百条评论?

您似乎已经通过建议您在UI中延迟加载评论来回答这个问题。我知道像Mongo和CouchDB这样的文档数据库为您提供了从数据库中提取数据的选项。类似于"限制"和"跳过"。

数以百计的评论不应该太难存储,我不会想象他们在查询中会很慢。

(2)如何处理数十万票?

我认为最好的方法是简单地预处理这个。当用户对某些内容进行投票时,您可能会考虑进行两项操作:1)将评论增加为一个。 2)在其他地方写下用户投票的记录。

第一步将非常快速和简单,它会立即向用户显示喜欢的总数。

第二个操作(存储用户做了什么 - 他们喜欢/不喜欢哪个评论)可能会慢一点,但你可以轻松地做到。

重要的是要记住,使用NoSQL,我们并不担心数据的规范化,因此冗余信息是可以的!

(3)对这些概念建模的常用方法是什么?

就像我在(2)中提到的那样 - 根据我的经验 - 模型的一个好方法是快速增加项目并存储冗余信息。

在各种文档中多次存储数据特别有用,因为加入像Mongo和Couch这样的东西非常很难做到。最好将该信息存储在需要它的实体旁边。

NoSQL数据库的另一个品质是允许它们不一致。可以在评论部分中将评论/ /不喜欢计数作为一个数字,并在查看用户喜欢/不喜欢的内容时使用不同的编号。

(关于你的模型的唯一可能是可怕的是分裂实体。永远记住,如果你把事情分开 - 就像你在传统的RDMS中那样 - 你以后必须加入他们!这可能非常艰难使用NoSQL。)