【问题标题】:MongoDB, is this deeply nested data model good?MongoDB,这种深度嵌套的数据模型好吗?
【发布时间】:2014-11-16 06:23:22
【问题描述】:

我是 MongoDB 的新手。我有两个系列,StoriesUsers。除了 object_id 之外,Stories 仅包含两个键,一个标题和一个 url。对于Users 集合,我想到了以下架构,这里显示为python 字典/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...
         }
    }
}

我意识到这里有很多重复。我以这种方式设计它是为了实现原子性和快速查找。我想知道不同的东西会不会更好。

【问题讨论】:

    标签: mongodb schema


    【解决方案1】:

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

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

    不是很相关,但是如果你说的是 mongo,那么写 python 字典是没有意义的——你可以只发布一个 json。

    【讨论】:

    • 复制是每个用户都有自己的词袋,这是一个包含数千个词的字典。我这样设计它是因为我需要非常快速的查找——这个词对该用户的 pos 计数是多少——以及原子性——如果将新故事添加到 stories_liked 中,那么必须将故事的单词添加到病房包中在同一笔交易中。这是一个分类器。
    【解决方案2】:

    我认为模型还可以。

    首先,它没有深度嵌套。只有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...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多