日期:2014-05-16  浏览次数:20426 次

给MongoDB开发者的50条建议(二)

#第二条 要使你的数据面向未来,那么就对数据进行规范化(Normalize if you need to future-proof data)

?

“面向未来的规范的数据”就是指在未来,不同的应用程序能够以各种不同的方式对规范化过的数据进行查询。

这就假定了你有一些数据集合是要被许多应用程序年复一年的使用,有些数据集合是像这样的,但大多数人的数据是不断发展变化的,一些旧的数据会被更新或是丢弃。大多数的人都希望自己现在的查询能够尽可能的快速高效,但是如果他们在将来改变这些查询,他们将要为新的查询去优化数据库。

?

另外,如果一个应用很成功,其数据集往往变得非常特定于应用程序。这并不是说该数据集不能被应用于多个应用程序,通常你会考虑在其上做“荟萃分析”(meta-analysis)。但是这很难等同于“面向未来”所追求的“在10年内人们可以做任何他们想要的查询”。

?

?

#我的评注:

?

? 其实这里的“规范化(Normalization)”并不是指关系型数据库中的"规范化"。这里的规范化其实指的是“reference objects in a different collection”。就是使用我们“#第一条“中的引用。

?

读完这条我有些云里雾里,所以查阅了一些资料,StackOverflow上有一则关于MongoDB Normalization的问答让我高清了一些问题:

http://stackoverflow.com/questions/5841681/mongodb-normalization-foreign-key-and-joining-question

?

1 楼 heywap 2011-11-07  
感谢楼主的分享。

我有一个子文档嵌套深度为三的对象。

类似这样

[
{
    "_id": 'objectid',
    "month": '2011-11',
    "st": '站号',
    "data": [
    {
        "_id": 'objectid',
        "day": '2011-11-7',
        "data": [
        {
            "_id": 'objectid',
            "datetime": '2011-11-1 15:00:00',
            "a01": [0.5, 0.6, 0.4, 0.9],
            "p02": [150, 260, 148, 894]
        }
       ]
    }
   ]
}
];

不知道这样的嵌套级别对查询有无影响 。

另外有一点也很矛盾。
我的最终的数据要存储在最深的一级中,即包含a01的这个文档中.
每次保存前都要依次判断datetime中的月份文档是否存在(那month的那个文档),再判断
日期文档是否存在(即包含day的那个文档),如果都存在则保存,只要任意一个不存在,则要先添加父文档。

不知道博主有什么看法??谢谢。
2 楼 洛克刘 2011-11-07  
heywap 写道
感谢楼主的分享。

我有一个子文档嵌套深度为三的对象。

类似这样

[
{
    "_id": 'objectid',
    "month": '2011-11',
    "st": '站号',
    "data": [
    {
        "_id": 'objectid',
        "day": '2011-11-7',
        "data": [
        {
            "_id": 'objectid',
            "datetime": '2011-11-1 15:00:00',
            "a01": [0.5, 0.6, 0.4, 0.9],
            "p02": [150, 260, 148, 894]
        }
       ]
    }
   ]
}
];

不知道这样的嵌套级别对查询有无影响 。

另外有一点也很矛盾。
我的最终的数据要存储在最深的一级中,即包含a01的这个文档中.
每次保存前都要依次判断datetime中的月份文档是否存在(那month的那个文档),再判断
日期文档是否存在(即包含day的那个文档),如果都存在则保存,只要任意一个不存在,则要先添加父文档。

不知道博主有什么看法??谢谢。


首先,对于第一个疑问
引用
不知道这样的嵌套级别对查询有无影响 。

多层嵌套对查询没有什么影响。MongoDB是支持多层文档嵌套的。

MongDB中文档嵌套的实质是对象数组。你把你要嵌套的子文档应该看作