View
700
Download
0
Category
Preview:
Citation preview
PostgreSQLで学ぶ データベース技術
アプリ開発とデータベース
アプリ開発とPostgreSQL
第18回 中国地方DB勉強会 2016.11.26
NPO法人 日本PostgreSQLユーザ会
株式会社アシスト 喜田 紘介
自己紹介
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 | このテーブル設計はイケてない!注意!
PostgreSQLで学ぶデータベース技術
すべてのアプリ開発者に知ってほしい、データベースの役割の大事なことをまとめました
データにまつわる面倒なことは、データベースに任せてしまいましょう!
Japan PostgreSQL User's Group 3
アプリ開発とデータベース、アプリ開発とPostgreSQL
学習すること
システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由
目次
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
PostgreSQLで学ぶデータベース技術
プログラムとデータの分離
リレーショナルデータベースで、データを
「高速に返す」「維持する」「守る」
Japan PostgreSQL User's Group 5
アプリ開発とデータベース、アプリ開発とPostgreSQL
システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由
目次
プログラムとデータの分離
独自にデータを持つ場合 データベースで一元管理
Japan PostgreSQL User's Group 6
データベースによるデータ層の「抽象化」
My Program
My Only Data
文字列 file 配列
入力から 条件に合う
データを探す
計算して (プログラム固有の処理)
画面を生成
My Program
計算して (プログラム固有の処理)
画面を生成
データベース
データベースに 問い合わせ
他の プログラム
条件に合う データを探して
返却
リレーショナルデータベースの機能
リレーショナルデータベース管理システム(RDBMS)
RDBMSの機能イメージ
Japan PostgreSQL User's Group 7
RDBMSにはこれだけ(こんなに)任せましょう!
RDBMS
PostgreSQL
SQL SQL RDBMSの
共通操作言語
同時実行の実現 不正アクセスの禁止
結果を高速に 返却する
データを 適切に維持
確定された データを守る
リレーショナルデータベースの機能
RDBで行う「データ」の扱い
Japan PostgreSQL User's Group 8
プログラム側でこれらを実現するのは大変
結果を高速に 返却する
データを 適切に維持
確定された データを守る
表形式のデータ
:
大量のデータから、条件に合う データを効率の良い方法で検索
変更されるデータをチェックし、 誤ったデータが入ることを防ぐ
全てのデータはバックアップなど 様々な手段で保護され、あらゆる障害から復旧できる
【参考】RDBとNoSQL
RDBのレプリケーション NoSQLでの例
Japan PostgreSQL User's Group 9
1筐体で「データを守る」ことがRDB本来の役目
Master Slave
複数台slaveで 参照負荷分散
RDBでは、 ・トランザクションの実現 ・SQL対応や正規化されたテーブル構造の維持
PG-REX
死活監視や 障害時の切り替え
書き込みが順に伝搬するとして、n筐体から 応答があれば書き込みを成功とみなす。
参照時に最新データが見れるとは限らない。
このような構造の利点は、 ・1台の障害による影響が少ない点 ・ディスクに永続化したデータを持つ必要が なく、メモリだけで高速に動作出来る点 (n台以上の同時多重障害でない場合に限る)
書き込み
成功
成功
PostgreSQLで学ぶデータベース技術
RDBでデータを高速に返却する
集合を扱うSQL / ifやloopで表現する他の言語
Japan PostgreSQL User's Group 10
アプリ開発とデータベース、アプリ開発とPostgreSQL
システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由
目次
RDBでデータを高速に返却する
条件にマッチするデータを最適な方法で検索
Japan PostgreSQL User's Group 11
利用者は欲しいもの(条件)を指定するだけ
RDBMS
PostgreSQL
SQL SQL RDBMSの共通操作言語
○○表の××の条件に 該当するデータ メモリを有効に使う
表のデータ量は? インデックスはある? インデックス使う?
JOINの順番は? どうやってJOINするの? 条件に合うデータは何件?
: 他に選択肢はある? どっちが早い?
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
・結果が何件あってもモレなく返却 ・結果が何件になるか予測して、 もっとも効率の良い方法で探索
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
(参考)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
(参考)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!
PostgreSQLで学ぶデータベース技術
現実の処理をコンピュータで扱う
確定したデータを維持する
どのデータを最新とするか
【ハイレベル】 ACIDの原則
Japan PostgreSQL User's Group 16
アプリ開発とデータベース、アプリ開発とPostgreSQL
システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由
目次
トランザクションを理解する
現実の処理とコンピュータ上の数字の矛盾
Japan PostgreSQL User's Group 17
現実の処理をコンピュータで正しく扱う考え方
目をつけていたアイテムが タッチの差で取られてしまった! 単なる数字上での話として扱うなら、箱の中身がマイナスに! ・選ぶところから含めて、すべての 処理を早いもの勝ちで進める ・いったん投票のターンを設ける など、方法はいろいろ
あげる もらう
「あげる」「もらう」は同時であり 現実世界で割り込まれることは無い 同時に他の人も操作していると 割り込みが発生 ・「あげる」「もらう」は別々の更新 ・「あげる」「もらう」が両方完了して はじめて処理を成功とみなす
確定したデータを維持する
トランザクションを「完了」する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前まで戻す
どのデータを最新とみなすか
トランザクション内外でのデータの見え方
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
割り込みをブロックする
行レベルロックで同時実行を実現
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
【ハイレベル】ACIDの原則
Japan PostgreSQL User's Group 21
トランザクションはACIDの原則に従う
Atomicity(原子性)
• 一連の処理をひとまとめにし、それ以上分解できない
• 同時にcommitまたはrollbackされる
Consistency(整合性)
• 誤ったデータが入ることを防ぐ
• 箱の中身はマイナスの個数にはならない、など
Isolation(独立性)
• 実行中の処理が他のトランザクションに影響を与えない
• 未確定のデータは他のトランザクションから見えない
Durability(永続性)
• 確定したトランザクションの結果が守られる
• 障害時にバックアップから復旧できる仕組みを実装
PostgreSQLで学ぶデータベース技術
大量のトラフィックをさばくwebサービス
複雑なSQLを賢く実行する業務システム
大量データを一気に読み込む分析システム
Japan PostgreSQL User's Group 22
アプリ開発とデータベース、アプリ開発とPostgreSQL
システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由
目次
PostgreSQLを選ぶ理由
RDBの得意分野 負荷分散レプリケーション
Japan PostgreSQL User's Group 23
大量のトラフィックをさばくwebサービスの場合
RDBMS
PostgreSQL
APサーバー
• 参照クエリが多数 • ほとんどのクエリが、
ユーザーIDをキーにした一意検索
• メモリ上で処理
RDBの得意分野
PostgreSQL Master
PostgreSQL 同期Slave1
PostgreSQL 非同期Slave2
APサーバー
• 参照クエリが多数 • 更新はマスターのみ • 参照はスレーブで可能
PostgreSQLを選ぶ理由
豊富なSQL構文、拡張 高可用レプリケーション
Japan PostgreSQL User's Group 24
複雑なSQLを賢く実行する業務システム
RDBMS
PostgreSQL
APサーバー
• webと比較して、同時実行は若干減
• 業務要件に従ってクエリのパターンが多種多様
• 集計は扱うデータ量が増大
拡張データ型や 索引で高速に処理
PostgreSQL Master
PostgreSQL 非同期Slave1
APサーバー
• システムダウンの影響が大きい
• 堅牢かつ高速な復旧が 求められる
Window関数など 便利な構文に対応
高可用 クラスタウェア
vip
【参考】 PG-REX pgpool-II
PostgreSQLを選ぶ理由
パーティショニング パラレルクエリ
Japan PostgreSQL User's Group 25
大量データを一括で読み込む分析システム
RDBMS
PostgreSQL
APサーバー
• 同時実行は少数 • 過去数年分のデータを保管
しているようなシステム • 直近xヶ月分を分析
• あらかじめテーブルをパーティション分割
• I/Oを大幅に減らして集計時間を削減
• 豊富な分析用SQL構文や索引も活用
• 大規模表の読み取り、結合、集約に利用できる
• 1 クエリを内部で複数並列に分割して実行
• パーティショニングとの 併用で効果絶大
今秋リリース Ver9.6の新機能
まとめ
アプリ層とDB層を意識し、データを正しく扱いましょう
様々なシステムでRDB、PostgreSQLが活躍する
Japan PostgreSQL User's Group 26
アプリ開発とデータベース、アプリ開発とPostgreSQL
DBが得意な処理はどんどん任せる
SQL 集合に対する操作 データ層の高速化
トランザクション 同時実行
データの永続化
webアプリ 業務システム 分析システム
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からの移行
新機能や拡張の 開発現場から
初級者向け チュートリアル
Recommended