落とし穴に立て札を立てるが如く

ハマりどころの解決が少しでも早くなることを願って書いていきます

ボイスコッド正規形について自分用まとめ その2

f:id:nam_yu_sql:20191223161950j:plain


 

namyusql.hatenablog.com

 前回はボイスコッド正規形について、特徴、メリット、作り方といった基礎的な内容について書いた。

今回は、その補足的なトピックとして、ボイスコッド正規形を作る際に気を付けるべきことと、ボイスコッド正規形で起きうる問題について取り扱う。

ボイスコッド正規形を作る際に気を付けるべきこと

第三正規形からボイスコッド正規形にしようとしてテーブルを分けるとき、それがボイスコッド正規形になっていない例が前回も紹介した書籍に挙げられている。

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

 

ボイスコッド正規形にするための正しいテーブルの分け方は社員ID-チーム補佐、チームコード-チーム補佐であった。

しかし、もし社員ID、チームコード、チーム補佐の例で、社員ID-チームコード、チーム補佐-チームコードでテーブルを分けていたらどうなっていただろうか。

この本の中では、その結果起きることとして「元のテーブルに戻すことができない」ということが強調されている。

間違ったテーブルの分け方をすると、正規化する際に必要なことである可逆性がなくなったりして問題が起きてしまうので、正しい形で分割しようねということである。

「元のテーブルに戻すことができない」とは

勉強会の中でも、まちがったテーブルの分け方をすると「元の形に戻せなくなる」という言い回しで説明されたが、初めはこの言葉がうまく理解できなかった。

けどいくつかページを見て回ったりしてどうにか理解できるようになってきたのでまとめておく。

ここでいう「元のテーブル」とは、つまり第三正規形まで正規化した形のテーブルである。

 章末のコラムに

正規化 によって 分割 さ れ た テーブル は、 いつ でも 非 正規化 テーブル に 復元 する こと が でき ます。

とあるように、ボイスコッド正規形に正規化されたテーブルは、分割されたテーブルを結合することで正規化する前の形に戻すことができる。

例の中では、チームコードをキーにしてテーブル結合することで、社員ID-チームコード、チーム補佐-チームコードのテーブルを社員-チームコード-チーム補佐の形に戻すことができる。

これが「戻すことができない」という例として、社員ID-チームコード、チームコード-チーム補佐で切り分けた場合を考えてみる。

この場合、2つのテーブルをチームコードをキーにしてテーブルを結合しようとすると、一つのチームに複数のチーム補佐がつく場合があるので、その社員につくチーム補佐の人が誰なのか一意に求まらず、社員とチーム補佐が1対1で結び付けられた状態に戻せない。

このことが、「元のテーブルに戻すことができない」ということである。

こうならないために、テーブルを分割する際は、ボイスコッド正規化する場合だけに限らず、この分割の結果から元に戻そうとしたときそれができるかを考えたり、試したりしなければならない、という話である。

ボイスコッド正規形にしても起きる問題

前回説明したとおり、ボイスコッド正規形にすることで厳密に従属関係を分割することができる。

しかし、これによってデータベースのテーブル設計における全ての問題が解決できたわけではない。

社員ID、チーム補佐、チームコードの例に戻る。

この例においては要件として、一人の社員は一つのチームに所属することになっている。

しかし、ボイスコッド正規形に正規化したテーブルには、同じ社員と別のチーム補佐のペアを追加することによって、別のチームを掛け持ちしていることになる可能性もある。

なぜなら、チーム補佐はそれぞれ一つのチームと1対1で結びついているので、別のチーム補佐をキーにして結合すると同じ社員が別のチームと結び付けられるためである。

これを防ぐにはテーブルに入力する際に同じ社員に二人以上入力しないようにするなどの処理をプログラムの側で書かなければならないことになる。

この点がボイスコッド正規形においても残る問題とされる点である。

まとめ

  • 正規化は失敗するとテーブルを正規化する前に戻せなくなるので気を付ける。
  • ボイスコッド正規形にしてもテーブル設計の問題が全部解決されるわけではないので設計する際は気を付ける

今回は、ボイスコッド正規形について前回書ききれなかった内容を自分なりにまとめてみた。

いくらでも内容を濃くはできなかったが、要約はできたと思う。