#はじめてのテーブル定義作成
初めて独力でウェブアプリを作成するので、テーブル定義書を作成したが、うまく作れなかった。
特に、外部キー(FK)に関する理解が薄くER図が作れなかった。
(親エンティティの主キー(PK)にしか外部キーを張れなかった。)
先輩のエンジニアやネット上で相談したところ、
- 依存リレーションシップ
- サロゲートキー
- ナチュラルキー
について理解するように指導して貰ったので、学んだことをアウトプットする。
##サロゲートキー
連番となるような、(例えば自動採番する)カラムを用意して主キーとする。これをサロゲートキーと呼ぶ。
ナチュラルキーには、別途、ユニーク制約を付与する。
##ナチュラルキー
業務的にそのテーブルをユニークにするキー
「患者名+部屋番号+ベッド番号」のように、サロゲートキーと違い、項目の内容自体が意味を持つ。
##依存リレーションシップ
親エンティティが存在しなければ、子エンティティが存在しえないもの。
言い方を変えれば、親エンティティのPKをたどると、子エンティティが参照できるもの。
また、依存リレーションシップでは、ER図を書く際には、PKにFKを指定しなければならない。
##なぜER図が作れなかったのか
ER図の作成には、ツールの「A5:SQL Mk-2」を用いてxamppのphpMyAdminで作ったDBからER図をリバース生成した。
A5:SQL Mk-2では、カーディナルのプロパティに**☑依存(親ー>子)**のチェックボックスがあり、
チェックされた状態では、PKにしかリレーションを張れない。
なので、PKに指定されていないキーにFKを張ろうとしたのに、PKに貼られてしまうという事態が生じた。
##解決方法
カーディナルの依存のチェックを外すか、PKでないキーに対してリレーションを張ればよいが、わたしのミスはもっと単純で、本来FKを張るべきでないエンティティに対して、FKを張ろうとしていたので、対する誤ったエンティティーのPKにリレーションが張られていた。
###下記のサイトと先輩の言葉を参考にしました。
- http://dbflute.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html
- https://thinkit.co.jp/free/tech/31/2/1.html
- http://d.hatena.ne.jp/simply-k/20100709/1278665985
ありがとうございました。