学习如何在关系代数中制定类似查询的表达式是许多(也许是大多数)“数据库简介”课程的传统部分。
关系代数通常是关系数据库的数学基础,尤其是 SQL 的数学基础,这通常是合理的,这意味着了解它很重要。
然而,在我看来,在关系代数中制定表达式与在 SQL 中制定查询基本相同,并且这两项任务的思维过程基本相同。特别是,我真的看不出了解关系代数可以更轻松地编写 SQL 查询,反之亦然。这让我想知道关系代数的教学是否只是某种历史遗留问题,或者了解它是否真的有特定的好处。
所以我的问题是“了解关系代数是否有具体的实际好处,是否足够重要以使其值得教授?”
作为数据库管理员,您是否觉得关系代数对您的职业轨迹很重要?
一个子问题是花在学习关系代数上的时间是否可以通过学习更多的 SQL 来更有效地利用?
当 Codd 定义关系模型时,他定义了一组可以应用于关系的运算符。在指定关系代数时,就像指定整数代数一样,我们能够使用符号代替关系来解决查询。这些运算符与整数代数运算符(+、-、*、/)具有相同的代数属性。因此,我们可以假设某些规律总是适用于经历该操作的关系,任何关系。例如,在整数代数中,我们知道加法和乘法是关联的,因为我们可以改变操作数的分组而不改变结果:
类似地,在关系代数中,我们知道自然连接是结合的,因此知道 A 连接 B 连接 C 可以按任何顺序执行。这些属性和规律创造了重写查询公式的能力,并保证获得相同的结果。数据库专业人员的应用数学一书提供了有关各种重写规则的重要细节,您可以使用这些规则以不同的方式精确地制定相同的查询。在完美的世界中,任何产生相同结果的配方都将具有相同的性能。现代优化器虽然是一款了不起的软件,但并不完美。因此,如果您以一种方式制定查询并且性能很差,那么您拥有以不同方式制定查询的技能并且知道它具有相同的语义。另一个实际优势是数据库约束的规范。首先,了解关系代数使您能够确定制定约束的最简单方法。其次,通过在形式逻辑中制定约束,您可以立即澄清业务主题专家的任何歧义,他们用宽松的英语制定业务规则并避免错误。
列奥纳多·达·芬奇说:
同样,不了解关系理论基础的数据从业者无法像他们那样完全掌握技术。关于关系代数的一些很好的参考资料是 SIRA_PRISE 的关系代数介绍页面和 CJ Date 的SQL 和关系理论。Date 的书展示了理解关系代数的实用性,以便您可以编写更准确的 SQL 查询。SQL 有许多怪癖和陷阱,并且对它的工作原理与原始关系代数运算符有一个很好的掌握,这确实有助于了解陷阱在哪里并避免它们。
我强烈认为你可以在不参加正式的关系代数课程的情况下成为一名成功的 DBA,就像你可以成为一名成功的程序员而不参加正式的离散数学课程一样。参加关系代数课程的需要在很大程度上取决于您的职业道路/目标。 请参阅编程 StackExchange 上的这个问题。OP 想获得算法等方面的硕士学位。我想说的是,很明显,他需要学习并掌握离散数学。同样,如果您的目标是编写数据库引擎或成为主要关系数据库引擎的核心团队的一员,那么我强烈建议您掌握关系代数、统计信息等。
话虽这么说,研究关系代数所获得的见解很可能会帮助您理解为什么查询会表现得像现在这样,如果没有别的,这对于故障排除很有价值。研究和研究围绕关系逻辑的正式研究也会在其他方面帮助你。
例如,我在关系理论方面没有太多的正式知识,但我可以一起破解一个体面的查询,并对如何设计好的解决方案有一个体面的一般认识。话虽如此,我很难真正理解 MDCCL等用户的一些优秀答案,因为我不能真正完全遵循符号和/或概念。我不知道MDCCL有没有受过正规训练,但我觉得理论基础比较扎实会让我有能力打到MDCCL的水平。
这只是一个例子,它显示了关系代数等的真正价值并不一定在于将其直接应用于 SQL,而是允许您在更高层次上消化知识。
MDCCL 我希望我在这个答案中叫你出来是可以的。如果你不想在这篇文章中被提及,请告诉我,我会编辑你。