PostgreSQLで学ぶデータベース技術[schooザックリ受講録]
[toc]
この記事は、schooの授業、PostgreSQLで学ぶデータベース技術の内容をさかなEXが大切だと感じた箇所のみにギュギュっと要約した内容になっています。
動画で受講すると、もっと分かり易いので気になった方は是非ご自身でSchooに登録してみて下さい。登録は以下から。(アフィではないですよ笑) https://schoo.jp/class/3529 後、最近油っこいキャプチャ画像が続いていたのでブログに清涼感をもたらすために、フリー素材アイドルMIKA☆RIKAさんの素材をお借りしました笑
受講動機
SQLの書き方ではなく、データベースの動作原理やチューニングの方法について学びたかったので受講しました。SQL文の書き方だけなら、他の書籍やオンライントレーニングで十分なのですが、深い部分まで語ってくれる講義は非常に貴重な印象。
講座基本情報
今どきのフレームワークやCMSを使うと、データベースを知らずともシステムが出来てしまいます。しかし、データベースを正しく理解することこそ、最高のパフォーマンスを得て、最良のプログラムを書くために絶対必要な、システム開発の中核なのです。 この授業ではオープンソースのリレーショナルデータベース管理システム(RDBMS)であるPostgreSQLの初歩的な使い方、操作方法を通して、データベース学習で必ずおさえておくべきポイントを易しく解説します。
【授業の構成】
目次
システムの中核を担うデータベース
[peg-image src="https://lh3.googleusercontent.com/-v5Pc-i9uXGQ/WCa08pvAgtI/AAAAAAAAD5E/VDxrIRIgD8sMbLjilHniFRryXYlJZ6M0wCHM/s144-o/Screenshot_20161111-102114.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963278540833490" caption="" type="image" alt="Screenshot_20161111-102114.png" image_size="1920x1080" ]
プログラムとデータの分離
->データに関するところを全てDBに任せてしまおうという思想。 [peg-image src="https://lh3.googleusercontent.com/-GKJpzxNl4_I/WCa1Cw1SRrI/AAAAAAAAD5E/cjMntQKXBe88xu8pLGzWeMtsZ2wRQVNXACHM/s144-o/Screenshot_20161111-102139.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963383525426866" caption="" type="image" alt="Screenshot_20161111-102139.png" image_size="1920x1080" ]
RDBMSでデータを"高速に返す" "維持する" "守る"
[peg-image src="https://lh3.googleusercontent.com/-C3mvRHztxRg/WCa035Uo_hI/AAAAAAAAD5E/3xe2baFa3esKDrfpkwYQvp_UryIl_tgjACHM/s144-o/Screenshot_20161111-101905.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963196825861650" caption="" type="image" alt="Screenshot_20161111-101905.png" image_size="1920x1080" ]
DBの役割
結果を高速に返却する
同時実行の実現
データを適切に維持
確定されたデータを守る
不正アクセスの禁止
[peg-image src="https://lh3.googleusercontent.com/-RRhs0A3EXYE/WCa1IRQRfUI/AAAAAAAAD5E/QazlNUFg5LU7Ipiu56rtoZuhTH9IE6alQCHM/s144-o/Screenshot_20161111-102330.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963478127902018" caption="" type="image" alt="Screenshot_20161111-102330.png" image_size="1920x1080" ]
->変数、配列などプログラミングの中で処理を行うのは結構大変
[peg-image src="https://lh3.googleusercontent.com/-V5Zqqb01FUQ/WCa1Nk-YNjI/AAAAAAAAD5E/IQOTPv2iuL8zrG1tGEPy95r_Pq_LAsvaACHM/s144-o/Screenshot_20161111-102759.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963569320900146" caption="" type="image" alt="Screenshot_20161111-102759.png" image_size="1920x1080" ]
リレーショナルデータベースの機能
結果を高速に返却する ->最も良い方法で変更してくれる
データを適切に維持 ->誤った値が入っていないかチェック
確定されたデータを守る ->バックアップを保存する
RDBMSが得意な処理、苦手な処理
DBが本当に得意なこと、苦手なことを理解する必要がある。
RDBでデータを高速に返却する
[peg-image src="https://lh3.googleusercontent.com/-RLJ2WzqGOUU/WCa1XZp7trI/AAAAAAAAD5E/ELXoQCvsGDEcKji41Wh1egqHsl3GYRQSgCHM/s144-o/Screenshot_20161111-103503.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963738081048242" caption="" type="image" alt="Screenshot_20161111-103503.png" image_size="1920x1080" ]
2.頂いたSQLに対して、素早く賢く高速に結果を返却する ->全体のデータ量/インデックス/JOINの順番などを勝手に理解して最適な方法を採用してくれる
SQL:RDBを操作する共通言語
SQLは集合を操作している言語 [peg-image src="https://lh3.googleusercontent.com/-gHeJILvmUkc/WCa1b0sJa3I/AAAAAAAAD5E/VhmwgE3r_OE80u6I46nnnmjSp3D4dvRnQCHM/s144-o/Screenshot_20161111-103722.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963814057569138" caption="" type="image" alt="Screenshot_20161111-103722.png" image_size="1920x1080" ]
[peg-image src="https://lh3.googleusercontent.com/-uzqEB_KrzmY/WCa1gaIoyhI/AAAAAAAAD5E/w3zLqtxaSkY7nkXmHcerF3WzZjOzFEifwCHM/s144-o/Screenshot_20161111-104102.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963892828654098" caption="" type="image" alt="Screenshot_20161111-104102.png" image_size="1920x1080" ]
RDBが得意な処理 = SQLで書ける処理
- 集合に対して関数を使う
- ほかの集合を条件にする
[peg-image src="https://lh3.googleusercontent.com/-jfJaggq1IU0/WCa1mGGJzEI/AAAAAAAAD5E/P7o_cukanLg3j0tufkIyhmrpr8Z_w6K0QCHM/s144-o/Screenshot_20161111-104111.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351963990528740418" caption="" type="image" alt="Screenshot_20161111-104111.png" image_size="1920x1080" ]
[peg-image src="https://lh3.googleusercontent.com/-vRKJrWiGnuM/WCa1qTjOocI/AAAAAAAAD5E/u11NC72II202ke5fVbc951eKeN5DnIVpgCHM/s144-o/Screenshot_20161111-104412.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964062859829698" caption="" type="image" alt="Screenshot_20161111-104412.png" image_size="1920x1080" ]
トランザクションを理解する
現実の処理をコンピュータで正しく扱う考え方
[peg-image src="https://lh3.googleusercontent.com/-KuY_uYXsjiM/WCa10oWOnvI/AAAAAAAAD6I/-PvbsHu6CUY3k2W_Igp7SHjVoIdcwVAJwCHM/s144-o/Screenshot_20161111-104828.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964240241139442" caption="" type="image" alt="Screenshot_20161111-104828.png" image_size="1920x1080" ]
流れを定義 例)口座残高を減らす処理と増やす処理が両方成功したときに初めて成功とみなす。 片方だけが成功するパターンを消す。
量を定義 例)飴玉の事例 [peg-image src="https://lh3.googleusercontent.com/-cPQBrcEL-I0/WCa143lsKKI/AAAAAAAAD6I/msyRAVyD2vczqjJd0F4Fqfb2qsJeiquegCHM/s144-o/Screenshot_20161111-105205.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964313051998370" caption="" type="image" alt="Screenshot_20161111-105205.png" image_size="1920x1080" ]
[peg-image src="https://lh3.googleusercontent.com/-59j3_XARWpU/WCa19iVbcuI/AAAAAAAAD6I/7bVbphbLN6QBY067DwRAr3pXoFPuFhePQCHM/s144-o/Screenshot_20161111-105742.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964393245995746" caption="" type="image" alt="Screenshot_20161111-105742.png" image_size="1920x1080" ]
①確定したデータを維持する -BEGIN と COMMITでトランザクションを開始
②どのデータを最新と見なすか -トランザクション中は、外から見ても更新されていない みんなが同じものを見ている訳ではない
③割り込みをブロックする COMMITまで完了すれば、割り込みが可能になる
PostgreSQLを選択する理由
[peg-image src="https://lh3.googleusercontent.com/-T3wMmzMlblU/WCa2Bt_uGmI/AAAAAAAAD6I/jBzCEYftD5waj3z3KoFD5Cbzeuuba9UPgCHM/s144-o/Screenshot_20161111-110107.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964465095645794" caption="" type="image" alt="Screenshot_20161111-110107.png" image_size="1920x1080" ]
[peg-image src="https://lh3.googleusercontent.com/-WhAeL6zWln4/WCa2G9ZdMqI/AAAAAAAAD6I/r567D4EuuGEvmdCCSG5_2ViSNoMWcXvXgCHM/s144-o/Screenshot_20161111-110125.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964555129467554" caption="" type="image" alt="Screenshot_20161111-110125.png" image_size="1920x1080" ]
まとめ
[peg-image src="https://lh3.googleusercontent.com/-zjyBnT_g-IY/WCa2PTBiQhI/AAAAAAAAD6I/HtEJY0HSirEZl5Fh7A0hK4s8py0irHu4wCHM/s144-o/Screenshot_20161111-114144.png" href="https://picasaweb.google.com/116818149385379809046/6355439919254253329?authkey=7E7BHCh8pNI#6351964698373669394" caption="" type="image" alt="Screenshot_20161111-114144.png" image_size="1920x1080" ]
バージョン7.6から処理速度が爆速になったらしい。
PosgreSQLを頑張って習得しよう
ゴリゴリSQLを書けないと、データ分析のデの字もできないのでより精進せねば.... ワタシポスグレチョットデキルTシャツ欲しいなあ。