【发布时间】:2018-07-17 12:36:30
【问题描述】:
我目前正在编写一段代码,该代码使用 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 不能同时有两个值,但无论如何......)
【问题讨论】:
-
嗨。如果你用谷歌搜索你的问题,你会发现这个主题是关系数据库优化/实现,并且相关的底层代数是(某些版本的)关系代数,并且在大多数关系数据库教科书的一章中都有介绍,其中有几十个是免费在线,这也是一个stackoverflow常见问题解答。你已经用关系代数标记了这个,你为什么要问?此外,DBMS 已经将此类优化作为其功能的一部分,那么为什么要复制它呢?
标签: sql database sqlalchemy algebra relational-algebra