2012-03-01 81 views
0

首先感谢我的英语。非规范化对性能有好处

我正在处理一个包含大约一百万条记录的数据库。有10个表格,所有这些表格都使用外键连接。因此,假设我正在保存记录的实体是人。所以在1张表中我有其他人的详细信息,我有他的工作信息等。我的意思是说,我的数据库现在非常正常化。为了获取数据,我正在运行包含多个连接的查询,并在正常时间获取数据。不过,我在一些论坛/科技博客上看到,如果我们只想选择数据,那么非规范化数据库可以显着提高性能。我试图用我自己的数据库来做这件事,我做了一个专栏“denormal_data”。在使用它时,我意识到我的桌子变得更大了,现在它包含了超过50列。好吗 ?我真的需要非规范化的数据库表吗?这是一个好习惯吗?

那么它最有可能成为一般性讨论,然后任何类型的问题,只为学习目的。任何类型的专家建议将不胜感激。

感谢

+1

有时它可以帮助,但它是非常依赖于您的具体方案。你能否提供关于你的表格和连接的更多细节? – 2012-03-01 13:26:54

回答

4

我在网上看了,服用某些药可以改善我的淑女机会,但我不相信我所阅读。你也不应该。

正常化是一件好事 - 除非您已经耗尽所有其他途径以获得更好的性能,否则不要扔掉它。

所有的表都应该有主键。

所有的外键都应该有索引;所以WHERE子句中的所有列都应该如此。

如今,一百万条记录不是一个大型数据库,除非您使用的是像单用户桌面应用程序那样的Access。

您应该在所有查询中解释计划以了解它们的表现。

如果不先取得一些有意义的数据,我不会改变任何东西。除非你有一个好的基线,否则你不会知道你是否真的有问题,或者治疗是否有效。

+0

+1,因为我打算说同样的事情。我还会补充说,一个好的数据库设计可以在数据相关时保持数据的一致性,当数据不相关时则保持不变。如果您有一个“客户”的业务概念,但需要在多个表中执行平面连接以将基本“客户”记录从数据库中取出,则应该考虑组合数据。 – Fenton 2012-03-01 13:28:14

+0

+1谁说“**过早**优化是万恶之源”? – 2012-03-01 14:43:50

+0

Donald Knuth,当然是:http://en.wikipedia.org/wiki/Tony_Hoare – duffymo 2012-03-01 15:37:04

0

事实上,当需要计算大量数据时,非规范化是有用的。例如在论坛中,我们使用一个名为“message_number”或“topic_length”的列来避免在性能上非常贪婪的函数“count”。

我认为有很多方法可以通过反规范化来提高数据库的性能,但是你必须要小心。

0

反规范化是您可以在需要时使用的策略。当你需要它时,数据库性能会对你的应用产生负面影响AND你已经尝试了所有更简单的技巧(索引等)。反规范化不是免费的。你必须手工完成你不需要的东西(例如,你想更新用户的电子邮件地址,在它出现的所有5个表中进行)。

tl; dr:只在需要时才使用它。你可能不需要它。

0

如果你想使用非正则化,创建第二组表格,这些表格会被正式同步,这些表格包含你想以非规范化格式快速访问的数据。它会变成陈旧的数据(但是刷新后不会过时吗?),你应该注明它的年龄。

您可能还需要看看长期CQRS