`
洛克刘
  • 浏览: 5832 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

给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

 

4
5
分享到:
评论
3 楼 jonerxq 2012-04-13  
你好:
  我现在有一个数据结构
{
  "location": {
    "latitude": 51.0,
    "longitude": -0.1,
    "altitude": 30.1,
    "accuracy": 1200.1,
    "altitude_accuracy": 10.1,
    "address": {
      "street_number": "100",
      "street": "Amphibian Walkway",
      "postal_code": "94043",
      "city": "Mountain View",
      "county": "Mountain View County",
      "region": "California",
      "country": "United States of America",
      "country_code": "US"
    }
  }
}
你说我这样和
{
  "location": {
    "latitude": 51.0,
    "longitude": -0.1,
    "altitude": 30.1,
    "accuracy": 1200.1,
    "altitude_accuracy": 10.1,
   
      "street_number": "100",
      "street": "Amphibian Walkway",
      "postal_code": "94043",
      "city": "Mountain View",
      "county": "Mountain View County",
      "region": "California",
      "country": "United States of America",
      "country_code": "US"
    }
}
这样查询性能上是不是没什么影响,
我用上面那种方式会不会更面向对象一点
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中文档嵌套的实质是对象数组。你把你要嵌套的子文档应该看作是一个完整的对象。举个例子:一篇文章,评论,子评论,构成了三个对象。文章去嵌套评论再去嵌套子评论。
看了你的文档结构,可能是我对你的业务关系不是很清晰吧,我觉得对象关系不是很明确。

理由是:

我根据你的文档嵌套关系理解的业务是:某个站点一个月的一天中在不同的时间存在“a01"和“p02”两组数据。你现在抽象的对象是:一个站点和月份的合体对象,一个月份对象,一个时间点上的数据对象,你让这三者嵌套关系有点混乱。而且把月份单独抽出来是否合适?

我的建议:站点对象,详细信息两个对象。

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

将来抽取数据按照data的datetime抽取就好了。

我可能不是很了解你的业务,一点拙见。但是你应该将你要存取的东西抽象成对象,看看他们是否有明确的包含关系。
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的那个文档),如果都存在则保存,只要任意一个不存在,则要先添加父文档。

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

相关推荐

    《MongoDB developers》 -- 给MongoDB开发者的50条建议

    《MongoDB developers》 原书高清版本,希望你喜欢

    如何有效提升MongoDB开发者的工作效率-周李洋 E叔

    在这样的背景下,提升MongoDB开发者的效率就显得尤为关键。 周李洋(E叔)作为MongoDB Master和Teambition运维总监,以及MongoDB上海用户会联合发起人,在实际工作中积累了大量的经验和最佳实践,他指出,要提升...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    MongoDB.Bson.dll 文件是 Bson(Binary JSON)的实现,Bson 是一种二进制形式的 JSON,它提供了更高效的数据序列化和反序列化机制,是 MongoDB 内部数据交换的主要格式。 mongodb.driver.core.dll 是驱动的核心组件...

    50_tips_and_tricks_for_mongodb_developers.pdf

    在《50个技巧与窍门:MongoDB开发者指南》这本书中,作者Kristina Chodorow为MongoDB开发者提供了丰富的经验和建议。MongoDB是一种非常流行的NoSQL数据库系统,以其灵活性和高性能著称。本书分为五个章节,每个章节...

    mongoDB说明文档

    MongoDB开发者指南是一份全面的参考手册,涵盖了MongoDB的各个方面,适合所有级别的开发者阅读。 ### **32. 锁定在Mongo中的应用(Locking in Mongo)** 这部分内容进一步探讨了锁定在MongoDB中的具体实现和使用...

    MongoDB权威指南(第二版)英文

    总体来说,MongoDB权威指南第二版是一本非常实用的参考书,适合数据库管理员、开发者以及对MongoDB感兴趣的任何读者。本书不仅提供了关于MongoDB的基本知识,而且对高级主题进行了深入的讲解,覆盖了从安装、配置到...

    windows 64位mongodb安装包+java api文档

    2. **运行安装向导**:双击这个`.msi`文件,按照安装向导的步骤进行操作,选择合适的安装路径,通常建议选择默认路径,即`C:\Program Files\MongoDB`。 3. **配置环境变量**:安装完成后,你需要将MongoDB的bin目录...

    MongoDB4.2.21 Linux版本安装包

    在Linux环境下安装MongoDB 4.2.21版本,是许多系统管理员和开发者的常见任务。本篇将详细介绍在Linux上安装MongoDB 4.2.21的步骤,以及相关的知识点。 首先,我们需要了解MongoDB的体系结构。MongoDB由以下几个核心...

    windows mongodb 32位

    MongoDB是一款开源、高性能、无模式的文档型数据库,广泛应用于大数据存储、实时分析和现代应用...然而,对于大型、内存密集型的应用,建议升级到64位系统并使用64位版本的MongoDB以获得更好的性能和更大的内存容量。

    Spring Data MongoDB中文文档

    Spring Data MongoDB 是一个项目,它将 Spring 框架的核心概念应用于使用 MongoDB 文档样式数据存储的解决方案开发中。...为了进一步了解 Spring Data MongoDB,建议阅读官方文档,学习其详细的功能和最佳实践。

    MongoDB 32位可用

    1. 文档型数据模型:MongoDB使用BSON(Binary JSON)格式存储数据,这是一种轻量级的二进制数据格式,包含JSON-like文档,允许嵌套结构和数组,非常适合处理复杂的数据结构。 2. 模式自由:与传统的关系型数据库...

    mongodb + php扩展文件

    然后,你需要将MongoDB服务器的二进制文件解压到合适的位置,并设置环境变量以指向MongoDB的可执行文件。接下来,将PHP的MongoDB扩展添加到PHP的扩展目录,并在php.ini配置文件中启用该扩展。重启你的Web服务器,就...

    mongoDB的官方中文文档

    MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和易用性而备受开发者青睐。作为NoSQL数据库的一种,它存储数据的方式不同于传统的表结构,而是采用键值对、文档、集合的形式。MongoDB的官方中文...

    mongodb-linux 4.0.6

    1. **下载**: MongoDB的Linux二进制发行版可以在官方网站上找到,但由于网络原因,你可能会遇到下载速度较慢的问题。在这种情况下,你可以通过wget命令直接从提供的压缩包文件`mongodb-linux-x86_64-4.0.6`进行下载...

    mongodb 最佳实践

    本文还提供了关于如何高效利用MongoDB官方资源的建议,例如官方文档、社区论坛和其他资源链接,这些资源可以帮助用户在使用MongoDB时解决遇到的问题,提高开发效率和问题解决的速率。 综上所述,MongoDB最佳实践...

    mongodb_java_2.6_API

    MongoDB是一款分布式文档数据库系统,以其灵活性、高性能和易扩展性而受到开发者的广泛欢迎。在Java编程环境中,与MongoDB交互主要通过其提供的Java驱动程序。本篇将深入探讨"mongodb_java_2.6_API",即MongoDB 2.6...

Global site tag (gtag.js) - Google Analytics