神话
我一直认为数据库在读取时应该进行去规范化,就像OLAP数据库设计一样,并且不应该夸大OLTP设计的3NF。
这是一个误解。在关系型数据库环境中,我重新实现了六个非常大的所谓“去规范化”数据库,并执行了超过80个任务来纠正其他问题,只是通过规范化、应用标准和工程原则。我从未见过任何证据支持这个神话。只有人们重复这个口号,好像它是某种神奇的祷告一样。
规范化与非规范化
(“去规范化”是一个欺诈性的术语,我拒绝使用它。)
这是一个科学产业(至少是交付不会出错的软件的部分;它将人类送上月球;它运行银行系统等)。它受物理定律的控制,而不是魔法。计算机和软件都是有限的、有形的、物理的对象,受到物理定律的约束。根据我接受的中等和高等教育:
一个更大、更胖、不太有序的对象不可能比一个更小、更瘦、更有序的对象表现更好。
规范化会产生更多的表,但每个表都要小得多。即使有更多的表,实际上也有(a)较少的连接和(b)连接更快,因为集合更小。总体而言,需要较少的索引,因为每个较小的表需要较少的索引。规范化的表还可以产生更短的行大小。
对于任何给定的资源集,规范化的表:
- 将更多的行适合于相同的页面大小
- 因此将更多的行适合于相同的缓存空间,因此整体吞吐量增加)
- 因此将更多的行适合于相同的磁盘空间,因此I/O的数量减少;当调用I/O时,每个I/O更有效率。
.
一个被大量复制的对象不可能比作为真实版本单独存储的对象表现更好。例如,当我删除表和列级别的5个副本时,所有交易的大小都减小了;锁定减少了;更新异常消失了。这大大减少了争用,因此增加了并发使用。
因此,总体结果表现更高。
根据我的经验,在同一数据库中提供OLTP和OLAP时,从未需要“去规范化”我的规范化结构以获得只读(OLAP)查询的更高速度。这也是一个谬论。
不,其他人要求的“去规范化”降低了速度,并被消除了。对我来说并不奇怪,但是请求者很惊讶。
很多书都是由那些卖谬论的人写的。需要认识到这些人非技术人员;因为他们在销售魔法,所以他们销售的魔法没有科学依据,并且在他们的销售宣传中方便地避开了物理定律。
(对于任何希望质疑上述物理科学的人,仅重复口号是没有任何效果的,请提供支持口号的具体证据。)
为什么这个谬论如此普遍?
首先,科学类型并不普遍,他们不寻求克服物理定律的方法。
根据我的经验,我确定了三个主要原因:
对于那些无法将其数据规范化的人来说,这是不规范化的方便理由。他们可以参考魔法书,在没有任何魔法证据的情况下,虔诚地说“看,一位著名作家证实了我的做法”。准确来说,这样做是错误的。
许多SQL编码人员只能编写简单的单层SQL语句。规范化结构需要一定的SQL能力。如果他们没有这种能力,如果他们不能在不使用临时表的情况下生成SELECTs,如果他们不能编写子查询,他们将心理上与扁平文件(也就是“非规范化”结构)紧密相连,而他们可以处理。
人们喜欢读书,喜欢讨论理论。特别是关于魔法的理论。这是一种替代实际经验的良药。任何实际上正确规范化数据库的人都从未声称“非规范化比规范化更快”。对于任何重复这个口头禅的人,我只会说“给我看证据”,他们从未提供过任何证据。因此,现实情况是,人们出于这些原因重复这个神话,而没有任何规范化的经验。我们是群居动物,未知是我们最大的恐惧之一。
这就是为什么我总是在任何项目中包括“高级”SQL和指导。
我的答案
如果我回答你的每一个问题或者对其他答案中错误的部分做出回应,那么我的答案会变得异常冗长。例如,上面的回答只回答了一个问题。因此,我将总体回答你的问题,而不是针对特定组成部分作出回应,并采用不同的方法。我只会涉及与你的问题相关的科学领域,这是我有资格和非常有经验的。
让我把科学以易于管理的方式呈现给你。
![Typical First Generation "databases"](https://i.imgur.com/Bkv9BAa.png)
六个大规模全面实施任务的典型模型。
以下是翻译的结果:
- 这些通常在小公司中发现的“数据库”已关闭,而这些组织是大型银行
- 对于第一代的启动应用程序的思维方式来说非常不错,但在性能、完整性和质量方面则完全失败了
- 它们是为每个应用程序单独设计的
- 无法进行报告,它们只能通过每个应用程序进行报告
- 由于“去规范化”是一个谬论,准确的技术定义是它们是非规范化的
- 为了“去规范化”,必须先规范化;然后反转这个过程
- 每当有人向我展示他们的“去规范化”的数据模型时,简单的事实是,他们根本没有进行规范化;所以“去规范化”是不可能的;它只是非规范化的
- 由于它们没有太多的关系技术,也没有数据库的结构和控制,但它们被冠以“数据库”的名义,我已经将这些词放在引号中
- 因为非规范化结构在科学上是保证存在的,所以它们遭受了多个真相版本(数据重复),因此在每一个结构中都存在高争用和低并发性
- 它们还有一个数据重复的额外问题跨越“数据库”
- 组织试图保持所有这些副本同步,因此实施了复制;这当然意味着要开发ETL和同步脚本;以及进行维护等
- 不用说,同步永远不太够,他们总是在改变它
- 由于所有这些争用和低吞吐量,很容易为每个“数据库”正当化单独的服务器。但这并没有什么帮助。
所以我们考虑了物理法则,并应用了一些科学。
![5NF Corporate Database](https://i.imgur.com/MioUF7e.png)
我们实施了标准概念,即数据属于公司(而不是部门),公司希望有一个真实版本。数据库是纯关系型的,规范化到第五范式。纯开放架构,因此任何应用程序或报告工具都可以访问它。所有事务都在存储过程中处理(而不是在整个网络上无序的 SQL 字符串)。每个应用程序的相同开发人员在我们的“高级”教育后编写了新应用程序。
显然,这项科学起了作用。好吧,这不是我的私人科学或魔法,而是普通的工程和物理定律。所有这些都在一个数据库服务器平台上运行;两对(生产和DR)服务器已被废弃并交给另一个部门。将总计720GB的5个“数据库”规范化为总计450GB的一个数据库。大约700个表格(许多重复和重复列)被规范化为500个不重复的表格。总体性能提高了10倍,某些功能的性能提高了100倍以上。这并不让我惊讶,因为这是我的意图,科学也预测到了,但这让那些一直念叨的人感到惊讶。
更多规范化
嗯,在每个项目中都成功地进行了规范化,并且对涉及的科学有信心,因此规范化更多而不是更少是自然而然的进展。在旧时代,3NF已经足够好了,后来的NF尚未被确定。在过去的20年中,我只交付了没有更新异常的数据库,因此根据今天的NF定义,我始终交付了5NF。
同样地,第五范式很好但它也有其局限性。例如,对于大型表的透视(不是像MS PIVOT Extension那样的小结果集),速度较慢。因此,我(和其他人)开发了一种提供规范化表的方法,使透视变得(a)容易且(b)非常快速。事实证明,现在已经定义了第六范式,这些表就是第六范式。
由于我从同一个数据库中提供OLAP和OLTP,我发现,与科学一致,结构越规范:
- 它们的性能越快
- 它们可以用更多的方式(例如透视)
因此,我的一贯和不变的经验是,规范化比未规范化或“去规范化”要快得多;更规范化甚至比更少规范化更快。
成功的一个标志是功能增长(失败的标志是尺寸增长而功能不变)。这意味着他们立即要求我们提供更多的报告功能,这意味着我们进行了更多的规范化,并提供了更多的专业表格(后来证明是6NF)。
在这个主题上取得进展。我一直是数据库专家,不是数据仓库专家,因此我的前几个仓库项目并不是完整的实现,而是重要的性能调优任务。它们在我专业的产品中,属于我的权利范围。
![Typical Data Warehouse](https://i.imgur.com/ij4jfQi.png)
让我们不用担心规范化的精确级别等,因为我们正在看典型的情况。我们可以认为OLTP数据库已经适当地规范化,但不能进行OLAP,组织已经购买了完全独立的OLAP平台、硬件;投资于开发和维护大量ETL代码等。在实施后,他们花费了一半的时间来管理他们创建的重复内容。在这里,需要指责书籍作者和供应商,因为他们导致组织购买了大量的硬件和单独的平台软件许可证,造成了巨大的浪费。
- 如果你还没有注意到,我想请你注意一下"典型第一代数据库"和"典型数据仓库"之间的相似之处。
同时,在上面的"5NF数据库"中,我们不断地增加了更多的OLAP功能。当然,应用程序功能增长了,但这只是小问题,业务并没有改变。他们会要求更多的6NF,而提供这些是很容易的(从5NF到6NF只是一个小步骤;从0NF到5NF,甚至是任何级别的步骤,都是一个大步骤;有组织的架构很容易扩展)。
OLTP和OLAP之间的一个主要区别,以及分离OLAP平台软件的基本理由,是OLTP是面向行的,它需要事务安全的行,并且速度快;而OLAP不关心事务问题,它需要列,并且速度快。这就是为什么所有高端BI或OLAP平台都是面向列的原因,也是为什么OLAP模型(星型模式、维度-事实)是面向列的原因。
但是对于6NF表:
没有行,只有列;我们以同样令人眼花缭乱的速度提供行和列
表格(即6NF结构的5NF视图)已经组织成维度-事实。实际上,它们被组织成比任何OLAP模型都要识别的更多维度,因为它们都是维度。
整个表格的透视聚合(而不是少数派生列的PIVOT)是(a)轻松、简单的代码和(b)非常快速的。
多年来,我们一直提供至少具备5NF的关系型数据库用于OLTP使用,并且具备6NF的OLAP要求。
请注意,我们从一开始就使用的是相同的科学方法;从
典型的非规范化数据库到
5NF企业数据库。我们只是应用了更多经过验证的科学方法,并获得了更高级别的功能和性能。
注意
5NF企业数据库与
6NF企业数据库之间的相似之处。
所有单独的OLAP硬件、平台软件、ETL、管理和维护成本都被消除了。
只有一个版本的数据,没有更新异常或维护;相同的数据作为行提供给OLTP,作为列提供给OLAP。
我们唯一没有做的是开始一个新项目,并从一开始就宣布纯6NF。这就是我接下来要做的事情。
什么是第六范式?
假设您已经掌握了规范化(我这里不会进行定义),与本主题相关的非学术定义如下。请注意,它适用于表级别,因此您可以在同一数据库中拥有5NF和6NF表的混合:
- 第五范式:解决了整个数据库中的所有功能依赖项
- 除了4NF / BCNF之外
- 每个非PK列都与其PK是1:1的
- 且没有其他PK
- 没有更新异常
- 第六范式:是不可约范式,数据无法进一步减少或规范化(将不会有第7NF)
- 除了5NF之外
- 行由一个主键和最多一个非键列组成
- 消除了空值问题
第6NF长什么样?
数据模型属于客户,我们的知识产权不可免费发布。但我会参加这个网站,并提供具体问题的答案。您需要一个实际的例子,所以我将发布我们内部工具之一的数据模型。
这一个是用于收集任意数量客户的服务器监控数据(企业级数据库服务器和操作系统),并且可以选择任何时间段。我们使用它来远程分析性能问题,并验证我们所做的任何性能调整。这个结构在过去十年中没有改变(只是添加了内容,而没有更改现有结构),它是许多年后被确认为6NF的专业5NF的典型。它允许完全透视;可以绘制任何图表或图形,对任何维度进行操作(提供了22个透视,但这不是限制);切片和混合。请注意,它们都是
所有维度。
监控数据或指标或向量可能会更改(服务器版本更改;我们想要获取更多信息),但不会影响模型(您可能还记得在另一篇文章中我说过EAV是6NF的私生子;好吧,这是完整的6NF,未经稀释的父亲,因此提供了EAV的所有功能,而不牺牲任何标准、完整性或关系能力);您只需添加行即可。
▶监控统计数据模型◀。 (太大无法内联; 一些浏览器无法内联加载; 点击链接)
它使我能够在收到客户的原始监控统计文件后,仅使用六个按键就可以生成这些▶如此图表◀。注意混搭; 操作系统和服务器在同一张图表上; 各种枢轴。 (获得许可后使用。)
对于不熟悉关系数据库建模标准的读者,可能会发现▶IDEF1X符号◀有所帮助。
6NF数据仓库
最近
Anchor Modeling验证了这一点,他们现在将6NF作为数据仓库的“下一代”OLAP模型进行展示。(他们没有提供单个版本的OLTP和OLAP,那是我们自己的。)
我的经验只涉及数据仓库(不包括上述的6NF OLTP-OLAP数据库),有几个重要的任务,结果毫不意外:
- 符合科学规律,规范化结构执行速度更快,更易于维护,并且需要较少的数据同步。Inmon而非Kimball。
- 在我对一堆表进行规范化后,通过应用物理定律实现了显著的性能提升,唯一感到惊讶的是那些带着咒语的魔术师。
- 科学家并不这样做;他们不相信或依赖银弹和魔法;他们使用科学和艰苦的工作来解决问题。
有效的数据仓库有其正当的理由。
这就是为什么我在其他帖子中说过,唯一一个合理的数据仓库平台、硬件、ETL、维护等单独存在的理由是,当有许多数据库或“数据库”全部合并到一个中央仓库中进行报表和OLAP时。
Kimball
需要提及Kimball,他是数据仓库中“去范式化以提高性能”的主要支持者。按照我上面的定义,他是那些显然从未规范化过的人之一;他的起点是非规范化的(伪装成“去范式化”),然后简单地将其实现在维度-事实模型中。
当然,为了获得任何性能,他不得不更多地“去规范化”,创建进一步的副本,并证明所有这些。因此,以一种分裂的方式,“去规范化”非规范化结构,通过创建更专业的副本,“提高读取性能”是正确的。当整体被考虑进来时,这并不是真的; 它只在那个小疯人院里是正确的,而不是在外面。
他的维度被添加到非规范化数据中。好吧,数据没有被规范化,所以没有维度暴露。而在规范化模型中,维度已经作为数据的一个组成部分暴露出来,不需要添加。
Kimball的这条铺好的道路通向悬崖,更多的旅鼠会更快地跌落死亡。旅鼠是群居动物,只要他们一起走路,一起死去,他们就会幸福地死去。旅鼠不会寻找其他路线。
所有这些只是故事,构成一个神话的部分,并相互支持。
您的使命
如果您选择接受。我要求您自己思考,并停止娱乐任何与科学和物理定律相矛盾的想法。无论它们有多么普遍、神秘或神话。在信任任何东西之前寻找证据。要科学,为自己验证新的信念。反复说“针对性能进行去规范化”不会使您的数据库更快,它只会让您感觉更好。就像坐在场外告诉自己他能比比赛中的所有孩子跑得更快的胖孩子一样。
- 基于这一点,即使是“针对 OLTP 进行规范化”的概念,但相反,“针对 OLAP 进行去规范化”也是一种矛盾。物理定律如何可以在一个计算机上按照所述方式工作,但在另一个计算机上按相反的方式工作呢?这令人难以置信。它根本不可能,它们在每台计算机上都以相同的方式工作。
问题?