Fergus Asked: 2011-01-11 20:49:33 +0800 CST2011-01-11 20:49:33 +0800 CST 2011-01-11 20:49:33 +0800 CST 标准化应该走多远? 772 我在数据库中有大量数据。我有格式良好的表格和它们之间的良好关系,并且我的数据中有一些冗余。但是我应该在规范化方面走多远?过多的标准化是否存在性能缺陷? performance learning 5 个回答 Voted Best Answer jcolebrand 2011-01-11T21:29:48+08:002011-01-11T21:29:48+08:00 你应该尽你所能,不要再进一步了。当然。~ 问题可能是这有点艺术,这就是为什么这不是一门纯粹的科学。 我们的主要产品是分析和报告系统,所以在这方面我们有很多详细的记录。我们最初为一些子记录设计了一个公共 ID 上的大量连接,但我们发现如果我们对几个字段进行非规范化,我们可以减少很多连接,我们可以消除很多性能问题。 但我们只知道,因为我们 1)创建了一个“规范化”设计,2)开始使用它,3)在数十个表的数亿行之后分析实际性能。 最终的故事是,在我们进行分析之前,我们无法确定什么对我们有用。我们喜欢标准化的想法,这样我们可以更轻松地更新,但最终实际性能是决定因素。这是我给你的建议:简介,简介,简介。 REW 2011-01-11T21:05:12+08:002011-01-11T21:05:12+08:00 只有当规范化支持你的数据模型足以保证它时,它才是一个目标。它旨在成为允许增长、管理和可维护性的指南。请记住,关于规范化的书及其作者都不会构建或维护您的数据库或其应用程序。 关于“过多的标准化”主题的好读物是here。 而且,是的,过多的标准化可能会对性能产生影响。当它们被拉出到单独的表时,这将是在更深的表遍历中拾取状态指示器表之类的东西。有人会说这通常在更新速度(将状态文本从“Good”更改为“GOOD”或类似的东西)或可维护性方面被否定。 onedaywhen 2012-04-12T01:15:07+08:002012-04-12T01:15:07+08:00 我建议阅读Chris Date最近的几本书中的以下附录: 为标准化欢呼两声 规范化远不是灵丹妙药,我们可以通过考虑它的目标是什么以及它对这些目标的衡量程度很容易看出...... 我必须明确表示,我不希望我在本节中的评论被视为任何形式的攻击。我坚信,任何不完全标准化的设计都是强烈禁忌的...... bernd_k 2011-01-11T23:41:52+08:002011-01-11T23:41:52+08:00 我认为查看显式添加的非规范化同样重要,无论是添加的聚合值还是从复制到详细副本的主表中的某些字段。 该论点主要是一些性能论点。 如果您这样做,则这些字段将由触发器更新,并且由数据库来保持它们的一致性。 Isaac A. Nugroho 2011-01-12T22:59:49+08:002011-01-12T22:59:49+08:00 我完全同意@jcolebrand。当你为你的应用程序设计模型时,你应该尽可能地规范化一切。但是,您应该分析基于您的模型构建的查询,尤其是那些经常执行的查询。 我自己的经验:需要两次连接才能达到的属性(这意味着连接了三个表)将主要是性能消耗。更糟糕的是,它被用于在线交易。我对属性进行了非规范化,因此它只需要一个连接并要求程序员调整他们的应用程序以进行查询和更新属性。现在效果好多了…… 换句话说,您应该平衡规范化与性能。
你应该尽你所能,不要再进一步了。当然。~ 问题可能是这有点艺术,这就是为什么这不是一门纯粹的科学。
我们的主要产品是分析和报告系统,所以在这方面我们有很多详细的记录。我们最初为一些子记录设计了一个公共 ID 上的大量连接,但我们发现如果我们对几个字段进行非规范化,我们可以减少很多连接,我们可以消除很多性能问题。
但我们只知道,因为我们 1)创建了一个“规范化”设计,2)开始使用它,3)在数十个表的数亿行之后分析实际性能。
最终的故事是,在我们进行分析之前,我们无法确定什么对我们有用。我们喜欢标准化的想法,这样我们可以更轻松地更新,但最终实际性能是决定因素。这是我给你的建议:简介,简介,简介。
只有当规范化支持你的数据模型足以保证它时,它才是一个目标。它旨在成为允许增长、管理和可维护性的指南。请记住,关于规范化的书及其作者都不会构建或维护您的数据库或其应用程序。
关于“过多的标准化”主题的好读物是here。
而且,是的,过多的标准化可能会对性能产生影响。当它们被拉出到单独的表时,这将是在更深的表遍历中拾取状态指示器表之类的东西。有人会说这通常在更新速度(将状态文本从“Good”更改为“GOOD”或类似的东西)或可维护性方面被否定。
我建议阅读Chris Date最近的几本书中的以下附录:
为标准化欢呼两声
我认为查看显式添加的非规范化同样重要,无论是添加的聚合值还是从复制到详细副本的主表中的某些字段。
该论点主要是一些性能论点。
如果您这样做,则这些字段将由触发器更新,并且由数据库来保持它们的一致性。
我完全同意@jcolebrand。当你为你的应用程序设计模型时,你应该尽可能地规范化一切。但是,您应该分析基于您的模型构建的查询,尤其是那些经常执行的查询。
我自己的经验:需要两次连接才能达到的属性(这意味着连接了三个表)将主要是性能消耗。更糟糕的是,它被用于在线交易。我对属性进行了非规范化,因此它只需要一个连接并要求程序员调整他们的应用程序以进行查询和更新属性。现在效果好多了……
换句话说,您应该平衡规范化与性能。