最近になって、特定の製品にこだわらずに、改めてデータベースの基礎部分を学び直したいと考えていました。
そんな折に、育児本を購入しに行った書店で「理論から学ぶデータベース実践入門 – リレーショナルモデルによる効率的なSQL」という面白そうな本を見つけました。
そこで、早速購入をしました。
私のDB関連のスペック
- データベーススペシャリスト(2011年合格。SQLは書きましたが、それ以上のことをする機会には恵まれませんでした。)
- Oracle Database 11g Silver(2012年取得。取得直後にDBの構築や設計が不要な部署に異動)
- Oracle PL/SQL Developer Gold(2013年取得。取得直後にDBもSQLも不要な部署に異動)
- 2021年暮れ頃から業務でDBを扱うことになったものの、DBから離れていた期間が長すぎるため、もう一度勉強しなおしたい今日この頃。
前回の読んだ「ユニクロの仕組み化」に続き、私の備忘録として、勉強になった内容と個人的な感想をまとめています。
あくまでも備忘録なので、詳しく勉強したい方は実際に書籍を手に取ってみてください🙇♀️
※イタリック体の文字は私の感想です。
第1章 SQLとリレーショナルモデル
- SQLにおけるリレーションとは、テーブル同士の関係ではなく、テーブル自体である。
→完全に、テーブル同士の関係だという認識でした。
- リレーショナルモデルは集合論に基づいたデータモデルなので、以下の要件を満たす必要がある。
- ある要素が集合に含まれているかどうかを不確定要素がなく判定できる
- 集合の要素が重複してはいけない
- 集合の要素はそれ以上分解できない
→DBを扱うにあたり、要素や集合と関連づけて考えたことはありませんでした
- NULLは「値が存在しない、あるいは、未知の値」なので、集合に含めることができない。
→第7章で詳しく解説されるようなので、楽しみにしておこう!
- 属性のデータ型自体が集合である。
→面白い観点ですね。確かに、データ型ごとに値の範囲が決まっているよなと思いました。
- 「SQLのDML」を「リレーションの演算」の組み合わせで表現できる。
→集合論とDB操作を関連づけて考えたことがなかったので、興味深かったです。むしろ、今までは小手先のSQLテクニックで乗り切っていたのかもしれない。
- リスト1.bのカモネギ補足
- 拡張は射影の直前に実行される。そのため、制限(WHERE句)の時点ではweight_lbが存在しないので、エラーになる。
- リレーショナルモデルでは、変数と値は別の概念である。リレーションは値である。
→人によっては、そもそも変数と値がごっちゃになることってあるよな、と思いました。
- 効率的なSQLを書くためには、テーブルがリレーションの性質に近くなるようなDB設計が大事。
→SQLのDMLがリレーションの演算の組み合わせで表現できるという事実を踏まえると、リレーションの性質に近くなるようなDB設計が大事ですね。
第2章 述語論理とリレーショナルモデル
- リレーショナルモデルは、論理学に基づいたデータモデルでもある。
→大学の一般教養で論理学を選択したことを思い出しました。ちょっと懐かしい!この章も全体的に大学の教科書みたい。
- 命題は真偽を問えるものである。
→論理学に対する理解を深めると、プログラミングや仕様策定も捗りそうです。
- 定理の正しさは公理によって担保されている。
→業務ではとりあえず目先の課題を解決したいとなることもあるので、時折前提条件の正しさに対する検証が雑になることがあります。
- 全ての論理式は、NANDもしくはNORだけで表現することが可能である。
→こういうシンプルかつ複雑な感じが結構好きです❤️
- 述語(命題関数)と集合は等価である。
→命題論理→量化(全称量化・存在量化)→述語(命題関数)論理、と順を追って丁寧に読み込むことでこれらの理解ができそうです。面白いですが、集合に関しては基本的にベン図で理解していたので、量化の概念が入ってくるとちょっと難しい。。。
- 議論の対象とする集合のことをドメインと呼ぶ。
→業務でもDDD(ドメイン駆動設計)というワードが出てくるので、よく理解しておきたい。
- リレーションの演算は、論理演算と対応させることができる。
→「SQLのDML」と「リレーションの演算」と「論理演算」が各々対応しているのか。なるほど。
- 閉世界仮説に基づき、未知の事実は存在せずに、事実は全て判明していると言う前提でデータモデルを設計するのが、リレーショナルモデルのアプローチである。
→NULLが嫌がられるのは、この前提があるからだろう。
- リレーショナルモデルは述語論理(集合論)に基づいているので、その枠から外れたデータや演算を表現できない。そのため、どこまでがリレーショナルモデルで扱うことができる範囲であるかを見極めることが重要である。
→集合には要素間の順序を持たない、など。たしかに、map型やJSONなど、順序をもたない集合を開発でも使っていますね。
- ここまでをざっくりとでも理解できていると、2.2章の「リレーションの演算と述語論理」が面白く感じます。
- リレーションモデルの観点からすると、外部結合はあまり推奨されない。
→とはいえ、やむを得ない場合もあると思うので、後続の章でどのように解決していくのかを楽しみにしよう。
ここまでの感想
集合論や論理学とDBを関連付けて考えたことがなかったので、新たな観点を学ぶことができて非常に勉強になりました。
実際のSQLとの対応も記載されているので、理解が捗り面白かったです。
ただし、集合論や論理学に触れたことがない方や、SQLのノウハウをすぐに知りたい方にとっては、第1章と第2章は苦痛かもしれません。
以上