1

我需要一些关于自然语言数据库的 MongoDB 模式设计的建议。

我需要为每种语言存储文本和单词,例如:

lang: {
    _id: "English",
    texts : [
        {   text : "This is a first text", 
            date : Date("2011-09-19T04:00:10.112Z"),
            tag : "test1"
        },
        {   text : "Second One", 
            date : Date("2011-09-19T04:00:10.112Z"),
            tag : "test2"
        }
    ],
    words : [
        {   
            word : "This",
        },
        {   
            word : "is",
        },
        {   
            word : "a",
        },
        {   
            word : "first",
        },
        {   
            word : "text",
        },
        {   
            word : "second",
        },
        {   
            word : "one",
        }


    ]

}

然后我需要知道用户关联的每个单词和文本。单词/文本的数量往往很大,我需要列出一种语言的所有单词以及用户与该语言相关联的所有单词。

从我的角度来看,我认为将与给定单词相关联的 user_ids 存储在该单词的数组中可能是一种好方法,例如:

lang: {
    _id: "English",
    texts : [
                ...
    ],
    words : [
        {   
            word : "This",
            users: [user1,user2,user3]
        },
        {   
            word : "is",
                users: [user1,user2]
                },
                ...
    ]
}

请记住,一个单词可以与数十万用户相关联,并且文档限制(如我所读)为 4MB,我需要:

  1. 列出给定用户和语言的所有单词

这是一个好方法吗?或者你能想到一个更好的吗?

希望这个问题足够清楚,并且有人可以帮我解决这个问题;)

谢谢你们!

4

2 回答 2

4

我认为这不是一个好方法,只是因为您提到的原因:文档大小限制。看起来你的方法,你肯定会遇到极限。我会采用更扁平的方法(这也应该使您的收藏更容易查询)。像这样的东西:

[
    {
        user: "user1",
        word: "This",
        lang: "en"
    },
    {
        user: "user1",
        word: "is",
        lang: "en"
    },
    // et cetera...
]

换句话说,通过添加文档来垂直增长,而不是通过向一个文档中添加更多数据来水平增长。您可以使用db.find( { user: "user1", lang: "en" });查询给定用户的单词。.

当然,这种方法不是“规范化”的,因此如果您担心空间问题,那么您可能希望为用户、单词和语言创建一个单独的集合,并通过 ID 在主集合中引用它们。但是由于 MongoDB 中没有连接查询,因此您必须权衡查询性能和空间效率。

于 2012-05-21T01:14:27.583 回答
1

dbaseman 是正确的(并且赞成),但还有其他几点:

首先,在撰写本文时,文档限制现在为 16MB(最大文档大小),假设您运行的是最新版本的 MongoDB。

其次,在 MongoDB 中,无限制增长通常是一个坏主意,这种类型的文档大小扩展会导致 MongoDB 如果超过当前分配给它的空间,则必须移动文档。您可以在文档的Padding Factor部分阅读更多相关信息。

这些类型的移动相对昂贵,特别是如果它们经常发生。因此,如果您确实采用这种类型的设计,会限制您的主集合(最近的 X、最流行的 X 等)中等效评论的大小(基本上限制增长),甚至可能预先填充该文档字段(基本上手动填充)超出平均大小将减少导致添加/更改的移动。

这就是 O'Reilly 的 MongoDB 开发人员提示和技巧书中提示 #6 的原因:

提示 #6:不要嵌入具有无限增长的字段

于 2012-05-21T11:33:21.247 回答