27
PostgreSQLで学ぶ データベース技術 アプリ開発とデータベース アプリ開発とPostgreSQL 18中国地方DB勉強会 2016.11.26 NPO法人 日本PostgreSQLユーザ会 株式会社アシスト 喜田 紘介

Chugokudb18_1

Embed Size (px)

Citation preview

Page 1: Chugokudb18_1

PostgreSQLで学ぶ データベース技術

アプリ開発とデータベース

アプリ開発とPostgreSQL

第18回 中国地方DB勉強会 2016.11.26

NPO法人 日本PostgreSQLユーザ会

株式会社アシスト 喜田 紘介

Page 2: Chugokudb18_1

自己紹介

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 | このテーブル設計はイケてない!注意!

Page 3: Chugokudb18_1

PostgreSQLで学ぶデータベース技術

すべてのアプリ開発者に知ってほしい、データベースの役割の大事なことをまとめました

データにまつわる面倒なことは、データベースに任せてしまいましょう!

Japan PostgreSQL User's Group 3

アプリ開発とデータベース、アプリ開発とPostgreSQL

学習すること

システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由

目次

Page 4: Chugokudb18_1

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

Page 5: Chugokudb18_1

PostgreSQLで学ぶデータベース技術

プログラムとデータの分離

リレーショナルデータベースで、データを

「高速に返す」「維持する」「守る」

Japan PostgreSQL User's Group 5

アプリ開発とデータベース、アプリ開発とPostgreSQL

システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由

目次

Page 6: Chugokudb18_1

プログラムとデータの分離

独自にデータを持つ場合 データベースで一元管理

Japan PostgreSQL User's Group 6

データベースによるデータ層の「抽象化」

My Program

My Only Data

文字列 file 配列

入力から 条件に合う

データを探す

計算して (プログラム固有の処理)

画面を生成

My Program

計算して (プログラム固有の処理)

画面を生成

データベース

データベースに 問い合わせ

他の プログラム

条件に合う データを探して

返却

Page 7: Chugokudb18_1

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

リレーショナルデータベース管理システム(RDBMS)

RDBMSの機能イメージ

Japan PostgreSQL User's Group 7

RDBMSにはこれだけ(こんなに)任せましょう!

RDBMS

PostgreSQL

SQL SQL RDBMSの

共通操作言語

同時実行の実現 不正アクセスの禁止

結果を高速に 返却する

データを 適切に維持

確定された データを守る

Page 8: Chugokudb18_1

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

RDBで行う「データ」の扱い

Japan PostgreSQL User's Group 8

プログラム側でこれらを実現するのは大変

結果を高速に 返却する

データを 適切に維持

確定された データを守る

表形式のデータ

大量のデータから、条件に合う データを効率の良い方法で検索

変更されるデータをチェックし、 誤ったデータが入ることを防ぐ

全てのデータはバックアップなど 様々な手段で保護され、あらゆる障害から復旧できる

Page 9: Chugokudb18_1

【参考】RDBとNoSQL

RDBのレプリケーション NoSQLでの例

Japan PostgreSQL User's Group 9

1筐体で「データを守る」ことがRDB本来の役目

Master Slave

複数台slaveで 参照負荷分散

RDBでは、 ・トランザクションの実現 ・SQL対応や正規化されたテーブル構造の維持

PG-REX

死活監視や 障害時の切り替え

書き込みが順に伝搬するとして、n筐体から 応答があれば書き込みを成功とみなす。

参照時に最新データが見れるとは限らない。

このような構造の利点は、 ・1台の障害による影響が少ない点 ・ディスクに永続化したデータを持つ必要が なく、メモリだけで高速に動作出来る点 (n台以上の同時多重障害でない場合に限る)

書き込み

成功

成功

Page 10: Chugokudb18_1

PostgreSQLで学ぶデータベース技術

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

集合を扱うSQL / ifやloopで表現する他の言語

Japan PostgreSQL User's Group 10

アプリ開発とデータベース、アプリ開発とPostgreSQL

システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由

目次

Page 11: Chugokudb18_1

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

条件にマッチするデータを最適な方法で検索

Japan PostgreSQL User's Group 11

利用者は欲しいもの(条件)を指定するだけ

RDBMS

PostgreSQL

SQL SQL RDBMSの共通操作言語

○○表の××の条件に 該当するデータ メモリを有効に使う

表のデータ量は? インデックスはある? インデックス使う?

JOINの順番は? どうやってJOINするの? 条件に合うデータは何件?

: 他に選択肢はある? どっちが早い?

Page 12: Chugokudb18_1

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

・結果が何件あってもモレなく返却 ・結果が何件になるか予測して、 もっとも効率の良い方法で探索

Page 13: Chugokudb18_1

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

Page 14: Chugokudb18_1

(参考)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

Page 15: Chugokudb18_1

(参考)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!

Page 16: Chugokudb18_1

PostgreSQLで学ぶデータベース技術

現実の処理をコンピュータで扱う

確定したデータを維持する

どのデータを最新とするか

【ハイレベル】 ACIDの原則

