MongoDB,这个深层嵌套的数据模型好吗?

时间:2014-09-22 10:07:14

标签: mongodb schema

我是MongoDB的新手。我有两个集合,StoriesUsers。除了object_id之外,Stories只包含两个键,标题和url。对于Users集合,我有以下架构,在此显示为python dictionary / json。

users = {
    "username": {
        "stories_liked": [], # array of story object_id's
        "stories_disliked": [], # array of story object_id's
        "bag_of_words": {
            "word1": {"pos": 0,"neg":0},
            "word2": {"pos": 0,"neg":0},
            # hundreds of thousands of words...
         }
    }
}

虽然我知道这里有重复的很多。我用这种方式设计了原子性和快速查找。我想知道不同的东西是否会更好。

2 个答案:

答案 0 :(得分:0)

这里到底有重复吗?架构的好坏取决于您将如何使用它。如果您不提供修改/使用它,那么数据几乎没用。

因此,如果您只存储数据然后只检索它,那么您的架构可能会很好。另一方面,如果您要以多种方式修改元素(添加/删除用户喜欢/不喜欢的故事,修改单词包),您的架构会变得非常糟糕。如果你有一些(甚至更多的)超级活跃用户会开始喜欢/不喜欢几乎所有的东西,也是如此。

不太相关,但如果你谈到mongo,没有必要编写python字典 - 你可以发一个json。

答案 1 :(得分:0)

我认为模型没问题。

首先,它没有深度嵌套。只有4层

其次,你似乎在故事和用户,文字和用户之间有多对多的关系。而且,你需要在“单词”上快速查找和原子性。使用这种结构似乎是合理的。

U可以使用以下结构作为替代:

"username": {
    "stories_liked": [], # array of story object_id's
    "stories_disliked": [], # array of story object_id's
    "POS":{word1 : 3, word2 : 4, ...} # hundreds of thousands of words...
    "NEG":{word1 : 5, word2 : 6, ...} # hundreds of thousands of words...
}

这会更改某些查询和索引的性能。待测试。无论如何,如果你需要插入和更新的原子性,你应该使用嵌入式模型,这就是你现在正在做的事情。