差分

ナビゲーションに移動 検索に移動

利用者:Nayuta Ito/プロジェクト・SQL

6,312 バイト追加, 2021年2月25日 (木) 11:23
再開したら温度が上がります。もっと凍結したら温度が下がります。
<font size="6"><b>このプロジェクトは凍結しました。このプロジェクトは本当に完全に凍結しました。 現在の温度: -60℃</b></font>集合関数とか何をどうやって束縛してるんですか...
<s>この記事では、SQLのインタプリタをZFCで実装する。</s>実装しません。複雑すぎました。多分理論上は可能なんじゃないかと思います。ZFCはC言語の亜種ではない。
第2正規形には、主キーの概念を必要とする。
関係表が'''第2正規形'''であるとは、全ての関係スキーマの元が、主キーの元であるか、もしくは「主キーに関数従属するが、主キーのどの真部分集合にも関数従属しない」ことである。であるとは、第1正規形であって、かつ全ての関係スキーマの元が、主キーの元であるか、もしくは「主キーに関数従属するが、主キーのどの真部分集合にも関数従属しない」ことである。
たとえば、関係スキーマが\( \underline{X}, \underline{Y}, F, G, H \)であり、各タプルが\( \{ x_i, y_j, f(y_j), g(x_i, y_j), h(x_i, y_j) \} \)で与えられるような関係表が存在するとき、\( F \)が\( \{ Y \} \)に関数従属するため第2正規形ではない。
これを第2正規形にするためには、この関係表を\( \underline{X}, \underline{Y}, G, H \)と\( \underline{Y}, F \)に分割すればよい。現実における会社で発生しうる例であるが、に分割すればよい。 次の例を考えよう: 全ての数学者と全ての論文にそれぞれ自然数の通し番号を与える。番号\( X i \)が注文番号でが与えられた数学者を数学者\( Y i \)が商品番号に対応するとき、前者は注文された商品の一覧、後者は注文そのものの一覧に対応する<ref>データベースでは「商品の仕入・製造・販売のうち少なくとも1個を行う会社」における例を使用することが多い。</ref>。、番号\( j \)が与えられた論文を論文\( j \)と呼ぶことにする。 関係スキーマが\( \underline{\mathrm{Mathematician}}, \underline{\mathrm{Paper}}, \mathrm{Role}, \mathrm{Length} \)であるような関係表を考える。また、\( \{ (\mathrm{Mathematician}, i), (\mathrm{Paper}, j), (\mathrm{Role}, s), (\mathrm{Length}, t), \} \)がこの関係表のタプルであるとき、次のような条件を満たしているとする: * 数学者\( i \)は論文\( j \)の筆者である。* \( s \)は数学者\( i \)の論文\( j \)での役割を示す(英語などで書かれた)文字列である。* \( t \)は論文\( j \)のページ数である。 このとき、この関係表は第2正規形ではない。なぜなら、\( \mathrm{Length} \)は一元集合\( \mathrm{Paper} \)に関数従属するからである。日常の言葉で言えば、「論文のページ数」は「数学者と論文の組」ではなく論文そのものに対する属性だからである。 これを第2正規形にするには、\( \underline{\mathrm{Mathematician}}, \underline{\mathrm{Paper}}, \mathrm{Role}, \mathrm{Length} \)を\( \underline{\mathrm{Mathematician}}, \underline{\mathrm{Paper}}, \mathrm{Role} \)と\( \underline{\mathrm{Paper}}, \mathrm{Length} \)の2つの関係表に分割すればよい。逆に、この2つの表を1つに戻すためには、\( \mathrm{Paper} \)の値、すなわち論文の番号が同じタプル同士を「結合させて」元の表のタプルを得ればよい。この操作は自然結合と呼ばれるが、それについては後で述べる。
===第3正規形===
関係表が'''第3正規形'''であるとは、第2正規形であって、かつ関係スキーマの任意の互いに交わらないどれもが空でない部分集合\( A, B, C \)が、「\( C \)は\( B \)に関数従属し、かつ\( B \)は\( A \)に関数従属する」という条件を満たさないことである。
 
たとえば、関係スキーマが\( \underline{X}, \underline{Y}, F, G \)であり、各タプルが\( \{ x_i, y_j, f(x_i, y_i), g(f(x_i, y_i)) \} \)で与えられるような関係表が存在するとき、\( G \)が\( F \)に関数従属するため第3正規形ではない。
 
これを第3正規形にするためには、この関係表を\( \underline{X}, \underline{Y}, F \)と\( \underline{F}, G \)に分割すればよい。
 
次の例を考えよう:
 
