首页 > 解决方案 > 在有界条件的经典关系代数中找到模式

问题描述

我得到一个包含两列的表:id_ship 和日期。假设一艘船的日期不能超过三个,我需要找到出现次数最多的船只的 ID(即日期最多的船只)。

很容易找到具有三个日期的船舶的 ID,只需从表的三重笛卡尔积中进行选择。但是,我无法检查获得的结果是否为空。如果它不是空的,我将不得不选择这个视图,而如果它是空的,我需要寻找有两个日期的船并再次检查它是否是空的。我该如何进行?请记住,我不能使用扩展关系代数,因此使用聚合函数或扩展投影是无效的。

编辑:对不起,我认为“经典关系代数”这个概念是标准的。那个操作。我的RA支持的操作有:select、project、rename、union、diff、intersect、cartesian product、natural join、join with condition和division

标签: relational-databaserelational-algebra

解决方案


本练习的目的是避免聚合运算符或分组。这将很好地证明为什么这些是有用的。

所以你是说对于id_ship给定表中的每个,可能有 3、2 或 1 次出现。大概对于您的“三重笛卡尔积”(这将是一个重命名的自积),您将生成一行,其中三个日期从左到右升序(这样您就可以检查自积不重复日期)。

好的,那么对于 2 次出现的情况,您需要一个双笛卡尔积,日期从左到右升序。排除那些id-ship已经出现在三元组中的 s。

对于 1 次出现的情况,排除id-ship出现在上述任一情况中的 s。

然后UNION把三个结果加在一起:

SELECT id-ship, 3 AS count
FROM occ3
UNION
SELECT id-ship, 2 AS count
FROM occ2
UNION
SELECT id-ship, 1 AS count
FROM occ1 ;

现在您有了一个带有计数的传统组样式表。

啊,但是你想要的是 RA 而不是 SQL?然后我们遇到了哪个版本的RA的困难。这些版本的不同之处在于可用的运算符。例如,'granddaddy' Codd 1972 版本甚至不包含重命名,因此您甚至无法生成三重笛卡尔积。

所有版本都支持UNIONOK;all 支持投影,这是您id-ship从 3 个单独的查询结果中获取所需的。

假设您的 RA 支持关系文字:{{count 3}}是一组(单例)元组,每个元组是一组属性名称-值对

(pi<id-ship>(occ3) x {{count 3}})
UNION
(pi<id-ship>(occ2) x {{count 2}})
UNION
(pi<id-ship>(occ1) x {{count 1}})

如果您的 RA 不支持关系文字,它可能支持EXTEND操作


推荐阅读