我正在构建一个新的应用程序,具有高读取:写入比率。在我目前的雇主,出于性能原因,我们在表格上有很多非规范化数据。是否更好的做法是拥有完全3NF表,然后使用索引视图来进行所有非规范化?我应该对表或视图运行查询吗?
我感兴趣的一些例子是列子表的聚合(例如,用户帖子计数存储在某处)。
答案 0 :(得分:3)
一般来说,如果需要非常频繁地访问多个规范化表,则最好使用非规范化视图。在大多数情况下,与使用连接和直接查询表相比,它将显着提高性能,并且通常不会更少维护,因为您的视图或连接可以编写为对表的某些部分的更改不可知。它不使用。
所有你的表格应该是第三种正常形式是另一个问题。在我使用答案的大多数应用程序中,大多数表应该以这种方式标准化,但也有例外。是否发出异常与数据的使用方式有关,以及您是否对未来的变化非常有信心。
之后必须返回并重新规范化,因为你做了错误的事情可能代价高昂,但过度规范化应该直接使用和理解的数据可能会使事情变得更复杂,难以维护而不是需要。您的里程可能会有所不同。
答案 1 :(得分:3)
如果要使用视图向用户显示非规范化数据(并且您使用的是SQL Server),则应该查看SCHEMABINDING子句。如果视图是模式绑定的,则可以对其进行索引,并在更新基础表时更新索引。通过这种方式,如果索引设置得很好,那么正在寻找数据的人实际上可以从索引中进行选择,因此不需要为每个查询重建复杂视图,但是用户仍然会看到最新的基础表发生变化的日期。