Sql 预计算是非规范化吗?如果不是,什么是(简单地说)?

Sql 预计算是非规范化吗?如果不是,什么是(简单地说)?,sql,Sql,我试图理解数据库中的非规范化,但谷歌发表的几乎所有文章都是针对高级数据库管理员的。我对MySQL和MSSQL有相当多的了解,但我不能真正掌握这一点 当速度成为一个问题时,我能想到的唯一一个例子是在我以前实习的地方对两个表中的大约2500000行进行计算。正如您所猜测的,计算如此多的随需应变花费了很长时间,并将我所在的dev服务器冻结了几分钟。所以就在我离开之前,我的主管希望我写一个计算表,保存所有预先计算的值,大约每小时更新一次(这是一个不经常使用的内部站点)。然而,我从来没有完成它,因为我离开

我试图理解数据库中的非规范化,但谷歌发表的几乎所有文章都是针对高级数据库管理员的。我对MySQL和MSSQL有相当多的了解,但我不能真正掌握这一点

当速度成为一个问题时,我能想到的唯一一个例子是在我以前实习的地方对两个表中的大约2500000行进行计算。正如您所猜测的,计算如此多的随需应变花费了很长时间,并将我所在的dev服务器冻结了几分钟。所以就在我离开之前,我的主管希望我写一个计算表,保存所有预先计算的值,大约每小时更新一次(这是一个不经常使用的内部站点)。然而,我从来没有完成它,因为我离开了


这是一个非规范化的例子吗?如果是这样的话,这是一个很好的例子,还是走得更远?如果不是,那么简单来说是什么?

反规范化可能是有益的,您提供的示例就是一个例子。动态计算这些值并不理想,因为成本很高,因此您创建了一个表,并且有一个函数id与计算值一起引用另一个表

数据是冗余的,因为它可以从另一个表中导出,但由于生产需求,从功能角度来看,这是一个更好的设计


我很想知道其他人对这个话题有什么看法,因为我知道我的sql教授会对术语“非规范化”感到畏缩,但它具有实用性

我称之为聚合而非非非规范化(如果是订单数量,例如,每天的订单总数…)。这就是OLAP的用途。例如,非规范化将不是在联系人表中包含PhoneType表和PhoneTypeID,而是在联系人表中包含PhoneType,从而消除1个连接

当然,您也可以使用索引/物化视图来创建聚合值……但现在您将减慢更新、删除和插入的速度


触发器也是实现这一点的另一种方法。正常形式将拒绝此表,因为它完全可以从现有数据派生。但是,出于性能原因,通常会发现这种类型的数据。例如,库存盘点通常会进行,但可以从创建库存盘点的交易中衍生出来

对于更小更快的集合,可以使用视图来导出聚合。这为用户提供了他们需要的数据(聚合值),而不是强迫他们自己聚合数据。Oracle(和其他公司?)引入了物化视图,以实现您的经理的建议。这可以根据不同的时间表进行更新

如果更新卷允许,可以使用触发器使用表模拟物化视图。这可能会降低维护聚合价值的成本。如果不是这样的话,它将在更长的时间内分散开销。但是,它确实增加了创建死锁条件的风险


OLAP将这个简单的例子应用到对聚合的极端兴趣中。分析师感兴趣的是总价值,而不是细节。但是,如果聚合值很有趣,他们可以查看详细信息。从正常形式开始,仍然是一种良好的做法

假设您有一个Excel文件,其中有两个工作表,您想用来存储家庭联系信息。在第一张工作表上,您有联系人的姓名和手机号码。在第二张工作表中,您有每个家庭的邮寄地址和固定电话号码

现在,您希望将圣诞卡标签打印到所有家庭联系人,列出所有姓名,但每个邮寄地址仅打印一个标签

您需要一种链接两个规范化集的方法。您拥有的2组数据中的所有数据都已标准化。它是“原子的”,代表一个“原子”,或一段无法分解的信息。所有这些都没有重复

在这两个集合的非规范化视图中,您将有一个邮件地址重复多次的所有联系人列表(表兄Alan与Bob叔叔住在同一地址,因此它同时列在Alan和Bob的行上。)

此时,您希望在两个集合中引入一个家庭ID来链接它们。每个邮寄地址都有一个householdID,每个联系人都有一个可以重复的householdID值(同住一户的表哥Alan和叔叔Bob拥有相同的householdID。)

现在,假设我们在工作,我们需要跟踪数以百万计的联系人和家庭。为了便于维护,保持数据规范化非常重要,因为我们只想在一个地方存储联系人和家庭详细信息。当我们更新地址时,我们正在更新所有相关联系人的地址。不幸的是,出于性能方面的原因,当我们要求服务器加入两个相关的集合时,需要花费很长时间

因此,一些开发人员出现并创建了一个非规范化的表,其中包含无数行,一个用于回复家庭详细信息的每个联系人。性能提高了,空间考虑也被抛到了脑后,因为我们现在需要3百万行的空间,而不仅仅是2行


有意义吗?

在过于简化的形式中,我将非规范化描述为减少用于表示相同数据的表的数量

客户和地址通常保存在不同的表中,以允许一个客户有多个地址的概念。(工作、家庭、当前地址、以前的地址等)

这同样适用于姓氏和其他财产,但只有当前姓氏才值得关注。因此,可能会一直规范化客户表和姓氏表,以及外键关系等,但随后通过将这两个表合并在一起来实现非规范化

“正常化直到它受伤”的好处是它迫使人们考虑DAT的纯粹和(希望)完全表示。