PostgreSQLで学ぶデータベース技術[schooザックリ受講録]

[toc]

この記事は、schooの授業、PostgreSQLで学ぶデータベース技術の内容をさかなEXが大切だと感じた箇所のみにギュギュっと要約した内容になっています。

動画で受講すると、もっと分かり易いので気になった方は是非ご自身でSchooに登録してみて下さい。登録は以下から。(アフィではないですよ笑) https://schoo.jp/class/3529 後、最近油っこいキャプチャ画像が続いていたのでブログに清涼感をもたらすために、フリー素材アイドルMIKA☆RIKAさんの素材をお借りしました笑

受講動機

SQLの書き方ではなく、データベースの動作原理やチューニングの方法について学びたかったので受講しました。SQL文の書き方だけなら、他の書籍やオンライントレーニングで十分なのですが、深い部分まで語ってくれる講義は非常に貴重な印象。

講座基本情報

今どきのフレームワークCMSを使うと、データベースを知らずともシステムが出来てしまいます。しかし、データベースを正しく理解することこそ、最高のパフォーマンスを得て、最良のプログラムを書くために絶対必要な、システム開発の中核なのです。 この授業ではオープンソースリレーショナルデータベース管理システムRDBMS)であるPostgreSQLの初歩的な使い方、操作方法を通して、データベース学習で必ずおさえておくべきポイントを易しく解説します。

【授業の構成】

自己紹介 授業で学ぶことと目次 システムの中核を担うデータベース プログラムとデータの分離しよう リレーショナルデータベースの機能 RDBMSが得意な処理、苦手な処理 RDBでデータを高速に返却しよう SQLRDBを操作する共通言語 RDBが得意な処理 トランザクションを理解しよう トランザクションとは何かを学ぼう 確定したデータを維持しよう どのデータを最新とみなすかを学ぼう PostgreSQLを選択する理由 大量のトラフィックをさばくwebサービスの場合 NoSQLと比較 複雑なSQLを賢く実行する業務システム 大量データを一括で読み込む分析システム まとめ

目次

システムの中核を担うデータベース

[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の役割

  1. 結果を高速に返却する

  2. 同時実行の実現

  3. データを適切に維持

  4. 確定されたデータを守る

  5. 不正アクセスの禁止

[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" ]

リレーショナルデータベースの機能

  1. 結果を高速に返却する ->最も良い方法で変更してくれる

  2. データを適切に維持 ->誤った値が入っていないかチェック

  3. 確定されたデータを守る ->バックアップを保存する

RDBMSが得意な処理、苦手な処理

DBが本当に得意なこと、苦手なことを理解する必要がある。

RDBでデータを高速に返却する

  1. SQLをまずは提供する。(Javaの言語からSQLを呼び出すこともできる)

[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シャツ欲しいなあ。