Japan PostgreSQL User's Group 16

アプリ開発とデータベース、アプリ開発とPostgreSQL

システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由

目次

Page 17: Chugokudb18_1

トランザクションを理解する

現実の処理とコンピュータ上の数字の矛盾

Japan PostgreSQL User's Group 17

現実の処理をコンピュータで正しく扱う考え方

目をつけていたアイテムが タッチの差で取られてしまった! 単なる数字上での話として扱うなら、箱の中身がマイナスに! ・選ぶところから含めて、すべての 処理を早いもの勝ちで進める ・いったん投票のターンを設ける など、方法はいろいろ

あげる もらう

「あげる」「もらう」は同時であり 現実世界で割り込まれることは無い 同時に他の人も操作していると 割り込みが発生 ・「あげる」「もらう」は別々の更新 ・「あげる」「もらう」が両方完了して はじめて処理を成功とみなす

Page 18: Chugokudb18_1

確定したデータを維持する

トランザクションを「完了」する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前まで戻す

Page 19: Chugokudb18_1

どのデータを最新とみなすか

トランザクション内外でのデータの見え方

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

Page 20: Chugokudb18_1

割り込みをブロックする

行レベルロックで同時実行を実現

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

Page 21: Chugokudb18_1

【ハイレベル】ACIDの原則

Japan PostgreSQL User's Group 21

トランザクションはACIDの原則に従う

Atomicity(原子性)

• 一連の処理をひとまとめにし、それ以上分解できない

• 同時にcommitまたはrollbackされる

Consistency(整合性)

• 誤ったデータが入ることを防ぐ

• 箱の中身はマイナスの個数にはならない、など

Isolation(独立性)

• 実行中の処理が他のトランザクションに影響を与えない

• 未確定のデータは他のトランザクションから見えない

Durability(永続性)

• 確定したトランザクションの結果が守られる

• 障害時にバックアップから復旧できる仕組みを実装

Page 22: Chugokudb18_1

PostgreSQLで学ぶデータベース技術

大量のトラフィックをさばくwebサービス

複雑なSQLを賢く実行する業務システム

大量データを一気に読み込む分析システム

Japan PostgreSQL User's Group 22

アプリ開発とデータベース、アプリ開発とPostgreSQL

システムの中核を担うデータベース RDBMSが得意な処理、苦手な処理 トランザクションを理解する PostgreSQLを選択する理由

目次

Page 23: Chugokudb18_1

PostgreSQLを選ぶ理由

RDBの得意分野 負荷分散レプリケーション

Japan PostgreSQL User's Group 23

大量のトラフィックをさばくwebサービスの場合

RDBMS

PostgreSQL

APサーバー

• 参照クエリが多数 • ほとんどのクエリが、

ユーザーIDをキーにした一意検索

• メモリ上で処理

RDBの得意分野

PostgreSQL Master

PostgreSQL 同期Slave1

PostgreSQL 非同期Slave2

APサーバー

• 参照クエリが多数 • 更新はマスターのみ • 参照はスレーブで可能

Page 24: Chugokudb18_1

PostgreSQLを選ぶ理由

豊富なSQL構文、拡張 高可用レプリケーション

Japan PostgreSQL User's Group 24

複雑なSQLを賢く実行する業務システム

RDBMS

PostgreSQL

APサーバー

• webと比較して、同時実行は若干減

• 業務要件に従ってクエリのパターンが多種多様

• 集計は扱うデータ量が増大

拡張データ型や 索引で高速に処理

PostgreSQL Master

PostgreSQL 非同期Slave1

APサーバー

• システムダウンの影響が大きい

• 堅牢かつ高速な復旧が 求められる

Window関数など 便利な構文に対応

高可用 クラスタウェア

vip

【参考】 PG-REX pgpool-II

Page 25: Chugokudb18_1

PostgreSQLを選ぶ理由

パーティショニング パラレルクエリ

Japan PostgreSQL User's Group 25

大量データを一括で読み込む分析システム

RDBMS

PostgreSQL

APサーバー

• 同時実行は少数 • 過去数年分のデータを保管

しているようなシステム • 直近xヶ月分を分析

• あらかじめテーブルをパーティション分割

• I/Oを大幅に減らして集計時間を削減

• 豊富な分析用SQL構文や索引も活用

• 大規模表の読み取り、結合、集約に利用できる

• 1 クエリを内部で複数並列に分割して実行

• パーティショニングとの 併用で効果絶大

今秋リリース Ver9.6の新機能

Page 26: Chugokudb18_1

まとめ

アプリ層とDB層を意識し、データを正しく扱いましょう

様々なシステムでRDB、PostgreSQLが活躍する

Japan PostgreSQL User's Group 26

アプリ開発とデータベース、アプリ開発とPostgreSQL

DBが得意な処理はどんどん任せる

SQL 集合に対する操作 データ層の高速化

トランザクション 同時実行

データの永続化

webアプリ 業務システム 分析システム

Page 27: Chugokudb18_1

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からの移行

新機能や拡張の 開発現場から

初級者向け チュートリアル