6

我正在设计一个数据库,我想规范化数据库。在一个查询中,我将加入大约30-40张表格。如果它变得非常流行,这会不会损害网站的性能?这将是主要的查询,并且将被调用50%的时间。其他查询我将加入两张表格。规范化是否真的损害了高流量网站的性能?

我现在可以选择正常化或不正常化,但如果规范化在未来成为问题,我可能不得不重写软件的40%,这可能需要很长时间。在这种情况下,正常化是否真的受伤?我应该在现在有空的时候反规范化吗?

+2

您不应该冒这样大规模的重写(40%的代码)的风险。如果你开始规范化,但通过视图来提供大部分代码所必需的抽象...那么在你需要将你的视图作为抽象层应该呈现的方案中非规范化时,它应该避免大部分代码更改。 – 2010-04-24 00:46:34

+1

当您需要更新非规格化表格时,请注意涉及的开销(涉及工作量) - 如果您更改客户端地址,而不是在一个地点更改它,您现在必须扫描非规范化表格中的每一行以更改它。也许一个视图是你最好的选择,如果这仍然太慢,那么分配更多的硬件资源到数据库。 – slugster 2010-04-24 01:41:32

+1

我想知道为什么你首先需要30-40张桌子 - 以及为什么需要加入这些桌子。这对我来说并不合适,所以我想让你解释表格在做什么。 – 2010-04-24 14:29:00

回答

4

我引述如下: “正常化的正确性,反规范化的速度 - 并且只在必要时”

我是指你:In terms of databases, is "Normalize for correctness, denormalize for performance" a right mantra?

HTH。

+3

+1。你不规范化数据库 - _always_从3NF开始。如果_,只有if_,则回复到较低的速度,这是必要的。并确保你了解后果和解决方案。有许多方法可以缓解非规范化引发的问题(触发器,计算列等)。另外看起来YAGNI :-) – paxdiablo 2010-04-24 00:18:22

+0

所以你认为30-40表将不会是一个问题加入?此外,如果规范化确实成为问题,是否可以添加更好的硬件来抵消规范化成本? – Luke101 2010-04-24 00:34:25

+1

@Luke:不,这可能是一个连接40个表的问题,你应该考虑去规范化(但是只有在问题出现之后,而不是预期可能不存在的问题 - 测量,不要猜测)。但是我非常喜欢3NF模式,它需要连接这么多表。根据我的经验,我从来没有遇到过这种极端的情况。也许如果你在这方面增加了更多细节,我们可以更好地理解并提供更有针对性的建议。 – paxdiablo 2010-04-24 01:12:33

0

不要进行早期优化。非规范化不是加速网站的唯一途径。你的缓存策略也是非常重要的,如果30-40表的查询是相当静态的数据,缓存结果可能证明是一个更好的优化。

另外,考虑到读取次数的写入次数。如果您为每次插入或更新执行大约10次读取,则可以说数据相当静态,因此您应该将其缓存一段时间。

如果最终使您的模式非规范化,您的写入操作也将变得更加昂贵,并且可能会让速度变慢。

在进行太多优化之前真正分析您的问题,并等待查看系统瓶颈的位置,因为您可能最终会惊讶于您应该首先优化哪些内容。

+0

30-40表格根本不会是静态的。在正常的一天,我们预计会有1000次更新和插入。 – Luke101 2010-04-24 00:32:32

+1

每天进行1000次更新的次数少于每分钟1次。我会称之为相当静态的。 – Gabe 2010-04-24 03:23:39

+0

同意。而且,假设你读取的次数多于写入的次数,那么缓存策略将证明是非常重要的。 – jamesaharvey 2010-04-24 13:10:53

3

当性能是一个问题,还有比非规范化通常是更好的选择:

  • 创建的相关表相应的索引和统计
  • 缓存
  • 物化视图(MS SQL Server中索引视图)
  • 除了在大多数情况下使用的规范化表格(需要编写同步代码,它可以作为三元组运行)之外,还有一个表格的非规范化副本(专用于需要它们的查询) gger或预定作业,具体取决于您需要的数据精度)
1

标准化可能会损害性能。然而,这并不是过早反规范化的理由。

从完全标准化开始,然后您会看到是否有任何性能问题。按照你所描述的速度(每天1000次更新/插入),我认为除非桌子很大,否则你不会遇到问题。

即使有大量您可以使用的数据库优化选项(索引,准备存储过程,物化视图,...)。

1

也许我在这里错过了一些东西。但是如果你的架构要求你在一个查询中加入30到40个表格,那么这个查询就是你网站的主要用途,那么你就有更大的问题。

我同意他人,不要过早地优化您的网站。但是,您应该优化体系结构以解释您的主要用例。对于运行时间超过50%的查询,40个表连接未优化IMO。

相关问题