Chinaunix首页 | 论坛 | 博客
  • 博客访问: 412997
  • 博文数量: 137
  • 博客积分: 5190
  • 博客等级: 大校
  • 技术积分: 997
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 16:19
文章存档

2011年(17)

2010年(120)

我的朋友

分类: 数据库开发技术

2011-10-25 13:44:33

1。应用程序设计技巧 
提示#1:在一条记录内包含所有的数据,虽然数据会有重复,但是可以提高查询速度速度;完整的参考数据,传统的范式设计将更节省空间,并能获得更好的数据一致性

决定因素

要考虑的因素主要有三个:

如果该数据是很少修改的话,那么非范式化的设计将获得更好的性能,否则的话将面对每次修改产生的大量资源消耗。您可能阅读10000次的产品,每一次它的细节变化。不要要支付10,000的罚款读,写一个位更快或保证一致?大多数应用程序都读重得多比写的重型:弄清楚你的比例是。多久你的引用的数据,实际上改变呢?越少它的变化,非规范化的参数越强。这几乎是从来没有价值引用很少变化的数据,如姓名,出生日期,股票符号,地址。

一致性有多重要?如果一致性是很重要的,你应该范式化。例如,假设有多个文件需要以原子看到改变。如果我们设计一个交易应用,其中某些证券可能只有在特定的时间进行交易,我们会想即刻“锁定”他们所有当他们被untradable。然后,我们可以使用一个锁文件作为参考有关集团的证券文件。这种事情可能会更好做应用水平,不过,作为应用程序需要知道何时规则反正锁定和解锁。

另一个时间的一致性是很重要的是不一致的应用难以调和。在订单的例子,我们有一个严格的等级制度:订单得到他们从产品的信息,产品永远不会得到他们的信息从订单。如果有多个“源”文件,这将是困难的决定应该赢。然而,在这个(有点做作)为了应用,一致性可以ACtually是不利的。假设我们希望把20%的产品销售关。我们不想改变任何现有的订单信息,我们只是要更新产品说明。因此,在这种情况下,我们真正想要一个什么样的快照

看起来像在某个时间点的数据(见“提示#5:嵌入”时间点“第7页上的数据“)。

 

不要读取需要的要快?如果读取需要尽可能快,你应该去正常化。在此应用中,他们没有,所以这是没有真正的一个因素。实时应用程序通常应该尽可能地非规范化。

 

有一个很好的例子:非规范化的顺序文件的信息不会改变得多,甚至当它,我们不希望订单,以反映更改。规范化并没有给我们任何特别的优势。在这种情况下,最好的选择是,非规范化的订单模式。

 

 

 

 

提示#2:如果这些数据未来将在很多业务中使用你需要将结构设计范式化

范式化未来的会在不同业务中使用的数据资料:你应该能够使用规范化的数据针对不同的应用,将在未来不同的方式查询数据。这是假设你有申请后,应用程序设置的一些数据,多年来年内,将不得不使用。有这样的数据集,但大多数人的数据不断发展变化,旧的数据更新或下降的手下败将。大多数人希望自己的数据库,他们现在正在做的查询执行尽可能快,如果他们在未来改变这些查询,他们会为优化自己的数据库新的查询。

此外,如果申请成功,其数据集往往变得非常特定应用。这并不是说不能使用,一个应用程序,往往你至少不想做就可以了荟萃分析。但是,这是很难作为“未来校对”它相同站起来,无论查询人要在10年运行。

 

提示#3:尝试在一个查询来获取数据
 

提示#4:嵌入相关的字段

在考虑是否要嵌入或引用的文档时,问自己是否你会在此字段中的信息查询本身,或仅在较大的框架文档。例如,您可能希望查询在标记上,而只是链接到不是为自己的标记,该标记的职位。您可以使用注释同样有一个列表的最近的评论,但人感兴趣去后,(除非评论是一流的公民,在应用程序中),激发了注释。如果您一直使用关系数据库,并且正在迁移到现有的架构MongoDB,联接表的用途嵌入了优秀的候选人。表的基本上都是键和值 — — 例如标签、 权限或地址 — — 几乎总是更好地工作嵌入在 MongoDB最后,如果只有一个文档关心的某些信息,嵌入信息在这份文件。

 

提示#5:嵌入“时间点”数据

订单的示例中所述"技巧 # 1 重复数据的速度,参考数据完整性" 1 页,你其实不希望在该命令信息如果一种产品,说上市或获取新的缩略图更改。任何种类的信息像这样的地方要在特定时间的快照数据,应将嵌入时间点数据。从订单文档的另一个例子: 地址字段也属于"-时间"类别的数据。您不希望用户更改如果他更新过去的订单他的配置文件。

 

提示#6:不要嵌入未确定长度增长的域

由于 MongoDB 存储数据的方式,它是相当低效不断被追加到数组的末尾的信息。您希望数组和对象在正常使用过程中是相当恒定的大小。因此,天气好嵌入 20 子文档,或者 100,即 1,000,000,但这样做了前面。让成长了很多,它是用一个文档可能是要比你想的要慢。评论往往是怪异的边缘的案件,该应用程序的不同而不同。评论应该,对于大多数应用程序,将存储在其父文档中嵌入。然而,凡评论是他们自己的实体或常有数以百计的应用程序或更多,应作为单独的文件存储。另一个例子,假设我们要创建专为目的的应用程序发表评论。中的示例图像板"技巧 # 3 尝试获取在单个数据第 5 页上的"查询是这样 ;主要内容是评论。在这种情况下,我们有想要单独的文档去存放评论。

 

提示#7:预填充任何你能(预填充之后update将获得更好的性能)

如果你知道你的文件是将需要在未来的某些领域,它是更有效的来填充他们当您第一次插入比创建的字段,当您去。例如,假设你正在创建一个网站分析应用程序,看看有多少用户访问不同的网页,每天每分钟。我们将有一个网页的集合,其中每个文件代表一个页片在时间6小时。我们希望每分钟,每小时存储的信息:我们这里有一个巨大的优势:我们知道这些文件是想从现在看,直到结束的时候。将会有一个的现在与未来六个小时的入口每分钟的启动时间。然后会有另一个像这样的文件,而另一个。因此,我们可以有一个批处理作业,无论是在非繁忙时间或在一天的过程中不断滴在插入这些模板文件。这个脚本可以插入文件看起来像这样,更换的某个时候与任何未来6个小时的时间间隔应该是:现在,当你增加或设置这些计数器,MongoDB中并不需要为他们找到空间。它只是更新你已经输入的值,这是快得多。例如,在小时开始,你的程序可能不喜欢的东西:> db.pages.update{“_id”:的pageid开始thisHour}... {“$ INC”{“访问.0.0“3})这个想法可以扩展到其他类型的数据集合和数据库本身。如果您使用一个新的集合的每一天,你还不如事先创建它们。

 

提示8:预分配的空间,尽可能(可以大批量的提高磁盘性能,虽然会产生空挡) 提示#9:使用数组存储嵌入式信息,用于模糊访问,可以使查询更灵活

提示#10:设计文件,以自给自足

mongodb只提供了存储数据和存入取出数据的功能,不要让数据库做他能力之外的事情

 

提示#11:Prefer $-operators to JavaScript
 

提示#12:计算你去的聚合

对于每次累计统计数值,建议使用$inc函数在每次的运算中进行累加,这样能提高性能

 

提示#13:编写计划任务来处理数据的完整性问题
阅读(2997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~