首页 > 解决方案 > 数据库代数:从数据库结构中导出属性

问题描述

我目前正在编写一段代码,该代码使用 sqlalchemy 从数据库结构模型生成 SQL 查询。这个工具的目标是无论定义什么数据库结构都可以工作。

为了使其正常工作,我需要实施规则来过滤无用的生成查询。

例如:

SELECT SUM(col_a)
FROM (
      SELECT SUM(col_b) AS col_a
      FROM tableA
      GROUP BY col_c
     )

SELECT SUM(col_b) FROM tableA

产生完全相同的结果。因此,不应生成其中之一(例如更复杂的)

其他示例:

SELECT * FROM tableA WHERE col_a = True and col_a = False

此查询始终返回一个空集

对于这两个示例,结果是静态可预测的(仅使用数据库结构而不使用其中的数据)。

所以,我想知道是否存在可以表达这些概念的代数,以帮助我生成有关列、表、查询结果等的属性。

属性示例如下:如果两列 col_a 和 col_b 通过一对一关系连接,则 SELECT col_a 的每一行始终只有一个 col_b 值。因此:

SELECT col_a FROM tableA WHERE col_b = "value1" and col_b = "value2"

将始终返回一个空集(也因为 col_b 不能同时有两个值,但无论如何..)

标签: sqldatabasesqlalchemyalgebrarelational-algebra

解决方案


通常有大量关于查询优化的已发表研究,如果您不熟悉,请查看研究档案和出版物,如 SIGMOD Record。

你这种语义优化对于 SQL 来说是一个很难解决的问题。您可以通过使用更正确地基于关系代数的语言来使事情变得更容易,然后可能将其转换为 SQL 作为最后一步。SQL 不是关系型的,也不等同于 RA。SQL 的特性意味着您可能期望的查询实际上是等价的。

只是您在 SQL 中必须处理的一些额外困难:未命名的列(您的前两个示例查询);别名(您的第一个查询是非法的,需要别名,但其他查询不需要);类型转换;列名范围的上下文相关规则;缺少密钥和密钥派生;重复的列;重复行;三值逻辑。这些“特征”和遗漏使查询处理更加复杂,而对查询作者/用户没有任何特殊价值。


推荐阅读