kmkのメモ帳

気が向いたときにLinuxだったり、プログラミングだったり、適当なメモを書いてます。

Blogは移転しました。

自動的にリダイレクトします。

【勉強メモ】RDBでテーブル設計が必要な理由と、リレーショナルモデルのテーブルについて

はじめに

MySQLのインフラよりのこと(レプリケーション組んだりとか)は仕事で触る機会が多いのである程度はできるのですが、データベースのテーブル設計周りについては学生の頃で知識が完全に停止していたので、勉強がてら理解したことを少しずつメモとして残そうと思い書いてます。

MySQLのテーブル設計周りをきちんと勉強しようとすると、知識としてリレーショナルモデルを理解する必要があることがわかりました。そのため、リレーショナルモデル中心のお話になってます。

テーブル設計/リレーショナルモデルをちゃんと勉強するのが今回初めてなので、多くの間違いがあるかもです。ご了承下さい。もし、間違いを見つけた方がいましたらご指摘頂けると幸いです。

今回はなぜリレーショナルモデルが重要なのかということと、テーブルとは何かということを書きました。

参考資料

[おうちで学べるデータベースのきほん]がテーブル設計周りの知識が学生の頃で止まっている私には最初に読む本としてすごくよかったです。

特に[Chapter08 テーブル設計の基礎]のところで、私が知りたいことがわかりやすく書いてありました。

私みたいに正規化とかは知ってはいるけど、人に説明できるほど理解してなかったってくらいの人におすすめです。

www.shoeisha.co.jp

また、正直1割も理解出来てないレベルなのですが、下記本[理論から学ぶデータベース実践入門]を頑張って読んでます。

リレーショナルデータベースの理論方面について詳しく書かれている本です。

テーブル設計を勉強し始めたばかりの私には中々難しい本ですが、この本を理解すればリレーショナルデータベースについて深く理解することができると確信が持てる本なので、現在頑張って読み中です。

正直、私のブログを読むくらいなら下記本を読んだ方が良いです。

gihyo.jp

なぜリレーショナルモデルがテーブル設計で重要になるのか

MySQLは何も考えなければ好きなようにテーブルに値は突っ込めます(もちろん色々制限はありますが)。やりたい放題に突っ込むのでOKであれば、どのようにテーブルを設計すればよいか等考えなくてもOKなはずです。

しかし、やりたい放題テーブルに値を突っ込むと管理ができなくなります。あっちは更新したけど、こっちは忘れたとかデータの不整合が発生してしまいます。

また、必要なデータを取り出したいときにかなりトリッキーなSELECT文を書かなければいけなくなります。(運用でカバーというやつです)そんなクエリを書きたくはありません。

どうにかして、管理しやすいテーブル設計をしたいと考えたときに重要になるのがリレーショナルモデルです。

リレーショナルモデルは集合論を元としています。そこに投げかけるクエリ、つまり演算も集合論を元としているため、リレーショナルモデルに沿ったテーブル設計をすることによって、トリッキーなクエリを書かなくて済みます。

また、リレーショナルモデルに沿ってテーブルを設計することにより、1つの値を更新するのに色んなテーブルに散らばっている値を修正しなくてよくなり、データの整合性を保つのが格段に楽になるはずです。

テーブルとは何か

リレーショナルモデルのテーブルとは2次元の表………ではないです。一見すると2次元の表に見えてしまいます。私もそう思っていました。

確かに完成したテーブルだけをみると2次元の表に見えます。しかし、「OK。単なる2次元の表ね。」と理解したままリレーショナルモデルということを無視して、テーブルに秩序なくデータを突っ込むなどすると当然ぐちゃぐちゃになります。

リレーショナルモデルの表現方法に則って集合を表現した結果がテーブルです。その表現結果が[縦/横軸]のあるテーブルなので、単なる2次元の表に見えてしまいますが、リレーショナルモデルのルールに則り表現された結果なため、単なる2次元の表ではありません。

例えば、集合なので要素の順序とかはありません。また、重複も許されません。この時点で単なる2次元の表とは違いがあることがわかります。

テーブルとはリレーショナルモデルのルールに則り、集合のリレーションを表現した結果なのです。

おわりに

テーブル設計基礎を学ぶにあたり、そもそもなぜテーブル設計が必要なのか/リレーショナルモデルがなぜ必要なのか、リレーショナルモデルのテーブルとは何かをまず勉強したので書いてみました。

学び始めなので色々間違いがあるかもしれません。今後勉強を進めるにつれて間違いに気づいたら適時修正していきたいと思います。

# # #