PHPを独学で学んでいるんですが、その延長でMysqlの学習もしてます。
sql文はなんとなく理解できるんですが、いざデータベースを作成しよう!!
ってなるとけっこう「?」な感じです。
正規化とかなんやねん??
主キーってなんやねん??
とか思ってる人いませんか??
僕もそうでした。
ですが、【マンガでわかるデータベース】を読んでみてちょっとデータベースのことが理解できた気がします。
正規化や主キーなどデータベースで出てくる名詞のだいたいの感じは下記↓書籍でわかるようになってます。
データベース初心者の方は是非読んでほしい書籍です。
データベースについての基礎をまんがで理解できます。
すげぇわかりやすかったです。
Amazonで評価が高いのも納得です。
少し古い書籍ですが買う価値はあると思います。
この書籍で学んだことを元にデータベースを作成していきます。
とりあえず本書を元に、自分なりに正規化などをしてみました。
実際に記事を書いてる時は
「ふむふむ、なるほど♪」
なんて思ってましたが、実際にデータベースを作ってみると自分がやった正規化は間違ってるところがかなりありました。
訂正した記事などを今後、書く予定ですので、この先を読む場合は
「ん??ここが間違ってるね」
なんて思いながら読んでもらえると勉強になるかもしれません。
E-Rモデルで分析してみた
【マンガでわかるデータベース】ではE-Rモデルという概念が解説してあります。
E-Rモデルの【E】とは実態(Entity)と言う意味です。
・・・で、【実態】とは。。
実態とは、「果物」、「輸出先」など、現実の世界で実体として考えられるもののことです。
●マンガでわかるデータベースP74より引用
僕のデータベースの場合は「目標」と「人物」を実体として考えてみました。
実態について考えた後は、実体同士の関連(Relationship)についても考えます。
本書では「果物」(Entity)と「輸出先」(Entity)を「売上」(Relationship)で関連づけてます。
僕の場合はどうやって関連付けたらいいのかわからなかったのでRelationshipを「所属」としました。
と、こんな感じでなんとなくっぽくなってきた気がしますが。。。
データベースの表を正規化する
正規化……
「なんか難しい言葉が出てきたな?!」
と思うかもしれませんが、安心してください。【マンガでわかるデータベース】を読むとなんとなく理解できます。笑
正規化とは表を管理しやすい状態に細分化していく作業だと僕は思ってます。
とりあえず、難しく考えずにエクセルの表でも作る感じで必要そうな項目を考えだし表にしてます。
僕がやろうとしてることのイメージを表にしてみました。
●非正規形
非正規形は繰り返し項目が排除されてない表のことを言います。
なんとなく作ってみた表は【非正規形】にあてはまると思います。
目標コード | 目標名 | 人物コード | 人物名 | サイトURL | 性別 | 年齢 | 広告コード | 広告 | |
101 | DBを作る | 2001 | たろう | abc.com | @taro | 男 | 20 | 10001 | 楽天 |
102 | PHPを覚える | 2001 | たろう | abc.com | @taro | 男 | 20 | 10002 | アマゾン |
102 | PHPを覚える | 2002 | じろう | efg.com | @jiro | 男 | 30 | 10002 | アマゾン |
103 | ゴルフをはじめる | 2003 | ひろこ | hij.com | @hiro | 女 | 40 | ||
103 | ゴルフをはじめる | 2004 | あきこ | klm.com | @aki | 女 | 20 | ||
104 | 読書を習慣化する | 2005 | ようこ | opq.com | @you | 女 | 20 | 10003 | 楽天ブックス |
104 | 読書を習慣化する | 2005 | ようこ | opq.com | @you | 女 | 20 | 10004 | febe |
104 | 読書を習慣化する | 2003 | ひろこ | hij.com | @hiro | 女 | 40 | 10003 | 楽天ブックス |
104 | 読書を習慣化する | 2003 | ひろこ | hij.com | @hiro | 女 | 40 | 10004 | febe |
このような表ではリレーショナルデータベースではうまく管理できないようです。
重複してる情報をスッキりできるうようにテーブルを細分化していきます。
この細分化の作業を【正規化】と呼ぶようです。
●第○正規形
それぞれの項目を関連がありそうなグループにまとめて、表を作成します。
正規化の作業には【第1正規化】など段階があるようですがあまり理解できなかった……
とりあえず、表の情報が重複しないようにそれぞれの表を作成しました。
目標表:目標コード 目標名
広告表:広告コード 広告
目標広告関連表:目標コード 広告コード
目標人物関連表 :目標コード 人物コード 人物名 性別 年齢 サイトURL Twitter
●目標表
目標コード | 目標名 |
101 | DBを作る |
102 | PHPを覚える |
103 | ゴルフをはじめる |
104 | 読書を習慣化する |
●広告表
広告コード | 広告 |
10001 | 楽天 |
10002 | アマゾン |
10003 | 楽天ブックス |
10004 | febe |
●目標広告関連表
目標コード | 広告コード |
101 | 10001 |
102 | 10002 |
104 | 10003 |
104 | 10004 |
●目標人物関連表
目標コード | 人物コード |
101 | 2001 |
102 | 2001 |
102 | 2002 |
103 | 2003 |
103 | 2004 |
104 | 2005 |
104 | 2003 |
●人物表
人物コード | 人物名 | サイトURL | 性別 | 年齢 | |
2001 | たろう | abc.com | @taro | 男 | 20 |
2002 | じろう | efg.com | @jiro | 男 | 30 |
2003 | ひろこ | hij.com | @hiro | 女 | 40 |
2004 | あきこ | klm.com | @aki | 女 | 20 |
2005 | ようこ | opq.com | @you | 女 | 20 |
ざっと【マンガでわかるデータベース】で学んで実践したことを書いてみましたが、僕は以下↓のようなものを作りたいと考えてます。
Twitterなどのソーシャルも利用したいと考えてます。
上の表が効率よくできてるかわかりませんが、とりあえずローカル環境でデータベースを作成します。
とりあえず、わからないながらも実践することで成長につながると信じてますのでとりあえずやってみます。