ER図は、普通は、エンティティとその関係を示せばいいだけなのですが、
エンティティの中に、項目名を入れて、どの項目と、どの項目が具体的に関係しているのかを示すような図にすることもあります。
で、そういう場合、どのように表現して、関係を表すのですか?と、質問されました。
今日は、その方法と、問題点について
■■ 方法
まず、あるエンティティとあるエンティティが関係あるとき、そのエンティティがテーブルだとしたら、どういう風になるか?というと、
●完全に正規化されていれば
一方のテーブルの主キーが、他方のテーブルの外部キーとなっています。
●正規化されていないと
一方のテーブルの主キーが、他方のテーブルの外部キーとなっています。
それ以外の項目でも、両方のテーブルに、同じ項目(で同じ値)が入っています。
ということは、ER図に項目を描いたとき、主キーと、外部キーが判ればいいということになります。
■■ 表現方法
●T字型ERの場合
佐藤正美氏のT字型ERなら、主キーは左側に出てくるし、外部キーには、たしか、(R)ってつきませんでしたっけ?なので、明示できます。
●それ以外のER図の場合
それ以外の場合、
主キーの下に、下線
外部キーの後に(FK)と書いておいてくれれば、わかります。
たとえば、受注が
受注 |
受注ID 受注日 得意先ID(FK) |
受注明細 |
受注ID(FK) 明細行 商品No(FK) 単価 数量 |
みたいなかんじ。
ここで、受注明細の受注IDにFKとなっているほかに、下線がついてますが、
これは、受注明細は
受注ID 12001 の明細行 1
受注ID 12001 の明細行 2
受注ID 12001 の明細行 3
というふうに、受注IDの何行目かで表現するような場合、
受注IDと、明細行の両方をあわせて一意になるので、この2つとも、主キー(=2つとも線が引かれる)なのですが、このうち、受注IDは、受注の主キーなので、明細では、外部キーとなります。
つまり、受注IDは、主キー(の一部)と外部キーの両方になります。こういうことは、あり得ます。
■■ この表記法の問題点
この場合、主キーと外部キーの名称が一緒なら、その項目が同じということで関連がわかります。逆に言うと
(1)2つのテーブルで、いっぽうは主キー、もう一方は、外部キーという関係になっているのに、項目名がテーブルによって違う場合
(2)2つのテーブルで、同じ項目名があるんだけど、意味が違うとき、関係しているのかいないのか、わかんない
という2つのケースで困ります。
(1)は、たとえば、会社エンティティで、会社IDと書いてあり、受注エンティティで、得意先IDとなっているときです。まあ、類推すれば、わかることが多いので、実際はあんまり問題になりませんけどね。
(2)は、「金額」と書いてあるだけのときです。
これは、正規化していいのかどうかで、問題になります。
よく、問題になるのは、商品テーブルの「単価」と、受注明細の「単価」。
受注明細の単価はいらないのではないか?という議論。
これは、たしか、前にも書いたけど。
商品テーブルの単価は、現在の商品単価
受注明細の単価は、受注時の商品単価
で、別のもの。なので、同じ名前だけど、違うものなので、正規化して項目を消すことはできないというもの。
で、この対応策として、「単価」とか、わからないのは、なくそう!という意見がある。
これは、項目名=エンティティ名+属性とすると、たしかに区別はつく。
ここで、属性は単価。なので、商品テーブルにある単価は、商品単価
受注明細にある単価は、受注(明細)単価などと、表現するもの。
たしかに、こうすると、わかりやすいけど、おまぬけになるケースがある。
テーブル名がめちゃくちゃ長くて、わかりにくい場合。
【例】プログラム管理テーブルの項目名
プログラム管理No
プログラム管理プログラム名
プログラム管理登録日
プログラム管理登録者名
プログラム管理利用ファイル明細の項目名
プログラム管理No(FK)
プログラム管理利用ファイル明細ID
プログラム管理利用ファイル利用ファイル名??
。。。なんじゃそりゃ??
なので、自分のテーブルのときは、エンティティ名はいらないよね。。ということになると、たしかに、自分のテーブルの中では
プログラム管理利用ファイル明細の項目名
プログラム管理No(FK)
明細ID
利用ファイル名
とわかりやすくなるが、ほかのテーブルの外部キーになったとき、「利用ファイル」と書かれても、「何の?」となってしまい、そこで、「プログラム管理利用ファイル利用ファイル名」と書くと、やっぱ、さっぱりわかんないからあ。。
じゃあ、いっそのこと、「FK110利用ファイル名」とか、数字にしちゃえば!というと、そういう名前の付け方はいけないという人がでて。。。
ということで、困ったりするのだよ。。
でも、その話は、項目名を、フルネームにするか、数字などで表現するかの問題(まあ、昔は、ハンガリアン記法なんつーのもあったわけだが、あ、コンササイズコードっていうのもあったような)になってくるわけなんで、それは、今回のER図の話とは、まったく違うので、別の機会に覚えていたら。。