“At least one” clause in Relational Algebra
-
16-10-2019 - |
Question
I'm fairly new to the syntax of relational algebra, and I'm having a hard time understanding how I could set a "at least one" clause.
Example: I have:
- a table with books (listing the title, year published and ID),
- a table with authors (listing their name and ID),
- a table which lists what author wrote what book (through a tuple of the IDs mentioned before).
How could I, in relational algebra, get "All the authors that have published at least one book per year between 2008 and 2010"?
I have figured this so far. At step "b", the Natural join is used since both tables have PublicationID in common. Thus, the resulting table is |PublicationID|AuthorID|Year|. So I'm simply missing the step "c", where I don't understand how to gather a sub-set of the authors that published at least one book per year between 2008 and 2010.
$ a \leftarrow \pi_{PublicationID,Year} (Publication)$
$ b \leftarrow a \bowtie AuthorPublication $
$ c \leftarrow \sigma_{something} $
Solution
A first hint toward a solution is to think about "what's the result of a natural join between $Author$, $Publication$ and $AuthorPublication$?" The answer is "the universal relation" $R(BookID,AuthorID,Title,Year,Name)$ describing who wrote a book and when. Note that a book without any author or an author without any book written won't appear in $R$. So an author in $R$ as written at least one book. The following query gives the authors who wrote at least a book in year 2008: $$ \pi_{Name}(Author \Join AuthorPublication \Join \sigma_{(2008 = year)}(Publication))$$
For the final answer, compute the intersection of this query with its variants: $$ \pi_{Name}(Author \Join AuthorPublication \Join \sigma_{(2008 = year)}(Publication)) \cap \pi_{Name}(Author \Join AuthorPublication \Join \sigma_{(2009 = year)}(Publication)) \cap \pi_{Name}(Author \Join AuthorPublication \Join \sigma_{(2010 = year)}(Publication))$$
You may provide other equivalent answers with outer $Author \Join$.
OTHER TIPS
This is an answer by the OP, which is removed from the question.
A friend gave me a tip and a possible solution appeared:
For Author(Name,AuthorID) | Publication(Title,Year,BookID) | AuthorPublication(BookID,AuthorID)
$ RenamedAP = \alpha_{(AuthorID:linkAuthorID, PublicationID:linkPubID)} (AuthorPublication) $
$Mix \leftarrow RenamedAP \times Author \times Publication $
$Mix2 \leftarrow \sigma_{(AuthorID=linkAuthorID \wedge PublicationID = linkPubID)} (Mix) $
$ Y2008 \leftarrow \sigma_{(Year=2008)} (Mix2)$
$ Y2009 \leftarrow \sigma_{(Year=2009)} (Mix2)$
$Y2010 \leftarrow \sigma_{(Year=2010)} (Mix2) $
$ Subresult \leftarrow Y2008 \cap Y2009 \cap Y2010 $
$ Result \leftarrow \pi_{Name} (Subresult) $ \