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

rod*_*ira 7 google-app-engine data-modeling nosql google-cloud-datastore

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

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

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

class Comment {
    User[] likes;
    User[] hates;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

rya*_*234 7

可能答案:

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

您似乎已经通过建议您在UI中延迟加载评论来回答这个问题.我知道像Mongo和CouchDB这样的文档数据库可以让你选择在数据库出来时分页数据.像"限制"和"跳过"之类的东西.

数百条评论不应该太难存储,我不会想象它们在查询中会很慢.

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

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

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

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

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

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

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

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

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

(关于你的模型唯一可能令人恐惧的注意事项是分裂实体.永远记住,如果你把事情分开 - 你在传统的RDMS中的方式 - 你将不得不在以后加入它们!这对NoSQL来说非常困难.)