Skip to main content

DB設計の手順

これまで学んできた内容を踏まえ、 DB設計の手順について説明していく。

  1. ブロック分け
  2. イベント系エンティティの抽出
  3. イベント系エンティティの正規化
  4. リソース系エンティティの分類を整理
  5. ブロック間でのリソース統合

「ブロック分け」と「イベント系エンティティの抽出」は
エンティティの洗い出しで既に教えているのでそちらを参照。


イベント系エンティティの正規化

ここで勉強した正規化が役に立つ。
正規化がうまくいけば、それだけでリソース系エンティティも浮かび上がってくる。

リソース系エンティティとは、人やモノといった名詞になるもの。
それが浮かび上がってくるということは、
CD体系も見えてくるということになる。

ここまでくれば、リソース系エンティティも見出していける。
そして、リソース系が見えてくれば、
隠れていたイベント系も浮かび上がってくるだろう。
(商品を値引する、単価を決定する、どこに所属する等)

ただし、ここで完全に正規形を完成させようと頑張る必要はない。 ここでいう完全でない正規形とは、
第三正規形までは終えているが、 一部同じ内容が並んでいるなどをいう。

  • 商品テーブル
    example-candystore-items

こういった部分は、まだ残っている手順で行う。

リソース系エンティティの分類を整理

正規化により、リソース系エンティティが見いだせてくると、 その中身に分類が発生することがある。

例えば、以下のような状態だ。

  • 商品テーブル
    example-candystore-items

テーブルを見てわかるよう、商品にも常温、冷凍、冷蔵といった保管方法があった場合、
これらを個別で「商品分類」というエンティティを作るのか、
それとも「商品」エンティティ自身に「商品分類区分」という項目を作って、
「区分=1」なら常温、「区分=2」なら冷凍・・・といった形で管理するかだ。

結論から言うと、
「商品分類」というエンティティを作って、 そこに商品分類ID、商品分類CD、商品分類名のデータ(属性)を持った形にし、
リレーションをつなげるといい。

  • 商品分類テーブル
    example-candystore-itemclassification

  • 商品と商品分類のリレーション
    example-candystore-items

もし「商品」エンティティに分類区分を持たせていると、
プログラム作成側がIF文で判断しなければならなくなるし、
どの区分がどれを指すのかがわからなくなる。
それを考えると、やはりエンティティを分けていたほうがいい。

また、エンティティがいっぱいになってくると、
結合が大変になってくる。
もちろん、結合が多ければその分のパフォーマンスが悪くなるが、
その性能に関してはあとから考えればいい。

今、優先に考えるべきは、
DBに必要な情報を入れていくことだからだ。

ブロック間でのリソース統合

ブロック分けで分けたブロックで、
共通しているリソースを統合する作業。

実はここの統合がDB設計において一番重要な部分になる。

イベント系は統合しないのかといわれると、
ブロックで分けているときの見出したイベントは、
そのブロック内でしか発生しない作業であるので、統合することはない。

一方、リソース系は商品や社員といった、 全体で共有できるエンティティが発生している。

ただ、部門ごとの使用方法が同じかどうか確認する必要はあるため、
意識合わせのための調整(コミュニケーション)をすること。

それらをうまく統合できれば、
システムとして長生きできる上に、 開発もスムーズに進むという恩恵が得られる。

まとめ

いきなり全体を見ようとすると手が付けられなくなるので、
まずは、イベント系を中心に考えていくこと。

イベント系の整理ができて、
浮かび上がってきたリソース系にもし同じ内容が繰り返しあるのであれば、
それは無駄なので、さらに別のエンティティとして作ること。

部門間で共通するリソースは統合する。
ただし、どう使うかは意識合わせが必要なので、調整(コミュニケーション)が必要。