2014-09-22 88 views
-1

我是MongoDB的新手。我有两个系列,StoriesUsers。除了object_id之外,故事只包含两个键,标题和网址。对于Users集合,我记住了以下模式,在这里显示为Python字典/ json。MongoDB,这是深层嵌套的数据模型好吗?

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... 
     } 
    } 
} 

我意识到,虽然有重复了很多这里。我以这种方式设计了原子性和快速查找。我想知道如果不同的事情会更好。

回答

0

这里的重复究竟在哪里?你的模式的好坏取决于你将如何使用它。如果你不提供你是否要修改/使用它,那么这些数据几乎没有用处。

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

不是真正相关的,但如果你谈论mongo,没有必要写python字典 - 你可以发布一个json。

+0

重复是每个用户都有自己的单词包,这是一个包含数千个单词的字典。 我是这样设计的,因为我需要真正快速的查找 - 这个用户的这个单词的位置是什么 - 以及原子性 - 如果一个新故事被添加到stories_liked,那么这个故事的单词必须被添加到病房在同一个交易中。这是一个分类器。 – pad 2014-09-22 12:27:01

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... 
} 

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

相关问题