読者です 読者をやめる 読者になる 読者になる

Jの衝動書き日記

さらりーまんSEの日記でございます。

 第4回 関連とは何か?

データベースのワンポイント

今回も、データベースの理論的な話である。これもデータベーススペシャリスト試験で苦手な分野だが、そもそもどういうものかきちんと理解していない気がするのでまとめてみた。故に誤りがあるかもしれない。しかもわかり易いとも言い難い。出来れば試験の前にもう一度改めてエントリーを書きたい。たぶん、試験前ならば理解できている・・・はずである。

1.関連の意味は?

辞書をひくと、関連とは物事の間に関わりあいがあること、と書いてある。関わりあいとはつながり、関係があること、とも書いてある。お互いに何らかの影響が生じる何か、ということだろうか。
AとBが関連する、ということは、AとBの間に成立する何かがあるということだ。逆に関連がないということは、お互いに独立している、影響を及ぼさないということである。
物事の間の関わりでは範囲が広すぎるが、データベースの世界では、この物事とはエンティティを指す。データベースではエンティティ間で影響しあう、何らかのものが関連(Releationship)ということになる。
エンティティ間で影響しあう何かということは、前提としてエンティティが存在することを意味する。つまり関連が単独で存在することはない。ある2つの要素が揃って初めて存在するものが関連なのだ。

2.関連の前にまずはエンティティ

エンティティ間に成立するのが関連。では、エンティティとは何か? 
これは、管理対象となるデータを管理する単位、データベース的には表、のことである。管理対象となるデータのかたまり、集合だ。
エンティティが管理対象とするデータは、その単位で独立性が高く、その要素間で結びつきが強いものである。エンティティの要素間には関数従属性があり、自分以外のすべてのものを特定するための要素、主キーが必ず存在する。エンティティ内部で成立する結びつきは、関連とは言わないので注意が必要だ(正確には関係、リレーションという)。エンティティ間で成立するのが関連である。エンティティXの要素xとエンティティYの要素yは関わりzを持つ → そのzを集合化したものが関連といえる。関数従属性は属性間で成立するものであり、エンティティ間で成立する関連とは性質は似ているが範囲が狭い。
エンティティには大きく分けて3つの種類に分けられる。
一つ目は、核エンティティ。独立して存在することが可能なエンティティのことである。基本的に核エンティティ中のデータは、他のエンティティの存在が前提になったりはしない(業務上、プログラミング上ではそういう管理はありえるが、データベースのモデル的にはない)。故に、他のエンティティ要素は入りえない(一対一だとあり得るが、その項目はNULL可となるはず)。もし、核エンティティの属性の一部(主キー)が他のエンティティに入る場合、そこには関連があるといえる。
二つ目は、記述エンティティ。エンティティの存在自体が、他のエンティティに依存しているエンティティのことである。故に、存在前提となるエンティティと強い関連を持つ。自分自身の属性として、存在前提となるエンティティの属性を合わせもつ。関連の多重度において(自身の要素一つにつき、関連する相手の要素がいくつあるかということ)通常は、一体多の多側になる。
三つ目は、連関エンティティ。エンティティ間に成立するのが関連だが、その関連自体が独立して属性を持っていた場合に、そのかたまりをエンティティとして定義したものである。
関連が属性を持つというのはどういうことなのか? それは、例えば核エンティティ同士で関連が成立する場合を想定してみるとわかり易い。
関連する核エンティティは、その性質から、お互いに相手の属性の要素を持ち得ない。相手の属性を持つということは、相手に依存するということだからである。一方、関連はエンティティの要素が2つ揃って初めて存在できるものである。2つ揃って何かが生じる時、その情報は関連の属性と見なした方がすっきりする。
例えば、仕入れ会社と商品というエンティティが存在し、その間に発注するという関連があった場合、発注日などは、仕入れ会社や商品に入れるよりも、発注というエンティティを作った方が都合がよい。連関エンティティは、その性質上、必ず関連するエンティティを持つ。
何が言いたいかというと、関連を見極めるためには、前提としてエンティティの抽出が行えなければ話にならないということである。

3.関連を見つける手引き

絶対的な法則があるのであれば是非知りたいところだが、あいにく知らないので基礎的な指針だけ載せておく。確かなことは、正解となるエンティティは存在しないということだ。システム上求める条件により柔軟に変える必要もあるし、関連性のあるデータの見極めもまた難しい。必要なことは、試行錯誤を繰り返して、都合のよいエンティティと関連を作り上げることである。

  • エンティティの抽出方法

名詞として現れる言葉は基本的にエンティティの属性候補として成りえる。これを集めたものがエンティティとなる。まとめる単位がわからなければ、とりあえずひとまとめにして構わない。その後、その中で独立性が強い属性集合を見つけて分離すればよい。

  • 関連の抽出方法その1

関連は動詞として現れることが多い。これは、動詞が名詞と名詞を結びつける言葉だからである。例えば、「会社は人を雇う。」これは、人と会社は雇うという関連で結びついているとも言える。ただし、単独で使用できる(いわゆる自動詞)は関連にはなりにくい。結びつける名詞がないからだ。

  • 関連の抽出方法その2

ロールを見つけるというやりかたもある。ロールとは、関連が成立するエンティティA、Bにおいて、AからみたBの役割、Bから見たAの役割をいう。「会社は人を雇う。」では、人エンティティから見て会社エンティティは雇用者、会社エンティティから見て人は従業員とかになる。エンティティの属性候補となっている名詞が、別の名称で他のエンティティの属性候補の中に存在する場合、それは関連のロール候補と見てよいし、そのエンティティ間で関連がある可能性が高い。
 
・・いや、まあ、実際の試験ではこんなに詳細に分析している暇なんてないのだけど。試験上のコツも載せておく。

  • エンティティの種類を見極める

定義済のエンティティが核エンティティか、記述エンティティか、連関エンティティかを見極める。エンティティ間の関連が多対多ならば、連関エンティティが存在する可能性が高いし(というか、データベース上では多対多というのは表現できないので、モデル上で必ず1対多にしているはずである)、連関エンティティがすでにあるのであれば、対応するエンティティが必ず(記述上)近くにいるはずである。

参考文献

  • データベーススペシャリスト完全攻略テキスト