第2正規形の例で用意した論文の通し番号をここでも使う。関係スキーマを\( \underline{\mathrm{Paper}}, \mathrm{Date}, \mathrm{Weekday} \)とする。\( \{ (\mathrm{Paper}, j), (\mathrm{Date}, d), (\mathrm{Weekday}, w), \} \)がこの関係表のタプルであるとき、次のような条件を満たしているとする:
 
* \( d \)は論文\( j \)の発表日を示す(YYYY-MM-DDのような形式の)文字列である。
* \( w \)は\( d \)の曜日を表す整数である。月曜日を\( 1 \)とし、日曜日を\( 7 \)とする。<ref>これはISO 8601という国際規格で定義されている。</ref>
 
この関係表は第3正規形ではない。なぜなら、\( \mathrm{Weekday} \)は\( \mathrm{Date} \)に関数従属し、\( \mathrm{Date} \)は\( \mathrm{Paper} \)に関数従属するからである。日常の言葉で言えば、曜日は論文ではなく日付に対する属性だからである。
 
これを第3正規形にするには、\( \underline{\mathrm{Paper}}, \mathrm{Date}, \mathrm{Weekday} \)を\( \underline{\mathrm{Paper}}, \mathrm{Date} \)と\( \underline{\mathrm{Date}}, \mathrm{Weekday} \)の2つの関係表に分割すればよい。逆に、この2つの表を1つに戻すためには、第2正規形を第1正規形にしたときと同じように自然結合を行えばよい。
===ボイス・コッド正規形===
関係表が'''ボイス・コッド<ref>「ボイスさんとコッドさん」であって「ボイスコッドさん」ではない。「ルンゲクッタ」と同じようなものである。</ref>正規形'''であるとは、任意の関係スキーマの部分集合\( A, B \)に対し、\( B \)が\( A \)に関数従属するならば、次の2つの少なくとも1つ(論理的OR)を満たしていることである:
===第4正規形===* \( B \subset A \)* \( A \)はスーパーキー
次の関係表を考える: <table border="1"><caption>\( T \)</caption> <tr bgcolor ==第5正規形==="bisque"><td>\( \underline{\mathrm{A}} \)</td><td>\( \underline{\mathrm{B}} \)</td><td>\( \mathrm{C} \)</td><td>\( \mathrm{D} \)</td></tr><tr><td>\( 1 \)</td><td>\( x \)</td><td>\( a \)</td><td>\( 2 \)</td></tr><tr><td>\( 1 \)</td><td>\( z \)</td><td>\( c \)</td><td>\( 3 \)</td></tr><tr><td>\( 2 \)</td><td>\( x \)</td><td>\( d \)</td><td>\( 1 \)</td></tr><tr><td>\( 2 \)</td><td>\( y \)</td><td>\( b \)</td><td>\( 1 \)</td></tr><tr><td>\( 2 \)</td><td>\( z \)</td><td>\( c \)</td><td>\( 4 \)</td></tr><tr><td>\( 3 \)</td><td>\( x \)</td><td>\( d \)</td><td>\( 4 \)</td></tr><tr><td>\( 3 \)</td><td>\( z \)</td><td>\( c \)</td><td>\( 5 \)</td></tr></table> この関係表は第3正規形であるが、ボイス・コッド正規形ではない。なぜならば、\( \mathrm{B} \)は\( \mathrm{C} \)に関数従属する(\( \mathrm{C} \)列の値から\( \mathrm{B} \)列の値が一意に決まる)が、\( \{ \mathrm{C} \} \subset \{ \mathrm{B} \} \)ではなく、かつ\( \{ \mathrm{C} \} \)はスーパーキーではないからである。 これをボイス・コッド正規形にするためには、\( \{ \mathrm{A}, \mathrm{B} \} \)ではなく\( \{ \mathrm{A}, \mathrm{C} \} \)を主キーにすればよい。すると、第2正規形ですらなくなるため、第2正規形、第3正規形、ボイス・コッド正規形にする手続きを再帰的に行う。この手続きは有限回で終了し<ref>この記事では列数が有限の場合のみを考える。</ref>、最終的にボイス・コッド正規形が得られる。 私は第4・第5正規形をZFCに実装する驚くべき方法を発見したが、それを記すにはこの余白は狭すぎる。
==SQL==
凍結しました。SQLは次のような形式を持つ\( \mathbb{S}^* \)の元である。 $$ \mathrm{SELECT}\ L_1\ \mathrm{FROM}\ T\ [\mathrm{WHERE}\ \psi]\ [\mathrm{GROUP\ BY}\ L_2]\ [\mathrm{HAVING}\ \phi]\ [\mathrm{ORDER\ BY}\ L_3] $$ []内はあってもなくてもよい。また、記号で察した通りSQLには述語論理が組み込まれている。変数を束縛する順はFROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BYらしい。<font size="2">p進大好きbotが匙を投げるレベル</font>
==結論==
Wikiいけめん
217

回編集

案内メニュー