Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chugokudb18_1

1,532 views

Published on

2016年11月26日 第18回中国地方DB勉強会(前半)

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Chugokudb18_1

  1. 1. PostgreSQLで学ぶ データベース技術 アプリ開発とデータベース アプリ開発とPostgreSQL 第18回 中国地方DB勉強会 2016.11.26 NPO法人 日本PostgreSQLユーザ会 株式会社アシスト 喜田 紘介
  2. 2. 自己紹介 Japan PostgreSQL User's Group 2 postgres=# ¥x auto postgres=# SELECT * FROM “自己紹介” postgres -# WHERE name = ‘喜田紘介’; -[ RECORD 1 ] 名前 | 喜田 紘介 twitter | @kkkida_twtr blog | http://kkida-galaxy.blogspot.jp/ 所属1 | NPO法人 日本PostgreSQLユーザ会 所属2 | 株式会社 アシスト 仕事 | PostgreSQLを中心としたDB技術支援、教育、サポート、プリセールス | 活動に従事している。最近は、商用DBとの互換に優れたPostgreSQLの | 強化版「EDB Postgres」の検証、技術支援の確立、販促など。 | 国内でのPostgreSQL普及・促進を目指す、日本PostgreSQLユーザ会の | 理事としても活動し、全国各地での講演、技術相談、イベントの開催 | などに楽しさを見出している。 予備1 | B’z好き。カラオケ好き。ダイビング始めました。マラソン、テニス。 予備2 | このテーブル設計はイケてない!注意!
  3. 3. PostgreSQLで学ぶデータベース技術 すべてのアプリ開発者に知ってほしい、データベースの 役割の大事なことをまとめました データにまつわる面倒なことは、データベースに任せて しまいましょう! Japan PostgreSQL User's Group 3 アプリ開発とデータベース、アプリ開発とPostgreSQL 学習すること  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次
  4. 4. PostgreSQLで学ぶデータベース技術 すべてのアプリ開発者に知ってほしい、データベースの 役割の大事なことをまとめました データにまつわる面倒なことは、データベースに任せて しまいましょう! Japan PostgreSQL User's Group 4 アプリ開発とデータベース、アプリ開発とPostgreSQL 学習すること  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次 この資料は、 http://kkida-galaxy.blogspot.jp/2016/11/chugokudb18.html で公開しています。 「kkida-galaxy」でググってください また、この内容は、 Web業界で働くためのオンライン動画学習サービス Schooで実施した、 「PostgreSQLで学ぶデータベース技術」の一部を再編したものです。 https://schoo.jp/class/3529
  5. 5. PostgreSQLで学ぶデータベース技術 プログラムとデータの分離 リレーショナルデータベースで、データを 「高速に返す」「維持する」「守る」 Japan PostgreSQL User's Group 5 アプリ開発とデータベース、アプリ開発とPostgreSQL  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次
  6. 6. プログラムとデータの分離 独自にデータを持つ場合 データベースで一元管理 Japan PostgreSQL User's Group 6 データベースによるデータ層の「抽象化」 My Program My Only Data 文字列 file配列 入力から 条件に合う データを探す 計算して (プログラム固有の処理) 画面を生成 My Program 計算して (プログラム固有の処理) 画面を生成 データベース データベースに 問い合わせ 他の プログラム 条件に合う データを探して 返却
  7. 7. リレーショナルデータベースの機能 リレーショナルデータベース管理システム(RDBMS) RDBMSの機能イメージ Japan PostgreSQL User's Group 7 RDBMSにはこれだけ(こんなに)任せましょう! RDBMS PostgreSQL SQLSQLRDBMSの 共通操作言語 同時実行の実現 不正アクセスの禁止 結果を高速に 返却する データを 適切に維持 確定された データを守る
  8. 8. リレーショナルデータベースの機能 RDBで行う「データ」の扱い Japan PostgreSQL User's Group 8 プログラム側でこれらを実現するのは大変 結果を高速に 返却する データを 適切に維持 確定された データを守る 表形式のデータ : 大量のデータから、条件に合う データを効率の良い方法で検索 変更されるデータをチェックし、 誤ったデータが入ることを防ぐ 全てのデータはバックアップなど 様々な手段で保護され、あらゆる 障害から復旧できる
  9. 9. 【参考】RDBとNoSQL RDBのレプリケーション NoSQLでの例 Japan PostgreSQL User's Group 9 1筐体で「データを守る」ことがRDB本来の役目 Master Slave 複数台slaveで 参照負荷分散 RDBでは、 ・トランザクションの実現 ・SQL対応や正規化されたテーブル構造の維持 PG- REX 死活監視や 障害時の切り替え 書き込みが順に伝搬するとして、n筐体から 応答があれば書き込みを成功とみなす。 参照時に最新データが見れるとは限らない。 このような構造の利点は、 ・1台の障害による影響が少ない点 ・ディスクに永続化したデータを持つ必要が なく、メモリだけで高速に動作出来る点 (n台以上の同時多重障害でない場合に限る) 書き込み 成功 成功
  10. 10. PostgreSQLで学ぶデータベース技術 RDBでデータを高速に返却する 集合を扱うSQL / ifやloopで表現する他の言語 Japan PostgreSQL User's Group 10 アプリ開発とデータベース、アプリ開発とPostgreSQL  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次
  11. 11. RDBでデータを高速に返却する 条件にマッチするデータを最適な方法で検索 Japan PostgreSQL User's Group 11 利用者は欲しいもの(条件)を指定するだけ RDBMS PostgreSQL SQLSQLRDBMSの共通操作言語 ○○表の××の条件に 該当するデータ メモリを有効に使う 表のデータ量は? インデックスはある? インデックス使う? JOINの順番は? どうやってJOINするの? 条件に合うデータは何件? : 他に選択肢はある? どっちが早い?
  12. 12. SQL:RDBを操作する共通言語 集合を扱うSQL Japan PostgreSQL User's Group 12 利用者は欲しいもの(条件)を指定するだけ SELECT first_name,last_name FROM customer WHERE last_name = ‘Kida’; customer Kida Kosuke Kida Kosuke Kida Yusuke customer ・結果が何件あってもモレなく返却 ・結果が何件になるか予測して、 もっとも効率の良い方法で探索
  13. 13. RDBが得意な処理 集合に対して関数を使う 他の集合を条件にする Japan PostgreSQL User's Group 13 RDBが得意な処理=SQLで書ける処理 SELECT last_name,avg(age) FROM customer WHERE last_name = ‘Kida’; customer SELECT last_name,club_name FROM customer JOIN club ON club.id = customer.club_id WHERE last_name = ‘Kida’ AND club_name = ‘データベース愛好会’ customer
  14. 14. (参考)ifやloopで表現する他の言語 Japan PostgreSQL User's Group 14 <全データの件数を取得> loop <件数> if last_name = Kida <値を配列に代入> end loop Kida Kosuke Kida Yusuke customer <全データの件数を取得> loop <件数> if last_name = Kida <値を配列1に代入> end loop <club表からpostgres愛好会のidを取得> <配列1の件数を取得> loop <件数> if club_id = 500 <値を配列2に代入> end_loop customer 全件チェック1 全件チェック2
  15. 15. (参考)ifやloopで表現する他の言語 SQLが苦手なもの 例えば・・・ Japan PostgreSQL User's Group 15 複雑な条件分岐があって値を書き換えるような処理 沖縄ダイビングツアー 3泊4日 ○○円! ツアーコード:xxxxxx ○日前までの予約で 20%off! ダイビングショップ A社とコラボで 該当店舗からの申し 込みで10%off [今だけキャンペーン] Webからの申し込み15%off しかも専用アプリだとxxx ○名様以上で一緒に 申し込むと 1人目10%、2人目20% 3人目以降30%off!
  16. 16. PostgreSQLで学ぶデータベース技術 現実の処理をコンピュータで扱う 確定したデータを維持する どのデータを最新とするか 【ハイレベル】 ACIDの原則 Japan PostgreSQL User's Group 16 アプリ開発とデータベース、アプリ開発とPostgreSQL  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次
  17. 17. トランザクションを理解する 現実の処理とコンピュータ上の数字の矛盾 Japan PostgreSQL User's Group 17 現実の処理をコンピュータで正しく扱う考え方 目をつけていたアイテムが タッチの差で取られてしまった! 単なる数字上での話として扱うなら、 箱の中身がマイナスに! ・選ぶところから含めて、すべての 処理を早いもの勝ちで進める ・いったん投票のターンを設ける など、方法はいろいろ あげる もらう 「あげる」「もらう」は同時であり 現実世界で割り込まれることは無い 同時に他の人も操作していると 割り込みが発生 ・「あげる」「もらう」は別々の更新 ・「あげる」「もらう」が両方完了して はじめて処理を成功とみなす
  18. 18. 確定したデータを維持する トランザクションを「完了」するCOMMIT 「破棄」するROLLBACK Japan PostgreSQL User's Group 18 あげる、もらう でひとつの処理単位とみなし同時に確定 BEGIN; SELECT * FROM 貯金; UPDATE 貯金 SET 残高-1000 WHERE 名前 = Aさん; UPDATE 貯金 SET 残高+1000 WHERE 名前 = Bさん; COMMIT; 名前 残高 Aさん 5000 Bさん 1000 名前 残高 Aさん 4000 Bさん 1000 名前 残高 Aさん 4000 Bさん 2000 名前 残高 Aさん 4000 Bさん 2000 COMMITで確定 名前 残高 Aさん 5000 Bさん 1000 ROLLBACKで BEGIN前まで戻す
  19. 19. どのデータを最新とみなすか トランザクション内外でのデータの見え方 Japan PostgreSQL User's Group 19 全員が同じ箱の中身をみている・・・わけでない BEGIN; SELECT * FROM candy; UPDATE candy SET 残り-1 WHERE 味 = レモン; SELECT * FROM candy; COMMIT; 味 残り グレープ 10 レモン 1 味 残り グレープ 10 レモン 0 SELECT * FROM candy; SELECT * FROM candy; SELECT * FROM candy; 味 残り グレープ 10 レモン 1 味 残り グレープ 10 レモン 1 味 残り グレープ 10 レモン 0
  20. 20. 割り込みをブロックする 行レベルロックで同時実行を実現 Japan PostgreSQL User's Group 20 更新がCOMMITされるまで別の更新をブロック BEGIN; SELECT * FROM candy; UPDATE candy SET 残り-1 WHERE 味 = レモン; SELECT * FROM candy; COMMIT; 味 残り グレープ 10 レモン 1 味 残り グレープ 10 レモン 0 SELECT * FROM candy; SELECT * FROM candy; UPDATE candy SET 残り-1 WHERE 味 = レモン; <待機> error:マイナス値は登録できません 味 残り グレープ 10 レモン 1 味 残り グレープ 10 レモン 1
  21. 21. 【ハイレベル】ACIDの原則 Japan PostgreSQL User's Group 21 トランザクションはACIDの原則に従う Atomicity(原子性) • 一連の処理をひとま とめにし、それ以上 分解できない • 同時にcommitまたは rollbackされる Consistency(整合性) • 誤ったデータが入ることを 防ぐ • 箱の中身はマイナスの個数 にはならない、など Isolation(独立性) • 実行中の処理が他のト ランザクションに影響 を与えない • 未確定のデータは他の トランザクションから 見えない Durability(永続性) • 確定したトランザクション の結果が守られる • 障害時にバックアップから 復旧できる仕組みを実装
  22. 22. PostgreSQLで学ぶデータベース技術 大量のトラフィックをさばくwebサービス 複雑なSQLを賢く実行する業務システム 大量データを一気に読み込む分析システム Japan PostgreSQL User's Group 22 アプリ開発とデータベース、アプリ開発とPostgreSQL  システムの中核を担うデータベース  RDBMSが得意な処理、苦手な処理  トランザクションを理解する  PostgreSQLを選択する理由 目次
  23. 23. PostgreSQLを選ぶ理由 RDBの得意分野 負荷分散レプリケーション Japan PostgreSQL User's Group 23 大量のトラフィックをさばくwebサービスの場合 RDBMS PostgreSQL APサーバー • 参照クエリが多数 • ほとんどのクエリが、 ユーザーIDをキーに した一意検索 • メモリ上で処理 RDBの得意分野 PostgreSQL Master PostgreSQL 同期Slave1 PostgreSQL 非同期Slave2 APサーバー • 参照クエリが多数 • 更新はマスターのみ • 参照はスレーブで可能
  24. 24. PostgreSQLを選ぶ理由 豊富なSQL構文、拡張 高可用レプリケーション Japan PostgreSQL User's Group 24 複雑なSQLを賢く実行する業務システム RDBMS PostgreSQL APサーバー • webと比較して、同時実行 は若干減 • 業務要件に従ってクエリの パターンが多種多様 • 集計は扱うデータ量が増大 拡張データ型や 索引で高速に処理 PostgreSQL Master PostgreSQL 非同期Slave1 APサーバー • システムダウンの影響が 大きい • 堅牢かつ高速な復旧が 求められる Window関数など 便利な構文に対応 高可用 クラスタ ウェア vip 【参考】 PG-REX pgpool-II
  25. 25. PostgreSQLを選ぶ理由 パーティショニング パラレルクエリ Japan PostgreSQL User's Group 25 大量データを一括で読み込む分析システム RDBMS PostgreSQL APサーバー • 同時実行は少数 • 過去数年分のデータを保管 しているようなシステム • 直近xヶ月分を分析 • あらかじめテーブルを パーティション分割 • I/Oを大幅に減らして 集計時間を削減 • 豊富な分析用SQL構文 や索引も活用 • 大規模表の読み取り、結合、 集約に利用できる • 1 クエリを内部で複数並列 に分割して実行 • パーティショニングとの 併用で効果絶大 今秋リリース Ver9.6の新機能
  26. 26. まとめ アプリ層とDB層を意識し、データを正しく扱いましょう 様々なシステムでRDB、PostgreSQLが活躍する Japan PostgreSQL User's Group 26 アプリ開発とデータベース、アプリ開発とPostgreSQL DBが得意な処理は どんどん任せる SQL 集合に対する操作 データ層の高速化 トランザクション 同時実行 データの永続化 webアプリ 業務システム 分析システム
  27. 27. PGConf.Asia 2016 Japan PostgreSQL User's Group 27 アジア最大のPostgreSQL国際カンファレンスを日本で 日時 2016年12月2日(金)、12月3日(土) Webサイト http://www.pgconf.asia/JP/ メインセッション ①トップ開発者が語る PostgreSQL最新情報 ②世界最大のB2Bマーケット プレイス「Alibaba」の事例 多岐にわたるセッションを企画中 国内/海外事例 性能や運用の話 コミュニティ関連 他DBからの移行 新機能や拡張の 開発現場から 初級者向け チュートリアル

×