数据库代数:从数据库结构派生属性

时间:2018-07-17 12:36:30

标签: sql database sqlalchemy algebra relational-algebra

我目前正在研究一段使用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不能同时具有两个值,但是无论如何。)

1 个答案:

答案 0 :(得分:2)

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

您的那种语义优化是SQL很难解决的问题。通过使用一种更恰当地基于关系代数的语言,然后将其翻译为SQL,作为最后一步,可能会使事情变得容易得多。 SQL不是关系型的,并不等同于RA。 SQL的特殊性意味着实际上您可能期望等同的查询。

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