- ベストアンサー
ER図の外部キー
はじめまして ER図の書き方でFK(外部キー)として記載できるもしくは そう呼べるのはinnodbでの環境に限るのでしょうか? mysqlでmyisamにて構築しているのですが 例えば注文テーブルに商品IDや顧客ID、受注スタッフID、発注スタッフID等の カラムがあったとして、そらぞれのカラムは商品テーブル、顧客テーブル、 スタッフテーブルのプライマリーキーです。 この場合、商品IDは外部キーと呼べるのでしょうか。 また発注スタッフIDが必ず登録されているとは限らないのですがこれも外部キー と呼べるのでしょうか。 よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
実装としての外部キー制約と、モデリングをしている時の外部キーとしての表記は分けて考えましょう。 モデリングをしている時に、属性間の関係を設計する時には、採用するデータベースシステムが外部キー制約をサポートしているかに関わらず、ちゃんと関係を明記するべきです。 ER図に記載された関係を、実データベースで制約として明記できるかどうかは、実装の時に考えることで、これは、ER図が完成してから評価することです。 外部キーの要件は、次の通り。 ・参照する側の属性に指定された値は、必ず参照される側の属性の値として存在しなくてはいけない。 ・参照する側の属性に指定された値で、必ず参照される側の列が一意に定まらなくてはならない。 発注スタッフIDが存在するとは限らないと言うことは、一つ目の要件に反します。この関係が外部キー制約として実装されているとすると、そのような発注スタッフIDを持つレコードは、注文テーブルに登録することが出来ません。 商品IDについても同じように考えてください。
その他の回答 (1)
- mitoneko
- ベストアンサー率58% (469/798)
あぁ。そういう事ですね。 なら、ありです。 外部キー制約をかけた子表(参照する側)の該当属性に対してNULLを禁止することはありません。・・・本来NULLの意味からすると、NULLはいかなる値とも等しくないので、当然外部キー指定のある属性値にはなり得ないのですが、これは、許容されています。 ただし、select 文で内部結合を使って、注文テーブルとスタッフテーブルを結合すると、その発注スタッフIDがNULLのレコードは、結果として帰ってこないことに注意が必要です。内部結合では、結合対象のいずれかのフィールドがNULLだと、どのような結合条件であったとしても、必ず条件が不成立となるからです。これは、NULLを対象とした比較演算子の結果から導かれます。
お礼
ご丁寧な回答頂き、助かりました。 どうもありがとうございました。
補足
早速の回答有難うございます。 私の説明が悪かったのですが、発注スタッフIDが存在しないというのはスタッフのマスターテーブルにはあります。ただ受注はしたが未発注の場合などのように、注文テーブルにはNULLで登録されるレコードがある場合のことです。これも外部キーと表記してもよいという事でしょうか。 よろしくお願いします