MongoDB 如何存储数据
MongoDB是一个面向文档的数据库。它把你的数据存储在由独立的文档组成的集合中,而不是像关系型数据库那样,存储在由独立的行组成的表中。在MongoDB中, 一个文档是一大块JSON数据,没有特定的格式或模式。
比如说,你需要对下列一组关系进行建模。这和来自于Pivotal的一个使用了MongoDB的项目类似,是我见过的最适合于文档数据库的用例。
根元素是电视节目。每个节目有很多季,每一季都有很多片段,每个片段都有很多评论和演员表。当用户进入这个网站后,一般都是直接访问一个特定电视节目的页面。在这个页面里他们可以看到所有的季、所有的片段、所有的评论和所有的演员表。从应用的角度来看,当用户访问一个页面时,我们就将检索所有有关电视节目的信息。
有很多方法可以为此数据建模。在典型的关系型数据存储中,上面的每一个方框就是一个表。你必须有一个叫电视节目的表、一个有外键是电视节目的每一季表、一个有外键是每一季的片段表以及外键是片段的评论表和演员表。所以,要得到电视节目的所有信息,你必须要在5个表中查询。 我们也可以以这样的数据作为一组嵌套的哈希值进行建模。有关特定电视节目的信息的集合是一个大的嵌套的keyvalue数据结构。 在电视节目里有一个季节的数组,每一个季节是一个hash。 在每个季节里,每一个episodes都是一个hash等等. 这就是Mongo如何建立数据模型的. 每一个电视节目是一个包含我们需要的所有信息的文档。 这是一个电视节目文档的例子, Babylon 5.
它有一些标题的元数据,然后是一个季节的数组. 每个季节本身就是一个带有元数据的哈希数组episodes. 反过来, 每个episode 都有一些reviews和cast_members的元数据和数组。 这就像是一个巨大的分形体数据结构。
集合的集合的集合的集合。就像是个分形体!
所有我们需要的电视节目数据都在一个文档里,所以要检索一次所有信息时是很快的,即使这个文档很庞大。美剧“综合医院”发布了50+季,超过12000集。在我的笔记本电脑上,PostgresSQL查询所有数据得1分钟,而在MongoDB中用一个ID查询时是秒级。
所以,不管怎么说,这个应用对于存储文档模型还是不错的选择。 |