7

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

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

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

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

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

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

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

在 NoSQL 中对此类概念进行建模的常用方法是什么?

4

1 回答 1

7

可能的答案:

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

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

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

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

我认为最好的方法是简单地对此进行预处理。当用户对某事进行投票时,您可能会考虑进行两种操作:1)将评论的点赞数加一。2)在别处写下用户投票的记录。

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

第二个操作(存储用户所做的 - 他们喜欢/不喜欢的评论)可能会慢一些,但您可以轻松完成。

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

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

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

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

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

(关于您的模型的唯一可能令人恐惧的注意事项是拆分实体。请始终记住,如果您拆分事物 - 就像在传统 RDMS 中那样 - 您必须稍后加入它们!这对于 NoSQL 来说非常困难。)

于 2013-01-06T03:53:50.687 回答