我是MongoDB的新手。我有两个集合,Stories
和Users
。除了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...
}
}
}
虽然我知道这里有重复的很多。我用这种方式设计了原子性和快速查找。我想知道不同的东西是否会更好。
答案 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...
}
这会更改某些查询和索引的性能。待测试。无论如何,如果你需要插入和更新的原子性,你应该使用嵌入式模型,这就是你现在正在做的事情。