【问题标题】:more performant to have normalized or denormalized tables具有规范化或非规范化表的性能更高
【发布时间】:2012-10-08 06:27:45
【问题描述】:

我目前正在开发一个 mvc 应用程序来读取现有的 sql server 数据库。数据库是非规范化的 - 我正在考虑修改一些表以在一定程度上对其进行规范化。

这引发了与其他开发人员的讨论,将其作为读取数据的最有效方式,或者结构是否应该改变。数据将通过 ado.net 使用存储过程读取。我的问题是,在一个表中有多个字段(非规范化)或有几个带有内部连接(规范化)的表来检索数据是否更高效?

我应该提到,表上的操作将是 95% 读取,5% 写入。

【问题讨论】:

    标签: .net sql sql-server performance normalization


    【解决方案1】:

    如果您要阅读多于写作,非规范化是个好主意。

    如果您的写作多于阅读,您应该规范化您的表格。

    如果您不确定,或者将两者混合使用,请尝试对这两种配置进行基准测试或负载测试,看看哪个更适合您的应用程序。

    【讨论】:

      【解决方案2】:

      检索非规范化的数据是一个不错的选择,因为更少的连接数,存储比性能成本便宜。

      【讨论】:

        【解决方案3】:

        标准化主要是为了消除重复,以便于维护和最小化所需的存储。

        进行非规范化主要是为了提高特定查询的性能,但由于某些数据是重复的(通常是关键数据),它确实使维护变得更加棘手,并增加了存储需求。

        【讨论】:

          【解决方案4】:

          为报告应用程序保持非规范化。

          只要去规范化的结构符合您的需求,它就会更快。

          如果它是从规范化数据库中填充的,那么一切都很好。即使不是,我仍然不会规范化这个数据库,我会为数据收集创建一个规范化版本,然后使用它来填充您当前的结构。

          从一个数据库收集和报告您必须做出的设计妥协,不会花费很长时间比另一台数据库服务器和某种传输方式花费更多。

          【讨论】:

            【解决方案5】:

            您应该将非规范化数据用于数据分析和密集报告用途。出于上述目的,具有非规范化将有助于提高性能。

            如果您对要实现的应用程序没有太多了解,对于“标准”客户端-服务器应用程序,您应该使用 DOM 大量类并不断读写数据,我会投票支持规范化数据并尽可能避免维护重复数据。尝试简化表格的设计,让它们对您的域模型“感觉舒适”。

            因此,简而言之,对密集型数据读取进行规范化后性能更高,对领域对象模型类的密集读取和写入进行非规范化后性能更高(并且更全面)。

            【讨论】:

            • 对表的操作将是 95% 读取,5% 写入,所以更好地规范化?
            • 如果这 95% 用于报告,这将花费数百个非规范化数据的 JOIN,那么我建议您,是的,保持数据规范化。
            • 读取用于向最终用户显示数据的实时系统。我有点不清楚,您的建议是将数据拆分到多个表中还是将其全部保存在一个表中(避免连接)?
            • 是的,在这种情况下避免加入。仅供参考,在我的情况下,我们已经在生产中使用了几乎 95% 甚至更多是静态数据的应用程序,但我们需要在其余数据中为 r/w 操作提供最佳性能和尽可能多的并发性 5% ,所以我们保持我们的表结构非规范化。问题是当人们执行复杂的查询时,我们时常会遇到性能问题。
            • 好的 - 所以对于我的实时读取数据 (95%) 的情况,我尽量远离连接并拥有一个大表,一种非规范化的方法。感谢您帮助解决这个问题。
            猜你喜欢
            • 2013-08-21
            • 2021-09-22
            • 1970-01-01
            • 2010-11-16
            • 2016-05-13
            • 2018-06-06
            • 1970-01-01
            • 2013-01-18
            • 1970-01-01
            相关资源
            最近更新 更多