10

リレーショナル代数におけるシータ結合の概念の明確で基本的な説明と、その使用法を説明するための例 (おそらく SQL を使用) を探しています。

私が正しく理解している場合、シータ結合は条件が追加された自然結合です。したがって、自然結合は同じ名前の属性間で同等性を強制しますが (重複を削除しますか?)、シータ結合は同じことを行いますが、追加します状態で。私はこれの権利を持っていますか?簡単な言葉で(非数学者にとって)明確な説明をいただければ幸いです。

また(最後にこれを入れて申し訳ありませんが、関連するものです)、誰かがデカルト積の重要性または考え方を説明できますか?基本的な概念に関して何かが欠けていると思います。なぜなら、それは基本的な事実、つまり 13 のセット X 4 のセット = 52 を言い換えているように思えるからです...

4

4 に答える 4

12

SQL はしばらく脇に置いておきます...

関係演算子は、1 つ以上の関係をパラメーターとして取り、結果として関係を生成します。定義上、関係には重複する名前を持つ属性がないため、関係操作シータ結合と自然結合はどちらも「重複する属性を削除」します。[あなたが要求したように、リレーション操作を説明するために SQL で例を投稿することの大きな問題は、SQL クエリの結果がリレーションではないことです。これは、他の罪の中で、行や列が重複する可能性があるためです。]

関係デカルト積演算 (結果が関係になる) は、セットデカルト積 (結果がペアのセットになる) とは異なります。「デカルト」という言葉は、ここでは特に役に立ちません。実際、コッドは原始演算子を「製品」と呼んだ。

真のリレーショナル言語のチュートリアル Dには積演算子がなく、製品はチュートリアル D の共著者であるヒュー ダーウェン** によって提案されたリレーショナル代数の原始演算子ではありません。これは、共通の属性名を持たない 2 つのリレーションの自然結合は、同じ 2 つのリレーションの積と同じリレーションになるためです。つまり、自然結合はより一般的であり、したがってより便利です。

次の例を検討してください (チュートリアル D):

WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
     RELATION { TUPLE { X 1 } , TUPLE { X 2 } } AS R2 :
R1 JOIN R2

リレーションシップの積、つまり次数 2 (つまり、2 つの属性XY) とカーディナリティ 6 (2 x 3 = 6 タプル) の積を返します。

でも、

WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
     RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } } AS R2 :
R1 JOIN R2

リレーションの自然結合、つまり次数 1 (つまり、1 つの属性を生成する属性のセット ユニオンY) とカーディナリティ 2 (つまり、重複するタプルの削除) を返します。

上記の例が、「13 のセット X 4 のセット = 52」というあなたのステートメントが厳密に正しくない理由を説明してくれることを願っています。

同様に、チュートリアル D には theta 結合演算子が含まれていません。これは基本的に、他の演算子 (自然結合や制限など) が不要であり、あまり役に立たないためです。対照的に、コッドのプリミティブ演算子には、シータ結合を実行するために使用できる積と制限が含まれていました。


SQL には、CROSS JOIN重複する列 (属性) を作成して 1NF に違反することを伴う場合でも、結果を強制的に積にするという名前の明示的な積演算子があります。上記の後者のチュートリアル D の例に相当する SQL を考えてみましょう。

WITH R1 AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (Y)), 
     R2 AS (SELECT * FROM (VALUES (1), (2)) AS T (Y))
SELECT * 
  FROM R1 CROSS JOIN R2;

これは、(1 つの属性ではなく) 2 つの列Y(!!) と 6 つの行を持つテーブル式を返します。

SELECT c1 AS Y, c2 AS Y 
  FROM (VALUES (1, 1), 
               (2, 1), 
               (3, 1), 
               (1, 2), 
               (2, 2), 
               (3, 2)
       ) AS T (c1, c2);

** つまり、リレーショナル モデルは 1 つしかありませんが (つまり、Codd のモデル)、複数のリレーショナル代数が存在する可能性があります (つまり、Codd のモデルは 1 つだけです)。

于 2011-09-27T06:03:37.900 に答える
3

あなたはまったく正しくありません-シータ結合は、通常、SQLなどで-以外の条件を含む可能性のある結合です.TechNetを参照ください=<>=

デカルト積 (またはCROSS JOIN) に関しては、アイデアや概念ではなく操作です。時々使う必要があるので重要です!set of 13 x set of 4 = 52、デカルト積はこの事実に基づいているというのは基本的な事実です。

于 2011-09-27T03:11:21.233 に答える
2

私の意見では、簡単に言うと、等結合を理解していれば、シータ結合を理解する必要があると思います。等結合の記号 = (等しい) を >= に変更すると、シータ結合が既に行われています。ただし、通常使用する結合原因は V.primarykey = C.foreignkey であるため、等結合に比べて theta 結合を使用する実用性はかなり難しいと思います。また、シータ結合に変更する場合は、選択を行っているため、値に依存する場合があります。

自然結合の場合は、等結合に似ていますが、違いは冗長な属性を取り除くことだけです。簡単!:)

この説明がお役に立てば幸いです。

于 2012-02-09T08:23:57.157 に答える
0

すべての結合は、外積から始まり、特定の行を取り除くものと考えることができます。自然結合では、結合される 2 つのテーブルの同じ名前の列が異なる値を持つすべての行が除外されます。等結合は、指定された列の値が異なるすべての行を取り除きます。そして、theta-join は、指定された列が指定された関係 (<、>、または何でも。原則として、文字列間の関係として is_prefix_of である可能性があります) に含まれていないすべての行を除外します。

更新:外部結合は、何もないところから情報 (つまり、null) を合成するため、このように理解できないことに注意してください。

于 2019-05-31T00:51:54.907 に答える