複数の表、関係、UML

Menu Menu


表の分割

一つの大きな表を使うといろいろ不都合がある

    (a) 空白のところがたくさん出る
    (b) ある値を追加したい場合に、他のレコードの値をコピーする必要がある
    (c) ある値を変更したい場合に、他のレコードの値も変更する必要がある
    (d) ある特定のレコードを変更したいのに、レコードを特定できず複数の値を変更してしまう

これらは、

    ○○の値を変更/削除したい/追加したいしたい

という場合に起きる。

(a) は関係ない属性同士が一つのレコードに入っていることから起きる。

この問題は表を分割することで解決できる場合がある。

表をどのように分割すれば良いのか? その一つの指針は関数従属性である。

(d) は、変更するべきレコード(タプル)を特定できないところに問題がある。これは、表にインデックスがないからである。表のレコードを特定できる属性をキーと言う。レコードを特定できる最小の属性を候補キー(Candidate Key)と言う。


属性と関数従属性

ユースケースを見ると、

    対象物(Object)の値を変える

と言うことが多い。これは、

    Object → 属性値

と言う関係があることを示している。

例えば、

    ゲームキャラクターを指定すると、そのHPがわかる
    ユーザには、決まったパスワードが唯一ある

などである。

例えば、password という関数があって、String である ユーザ名から、そのユーザのパスワードを返すと考えても良い。

    password : String -> String 

データベースは、こういう関数を決めている場合がある。

これを関数従属性と言う。矢印の左を関数従属性の入力、右を出力と言う。

データベースのレコードの変更は、

    ○○の××と言う値を変更する

と言うことが多い。つまりレコードの変更は、関数従属性にそって行われる。


属性値

属性の型は、数値や文字列である。

属性値が集合の場合もあるが、SQL では扱わないのが普通。

カンマで区切った文字列とかで集合を表すこともできるが、その一部とかを探すには線形探索が必要となる。

属性値が集合ではなく、単一の値となるようにすると、そのデータベースは第一正規形と呼ばれる。


関数従属性とキー

関数従属性は「○○の属性を持つレコード」を特定することに他ならないので、関数従属性の入力はキーであるべきだということがわかる。


レコードの特定

すべての表にレコードを特定できるキーがある時に、そのデータベースは第二正規形であると言う。

    Rのすべての非キー属性はRの各候補キーに完全関数従属している


クラス図

タプルの関係を図示するには、クラス図を使うのが良い。

表は関係(Relation)とも呼ばれる。Relational Database (関係データベース)という名前の元である。

表の名前(属性1, 属性2, 属性3)

というように表すのが簡単である。キーには下線を引く。

クラス図では、表の名前と属性と属性の型、そして、表の間の関係を記述する


表の間の関係

表の中のレコードは他の表とさまざまな関係にある

    1対1
    1対多
    多対1
    多対多

他の表のレコードと1対1の関係がある場合は、相手の表のキーを自分の表の属性に含めれば良い。

この時に、相手の表にない値を自分の属性にいれてはならない。これを外部キー制約と言う。

多対多の場合は、そういう方法では関係を実現できない。

ここでは、クラス図では関係を表す単純な線のみを扱う。


関係を表す表

多対多を表す場合は、関係を表す表を新しく導入する。多対多の表は、関係を表す属性の組を全部キーとすることになるが、そのままで使いにくい。


問題1

関係を表す表

ID

名前とレコードが直接対応しない場合もある。例えば同姓同名の場合。

そこで、人為的な数値を導入してキーとする場合がある。

UMLのクラス図だと、IDを導入することが多い。

32bit のIDだと、 いくつのオブジェクトを表すことができるか?


問題2

自分の設計したデータベースの中の関数従属性とキーとなる属性を示せ

ネットワークゲームの関数従属性とキー


表の分割

表の分割は、関数従属性に従っておこなう。

クラス図の中に出て来るオブジェクトの直観に従って作成しても良いが、オブジェクトの属性間に関数従属性があるかどうかには注意する必要がある。


表/オブジェクトの中の関数従属性

一つの表の中に複数の関数従属性がある時がある。

    A → B, B → C

という連続した関数従属性を推移従属性と言う。

また、まったく独立な関数従属性が複数ある場合もある。

    A → B, C → D

一つの表に複数の関数従属性があると、その入力を両方してやらないと空白値や複製が出て来てしまう。データの変更は関数従属性毎に行われるのが普通なので、これは不都合なことになる。

この場合、独立した関数従属性毎に表を分解してやれば良い。

推移従属性がないように表を分割したデータベースを第三正規形と言う。

    Rのすべての非キー属性はRのいかなる候補キーにも推移的に従属しない

関数従属性の入力が、必ず、ある表のキーである場合に、データベースはBoyce-Codd 標準型であると言う。


問題3

自分の設計したデータベースを第三正規形またはBC正規形になるように表を分割せよ。

ネットワークゲームのデータベースを正規化する


Shinji KONO / Fri Jan 20 10:30:48 2012