情報を取り出すには適切なデータベースの枠組みが必要である。 データベースの枠組みをデータベーススキーマと呼ぶ。
関係データベースでは、2 次元表の属性を何にするか、が重要である。 これをデータベースの論理設計と呼ぶ。 関係スキーマは、関係名と属性を記述した情報のこと。
データベースの構造が理解しやすい場合は、 データ更新にも矛盾が生じにくい。
関係表の論理モデルによる設計は、ER 図の設計と 2 段階を踏んで行われる。
オブジェクトデータベースという、 オブジェクト指向プログラミング言語を用いたデータベースアプリケーション開 発もある。
ER 図を用いた関係データベースの設計は以下のとおり。
1 は行わない。 2 を変更し、対象を関係モデルで記述したあと、3 を行う。
1 をオブジェクト指向モデルを用いる。 2 は ER 図よりも自由度が高いため、 複雑になる。
対象をオブジェクト指向モデルで記述し、そのまま結果をデータベースのスキーマ情報に する。段階を踏まない設計が可能である。
ただし、関係データベースのような正規化など、 よいスキーマを探す手順が確立されていない。
以前作成した、部分的にデータを取り出す Ruby 言語のプログラムはこちら。 これを時間割に表示するように変更しよう。
必要なキーは、教員名と、前期後期の別である。 取り出すには、例えば このように する。
ER 図を用いた関係データベースの検討をするために、 更新異常が発生した場合を考えよう。
データ {教員名, 曜日, 時限, 時期, 科目, 教室}
について考えよう。
この問題は、関係表を適切に分割することで、解決ができる。 これを正規化という。
段階を踏む。
まずは ER 図を作る。
2 次元表を打ち出す。
同じレコードに 2 つの情報が , でつながれていたら、分離する。
関係 R において、部分集合 X, Y がある場合、 X が決まると Y が決まる場合を関数従属という。
Y が X に関係従属であり、かつ X の真部分集合には関数従属でないとき、 Y が X に完全関数従属するという。 真部分集合とは、X の部分集合が X と同一ではないとき、である。
全ての属性は主キーに関数従属である。 関数従属の関係は内容が更新されても変更されない。
関係スキーマ R の部分集合 S, T を考えたとき
R = S + T
が可能であるとき、S, T は Rの分解。分解された関係を関係表に射影する。 もとの関係 R を S と T の結合で表すことができる。
一般には損失が発生することがあるが、 自然結合によりもとの関係を得られるとき、 無損失分解とよぶ。 正規化では無損失分解を行う。
関数従属に基づく正規形の中で、 第 2 正規形、第 3 正規形について解説する。
第 2 正規形: 第 1 正規形でかつキーでない属性が各候補キーに完全関係従属していること。
関数従属である候補キーが存在するとき、 情報の重複による更新異常が発生することがある。 無損失分解によって、第 2 正規形に分解する。
推移的関数従属: 関係の属性間に X -> Y, Y -> Z という関数従属性があるとする。
2 つの 2 次元表を製作する。 それぞれから選んで結果を出すような例を考えよ。
次回作成したものを発表する。
2 種類の表を使うときは、 . でつないで表す。
属性.表
LIKE %foo で *foo を、LIKE var% で var* を、LIKE %baz% で *baz* を検索。
空白文字が含まれている場合は trim(属性) が必要。