【问题标题】:Database Algebra: derivate properties out of database structure数据库代数:从数据库结构中导出属性
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2021-02-14
    • 2014-03-24
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多