规范化数据库对资源的影响是啥?
Posted
技术标签:
【中文标题】规范化数据库对资源的影响是啥?【英文标题】:What is the resource impact from normalizing a database?规范化数据库对资源的影响是什么? 【发布时间】:2010-11-25 15:30:42 【问题描述】:当从相对未规范化的形式中获取数据库并对其进行规范化时,资源利用率可能会发生什么变化(如果有)?
例如,规范化通常意味着从更少的表中创建更多的表,这意味着数据库现在有更多的表,但其中许多表非常小,允许经常使用的表更好地适应内存。
更多的表也意味着需要更多的连接(可能)来获取抽象出来的数据,因此人们会期望系统需要执行的连接数量增加会产生某种影响。
那么,规范化未规范化的数据库对资源使用有什么影响(即会发生什么变化)?
编辑: 为了添加一些上下文,我有一个现有的(即遗留)数据库,其中包含 300 多个可怕的表。大约 1/2 的数据是 TEXT,另一半是字符字段或整数。没有任何限制。我问的原因主要是为了让其他人相信事情需要改变并且不会降低性能或可维护性,以获得更多信息。不幸的是,我必须说服的人对非规范化数据库的性能优势了解得足够多,因此希望尽可能避免规范化。
【问题讨论】:
非常依赖空间的问题,具体取决于您可以看到存储空间下降或上升的数据类型。 ***.com/questions/173726/…中有一篇关于这个主题的非常好的帖子 @GmonC - 是的,这是一篇很棒的帖子,但我想知道资源使用情况将如何更改从同一数据库的非规范化版本到规范化版本。 你应该看看 Scott Ambler 的书,重构数据库。 【参考方案1】:这实际上无法以一般方式回答,因为影响会因所涉及数据库的具体情况和使用它的应用程序而很大变化。
所以你基本上陈述了对影响的一般预期:
-
随着冗余数据的删除,存储的总体内存需求应该会下降
CPU 需求可能会增加,因为查询可能会变得更昂贵(请注意,在许多情况下,规范化数据库上的查询实际上会更快,即使它们更多复杂,因为查询引擎有更多优化选项)
开发资源需求可能会增加,因为开发人员可能需要构建更精细的查询(但另一方面,您需要更少的开发工作来维护数据完整性)
所以唯一真正的答案是通常的:这取决于;)
注意:这假设我们正在讨论谨慎和有意的非规范化。如果您指的是 “在数据出现时将一些表放在一起” 方法与没有经验的开发人员共同使用,我会冒险声明规范化将减少所有级别的资源需求;)
编辑:关于 cdeszaq 添加的特定上下文,我想说“祝你好运”;)
显然,有超过 300 个表并且没有限制(!),您的问题的答案肯定是“规范化将减少所有级别的资源需求”(并且可能非常显着),但是:
重构这样的混乱将是一项艰巨的任务。如果只有一个应用程序在使用这个数据库,那已经很可怕了——如果有很多,它可能会成为一场噩梦!
因此,即使从长远来看,规范化会大大减少资源需求,可能不值得麻烦,具体取决于具体情况。这里的主要问题是关于长期范围 - 这个数据库有多重要,它将使用多长时间,将来会有更多应用程序使用它,当前的维护工作是持续还是增加等等......
不要忽视它是一个正在运行的系统 - 即使它很丑陋和可怕,根据你的描述它(还)没有坏 ;-)
【讨论】:
【参考方案2】:“规范化”仅且排他地应用于数据库的逻辑设计。
数据库的逻辑设计和数据库的物理设计是两个完全不同的东西。数据库理论一直希望事情是这样的。忽略/忽视这种区别的开发人员(出于无知、粗心、懒惰或任何其他所谓但无效的“原因”)占绝大多数的事实并不能使他们正确。
逻辑设计可以说是规范化的或非规范化的,但逻辑设计本身并不带有任何“性能特征”。就像'c:=c+1;'本身不具备任何性能特征。
物理设计确实决定了“性能特征”,但是物理设计根本不具备“规范化与否”的质量。
这种对“规范化会损害性能”的错误看法实际上只是证明了当今存在的所有 DBMS 引擎都严重缺乏物理设计选项。
【讨论】:
【参考方案3】:您的问题有一个非常简单的答案:视情况而定。
首先,我将您的问题重新表述为“非规范化有什么好处”,因为规范化是应该作为默认值执行的事情(作为纯逻辑模型的结果),然后可以进行非规范化适用于性能至关重要的非常特定的表。非规范化的主要问题是它会使数据完整性管理复杂化,但在某些情况下,好处大于风险。
我对非规范化的建议:只有在真的很痛苦时才这样做,并确保在任何插入、更新或删除后维护数据完整性时涵盖所有情况。
【讨论】:
这类似于我听到并倾向于同意的建议,现在我已经有了一些经验 - “规范化,直到它损害性能,不再有。”【参考方案4】:为了强调之前发帖者提出的一些观点:您当前的模式真的是非规范化的吗?设计数据库的正确方法(恕我直言)是:
尽可能了解要建模的系统/信息 构建一个完全规范化的模型 然后,如果您认为有必要,以受控方式进行非规范化以提高性能(非规范化可能还有其他原因,但我能想到的唯一原因是政治原因——必须匹配现有代码,开发人员/经理不喜欢它,等等)
我的意思是,如果你从未完全规范化,你就没有非规范化的数据库,你有一个非规范化的数据库。而且我认为您可以为这些数据库考虑更具描述性但不那么礼貌的术语。
【讨论】:
我确实可以想到这个数据库的其他名称,是的,正如你所说,它是一个非规范化数据库。谢谢你的澄清。【参考方案5】:我发现在某些情况下,标准化会提高性能。
小表阅读速度更快。与规范化设计相比,严重非规范化的数据库通常具有 (a) 更长的行和 (b) 更多的行。
读取更少的较短行意味着更少的物理 I/O。
【讨论】:
【参考方案6】:一方面,您最终将不得不进行结果集计算。例如,如果您有一个Blog
,有多个Post
s,您可以这样做:
select count(*) from Post where BlogID = @BlogID
比
贵select PostCount from Blog where ID = @BlogID
如果不小心,可能会导致SELECT N+1
问题。
当然,对于第二个选项,您必须处理保持数据完整性,但如果第一个选项足够痛苦,那么您就让它起作用。
小心不要与premature optimisation 发生冲突。以规范化的方式进行,然后根据需求衡量性能,只有当它达不到要求时才应该考虑去规范化。
【讨论】:
【参考方案7】:规范化的架构往往在 INSERT/UPDATE/DELETE 中表现更好,因为没有“更新异常”并且需要进行的实际更改更加本地化。
SELECT 是混合的。非规范化本质上是实现连接。毫无疑问,物化连接有时会有所帮助,但是,物化通常非常悲观(可能更常见),所以不要假设非规范化会对您有所帮助。此外,规范化模式通常更小,因此可能需要更少的 I/O。连接不一定很昂贵,所以不要自动假设它会很昂贵。
【讨论】:
【参考方案8】:我想详细说明Henrik Opel's #3 bullet point。开发成本可能会上升,但并非必须如此。事实上,数据库的规范化应该简化或启用诸如 ORM、代码生成器、报告编写器等工具的使用。这些工具可以显着减少在应用程序的数据访问层上花费的时间,并将开发转移到添加业务价值。
您可以在 *** 上找到关于规范化数据库开发方面的良好讨论 here。有很多好的答案、cmets 和要考虑的事情。
【讨论】:
以上是关于规范化数据库对资源的影响是啥?的主要内容,如果未能解决你的问题,请参考以下文章