我听说我的团队负责人说,在过去的一些项目中,他们不得不取消规范化,以加快查询速度。
我认为它可能与表联盟有关。
是否有更多的精益表格实际上比没有胖桌子的效率低?
答案 0 :(得分:17)
这取决于...连接表本质上比一个大表“预加入”即非标准化要慢。但是,通过非规范化,您将创建数据重复,并且您的表将变得更大。规范化被认为是一件好事,因为它创建了可以回答“任何”问题的数据库,如果正确完成,您可以构建一个选择来获取数据。在某些其他形式的数据库中情况并非如此,现在(大多数情况下)是历史性的无关紧要,标准化/关系数据库赢得了这场战斗。
回到你的问题,使用去规范化使事情变得更快是一种被广泛接受的技术。通常最好运行您的数据库一段时间,这样您就知道要取消规范化的内容以及单独留下什么,并且将数据保持为“正确”的规范化形式并将数据提取到一组非规范化报告中也很常见桌子定期。如果该过程是作为报告运行本身的一部分完成的,那么数据也始终是最新的。
作为过度规范化的一个例子,我曾经看过过去的数据库,一周的日子和一年中的几个月被分成不同的表 - 日期本身已经标准化 - 你可以走得太远。
答案 1 :(得分:11)
您应该对OLTP(在线交易处理)和OLAP(在线分析处理)数据库之间的差异进行一些研究。
简而言之,主要关注记录事务(OLTP)的数据库系统通常以更标准化的方式构建,减少数据重复并简化记录的创建和更新,但代价是优化数据检索。
更关注数据检索和分析(OLAP)的数据库系统通常以较不规范的方式构建,牺牲数据存储优化,以最大限度地提高查询和分析速度。
Database normalization和Denormalization是这次交易的核心。
答案 2 :(得分:4)
杰夫wrote about this,随后进行了激烈的讨论。 它也是关于SO的讨论的主题,例如: whats the better database design more tables or more columns。正如其他人指出的那样,使用常识并且不要过度规范化。
答案 3 :(得分:3)
在我对Oracle OLTP 数据库的长期经验中,其中一些数据库非常庞大且繁忙,我可以诚实地说我不记得曾经遇到过“非正常化表现”的案例需要。但是,我看到很多情况,有人事先决定应该应用非正规化,因为他们对潜在的性能问题感到恐惧,不确定和怀疑。这通常是在没有任何基准测试的情况下完成的,并且总是发现事实上没有实现性能提升 - 但数据维护代码变得比以往复杂得多。
OLAP是一个非常不同的动物,我不能对此发表评论。答案 4 :(得分:2)
这个问题经常发生。主要原因是SQL,这是最受欢迎的数据库语言,以及所有最流行的实现,将逻辑表设计与物理表设计混为一谈。
永恒的答案是你应该始终规范你的逻辑表,但实用的答案很复杂,因为在现有的SQL实现下实现某些优化的唯一方法是对你的物理表设计进行非规范化处理(本身并不是坏事) )在这些实现中,需要对逻辑表设计进行非规范化。
总之,这取决于。有时非规范化对于提高性能非常重要,但与其他与性能相关的事情一样,您应该在考虑沿着这条路线前进行测量,测量和测量。
答案 5 :(得分:1)
性能与RDBMS上的标准化量相反。话虽如此,表格越正常,出错的可能性就越小。在所有数据保存在一个表中的位置,非规范化可能会损害RDBMS性能。
答案 6 :(得分:0)
已知规范化会损害性能的原因是因为连接相当昂贵。如果表X中有N条记录,表Y中有M条记录,则X和Y的连接会创建一个临时表,其中包含多达N * M条记录。虽然有一些优化技巧,如果不需要,数据库不会生成整个表,但它必须处理所有记录。
非规范化是一个过程,您可以将经常一起使用的数据放在一个表中,以提高性能,这是为了保证数据库的纯度。大多数人认为它是一个可以接受的交易,甚至可以设计有意地非规范化的模式以跳过中间步骤。