属性 song_id、song_name、album_id を含むリレーションと、album_id および album_name を含むリレーションの 2 つがあるという問題があります。曲の関係に曲がないすべてのアルバムの名前を見つける必要があります。問題は、名前の変更、射影、選択、グループ化(合計、最小、最大、カウントを使用)、デカルト積、および自然結合しか使用できないことです。私はこれにかなりの時間を費やしてきましたが、正しい方向に向けてくれた助けをいただければ幸いです。
2 に答える
@ErwinSmoutが指摘したように、違いは一般的に簡単な方法です。ただし、これは使用できないため、カウントを使用する場合は注意が必要な回避策があります。私はalbum_id
、歌の関係に存在するすべてのものが関係にも存在すると仮定していalbums
ます。
PROJECT
曲の関係からのalbum_id(関係代数PROJECT
はSQLと同等であることに注意してくださいSELECT DISTINCT
)。この関係を呼びますsong_albums
。ここで、albums
リレーションのカウントを取得し、これをmと呼び、新しいテーブルのカウントを取得し、これをnと呼びます。
albums関係とsong_albums関係のデカルト積を取ります。この新しい関係にはm*n行があります。ここで、でグループ化されたカウントを行うとalbum_name
、各malbum_name
のカウントはnになります。あまり役に立ちません。
しかし今、私たちSELECT
は関係行からalbums.album_id != song_albums.album_id
。ここで、でグループ化されたカウントを行うalbum_name
と、元の関係になかったアルバムのカウントはsongs
nになりますが、元々そこにあったアルバムのカウントはn未満になります。これは、次の方法に基づいて行が削除されるためです。そのアルバムの多くの曲は元々のsongs
関係にありました。
編集:結局のところ、これは厳密な関係代数の解決策ではありません。SQLでは、を含むテーブルなどの1 x 1テーブルは、n
単純に整数として扱い、等式比較で使用できます。ただし、ウィキペディアによると、選択では、リレーションの2つの属性、または属性と定数値のいずれかを比較する必要があります。
別の不適切なデカルト積によって対処される別の障害:n
最新の関係を含む1x1関係のデカルト積を取ることができます。これで、常にに等しい属性があるため、適切な関係代数を選択できますn
。
これはかなり複雑になっているので、上記の英語の説明をキャプチャした関係代数式を次に示します。
nは、「count」という名前の属性を持つ1x1の関係であることに注意してください。
それは不可能だ。この問題には否定が含まれており、関係代数では、使用が許可されていないように見える関係差を使用してのみ表現できます。
あなたの先生がこの問題の解決策として何を提示するのか、私は興味があります.