将规范化表与非规范化索引视图一起使用是个好主意吗?

Posted

技术标签:

【中文标题】将规范化表与非规范化索引视图一起使用是个好主意吗?【英文标题】:Is it a good idea to use normalised tables with denormalised indexed views? 【发布时间】:2010-09-16 12:56:22 【问题描述】:

我目前正在构建一个新的应用程序,它具有很高的读写比率。在我现在的雇主中,出于性能原因,我们的表格上有很多非规范化数据。拥有完全 3NF 表然后使用索引视图进行所有非规范化是更好的做法吗?我应该对表或视图运行查询吗?

我感兴趣的一些事情的一个例子是列子表的聚合(例如,将用户帖子计数存储在某处)。

【问题讨论】:

【参考方案1】:

一般来说,如果您需要非常频繁地访问多个规范化表,那么使用非规范化视图是个好主意。在大多数情况下,与使用连接和直接查询表相比,它会显着提高性能,并且通常不会降低可维护性,因为您的视图或连接都可以编写为不知道对表的某些部分所做的更改没用。

是否所有您的表格应该是第三范式是另一个问题。在我使用过的大多数应用程序中,答案是 大多数 表应该以这种方式标准化,但也有例外。是否例外与数据的使用方式有关,以及您是否可以非常有信心将来不会改变这种使用方式。

稍后必须返回并重新规范化,因为您以错误的方式进行操作可能代价高昂,但过度规范化应该易于使用和理解的数据可能会使事情变得比实际需要的更复杂和难以维护.您的里程可能会有所不同。

【讨论】:

【参考方案2】:

如果您打算使用视图向用户呈现非规范化数据(并且您正在使用 SQL Server),您应该检查 SCHEMABINDING 子句。如果视图是模式绑定的,您可以对其进行索引,并且索引将在基础表更新时更新。这样,如果索引设置好,查找数据的人实际上可以从索引中进行选择,这样就不需要为每个查询都重新构建复杂的视图,但用户仍然会看到最新的基础表更改的日期。

【讨论】:

以上是关于将规范化表与非规范化索引视图一起使用是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

将“final”修饰符与 getter 和 setter 一起使用是个好主意吗?

在mysql中索引日期时间字段是个好主意吗?

Jetpack compose - 将所有物品放入 LazyColumn 是个好主意吗?

将React和Vue混合起来是个好主意吗? [关闭]

在哪里使用“std::valarray”是个好主意?

在庞大的数据集上使用 IN 是个好主意吗?