【问题标题】:Select rows with "one of each" in relational algebra在关系代数中选择具有“每个”的行
【发布时间】:2016-10-19 04:49:31
【问题描述】:

假设我有一个Personstable,属性为{name, pet}。我如何选择他们拥有每种宠物的人的姓名(dog, cat, bird),但是如果一个人的宠物在表格中,则每个人只有一种宠物。

示例:Bob, DogBob, Cat 是表中仅有的行。因此,Bob 拥有每一种宠物。但是在添加Lynda, Bird 的那一刻,Bob 不再拥有每种类型的宠物。

我认为第一步是π(pet)。由于关系代数删除了重复项,因此您会得到一份各种宠物的列表。不知道之后该怎么办,但我认为我需要加入 π(pet)Persons

我尝试了一些东西,例如 Natural Join 和 Cross products,但我还没有得出结果,而且我没有想法。

【问题讨论】:

  • 您的描述不清楚。也许您的意思是“他们在表格中出现的每种宠物中都有一个”。如果您不强迫自己在自然语言中清晰,那么您如何期望在 RA 中清晰?或者为了证明某个特定的 RA 表达式表达了你的意思是合理的?你得到的确切的任务措辞是什么? (请注意,如果有更多列,“one”必须是“exactly one”或“at least one”。)

标签: join relational-algebra relational-division


【解决方案1】:

可以通过Division operator找到问题的答案:

人 ÷ π宠物(人)

这个关系代数表达式返回一个只包含name 列的关系,其中包含所有在Persons 表本身中当前拥有所有不同种类宠物的人的姓名。

除法是一个运算符,在某种意义上,它是乘积运算符的逆运算符(名称正是从这一事实派生的)。它是一个派生运算符,可以根据投影、集差和乘积来定义(例如,请参见 answer)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多