Web エンジニアが postgre sql を選ぶ 3 つの理由

151
Web エンジニアが PostgreSQL を選ぶ 3 つの理由 PostgreSQLカンファレンス 2014

description

PostgreSQLカンファレンス2014の資料です

Transcript of Web エンジニアが postgre sql を選ぶ 3 つの理由

Page 1: Web エンジニアが postgre sql を選ぶ 3 つの理由

Web エンジニアが

PostgreSQL を選ぶ 3 つの理由PostgreSQLカンファレンス 2014

Page 2: Web エンジニアが postgre sql を選ぶ 3 つの理由

What is it?

データベースは何を基準に選んでますか?

Page 3: Web エンジニアが postgre sql を選ぶ 3 つの理由

What is it?アプリケーションにとって

データの寿命はコードより長い

という事実

Page 4: Web エンジニアが postgre sql を選ぶ 3 つの理由

What is it?

なぜPostgreSQLを使うのか

Page 5: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 6: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 7: Web エンジニアが postgre sql を選ぶ 3 つの理由

自己紹介名前:曽根 壮大(そね たけとも) 年齢:30歳(三人の子供がいます) 職業:Webエンジニア

所属:日本PostgreSQLユーザ会

   中国支部 支部長

  技術的にはLL系言語とかRDBが好きです

Page 8: Web エンジニアが postgre sql を選ぶ 3 つの理由

中国地方DB勉強会

https://dbstudychugoku.github.io/

Page 9: Web エンジニアが postgre sql を選ぶ 3 つの理由
Page 10: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 11: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

仕様変更に強いランキングを作る

Page 12: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

Viewに紐づくデータは

仕様変更

の影響を受けやすい

Page 13: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

ランキング

Page 14: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

ランキング ↓

要件が多様なので影響を受けやすい

Page 15: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力

フリーザ 530000

悟飯(幼少期) 1307

クリリン(ラディッツ戦) 206

ヤムチャ(ラディッツ戦) 177

Page 16: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る要件

Page 17: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る要件

1 戦闘力の降順(DESC)

Page 18: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る要件

1 戦闘力の降順(DESC) 2 表示は名前と戦闘力

Page 19: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQL

SELECT

名前,戦闘力

FROM キャラクター

ORDER BY

戦闘力

DESC

Page 20: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る要件

1 戦闘力の降順(DESC) 2 表示は名前と戦闘力 3 上位三名を表示

Page 21: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQL

SELECT 名前,戦闘力

FROM キャラクター

ORDER BY 戦闘力

DESCLIMIT 3

Page 22: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る要件

1 戦闘力の降順(DESC) 2 表示は名前と戦闘力 3 上位三名を表示 4 編で分ける

Page 23: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編

フリーザ 530000 フリーザ編

悟飯(幼少期) 1307 ラディッツ編

クリリン 206 ラディッツ編

ヤムチャ 177 ラディッツ編

農夫 5 ラディッツ編

ギニュー 120000 フリーザ編

クリリン 1500 フリーザ編

亀仙人 139 ラディッツ編

※実務では編は正規化するべき

Page 24: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQLSELECT 名前,戦闘力

FROM キャラクター

WHERE 編 = ‘フリーザ編’ または 編 = ‘ラディッツ編’

ORDER BY 戦闘力

DESCLIMIT 3

Page 25: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

クライアント「それじゃない。」

Page 26: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編

悟飯(幼少期) 1307 ラディッツ編

クリリン 206 ラディッツ編

ヤムチャ 177 ラディッツ編

亀仙人 139 ラディッツ編

農夫 5 ラディッツ編

フリーザ 530000 フリーザ編

ギニュー 120000 フリーザ編

クリリン 1500 フリーザ編

Page 27: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

SQLを二回投げるか?

Page 28: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

ウィンドウ関数

Page 29: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るウィンドウ関数

ウィンドウ関数は現在の行に何らの関係するテーブル行の一纏まり全般の計算を行う。

Page 30: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQL

SELECT

rank() OVER (

PARTITION BY "編"

ORDER BY "戦闘力" DESC

)

, *

FROM "キャラクター";

Page 31: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編

悟飯(幼少期) 1307 ラディッツ編

クリリン 206 ラディッツ編

ヤムチャ 177 ラディッツ編

亀仙人 139 ラディッツ編

農夫 5 ラディッツ編

フリーザ 530000 フリーザ編

ギニュー 120000 フリーザ編

クリリン 1500 フリーザ編

Page 32: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

クライアント 「かつキャラの最大戦闘力で並べて」

Page 33: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編フリーザ 530000 フリーザ編フリーザ 10000000 フリーザ編フリーザ 20000000 フリーザ編

悟飯(幼少期) 1307 ラディッツ編クリリン 206 ラディッツ編ヤムチャ 177 ラディッツ編農夫 5 ラディッツ編ギニュー 120000 フリーザ編クリリン 1500 フリーザ編クリリン 0 フリーザ編クリリン 10000 フリーザ編亀仙人 139 ラディッツ編

Page 34: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編

フリーザ 2000000 フリーザ編

ギニュー 120000 フリーザ編

クリリン 10000 フリーザ編

悟飯(幼少期) 1307 ラディッツ編

クリリン 206 ラディッツ編

ヤムチャ 177 ラディッツ編

亀仙人 139 ラディッツ編

農夫 5 ラディッツ編

Page 35: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQL

SELECTrank() OVER ( PARTITION BY "編"

ORDER BY max("戦闘力") DESC

) , "名前", MAX("戦闘力"), "編"

FROM "キャラクター"

GROUP BY "名前","編";

Page 36: Web エンジニアが postgre sql を選ぶ 3 つの理由

名前 戦闘力 編

フリーザ 2000000 フリーザ編

ギニュー 120000 フリーザ編

クリリン 1500 フリーザ編

悟飯(幼少期) 1307 ラディッツ編

クリリン 206 ラディッツ編

ヤムチャ 177 ラディッツ編

亀仙人 139 ラディッツ編

農夫 5 ラディッツ編

Page 37: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

仕様変更に強いランキングを作る

Page 38: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

開発者 「毎回SQLの差し替えするの辛い」

Page 39: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

Viewを使う

Page 40: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

街角の声 「Viewを使うと遅いのでは?」

Page 41: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るView

Page 42: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るView

• INDEXは効く

Page 43: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るView

• INDEXは効く • 参照の際にSQLを実行するだけ

Page 44: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るView

• INDEXは効く • 参照の際にSQLを実行するだけ • 元のSQLが遅い場合は当然遅い

Page 45: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

参照元のテーブルが大きくなった

Page 46: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

参照元のテーブルが大きくなった ↓

参照元のSQLが遅い

Page 47: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

マテリアライズドビュー

Page 48: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るマテリアライズドビュー

実体の存在するView。 参照したクエリ結果を保存するため、参照元を更新した際はマテビューの更新も必要になる。

※ただしPostgreSQL 9.3からの機能

Page 49: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

クエリ結果を実体化する

Page 50: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

クエリ結果を実体化する ↓ 高速化

Page 51: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

マテビューは銀の弾丸ではない

Page 52: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るマテビューの問題点

・リフレッシュ管理が必要(自動更新しない) ※ただし、9.4から自動更新が可能 ・普通のテーブル同様に表領域を消費する ・リフレッシュはそれなりにリソースを使う

Page 53: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作る

更新が多いとボトルネックになる

Page 54: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るまとめ

Page 55: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るまとめ

1 データをシンプルに保つ

Page 56: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るまとめ

1 データをシンプルに保つ 2 コード側の実装に依存しない

Page 57: Web エンジニアが postgre sql を選ぶ 3 つの理由

ランキングを作るまとめ

1 データをシンプルに保つ 2 コード側の実装に依存しない 3 要件に合わせて選択肢を選ぶ

Page 58: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 59: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

Page 60: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

• アンケートフォーム

Page 61: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

• アンケートフォーム • ユーザの付属情報

Page 62: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

• アンケートフォーム • ユーザの付属情報 • ブログのタブ

Page 63: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

• アンケートフォーム • ユーザの付属情報 • ブログのタブ などなど…

Page 64: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

Page 65: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

Page 66: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 キャラクター 回答日

そーだい 榛名 2014/11/28

たけとも 高雄 2014/11/28

soudai1025 大和 2014/11/29

Page 67: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

ここに「択一回答」があるじゃろ?     ( ^ω^)←お客様

⊃ 択一回答⊂

Page 68: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

これを     ( ^ω^)←お客様

⊃ )択一回答(⊂

Page 69: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

こうして…     ( ^ω^)←お客様

≡⊃⊂≡

Page 70: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

こうじゃ!     ( ^ω^)←お客様

⊃ 複数回答 ⊂

Page 71: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

Page 72: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うアンケートフォーム

テキストフォームまでこっそり追加される

Page 73: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

どのように対応するか

Page 74: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うデータについて

Page 75: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うデータについて

• データを消せない

Page 76: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うデータについて

• データを消せない • データを変更できない

Page 77: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うデータについて

• データを消せない • データを変更できない • データの追加で対応

Page 78: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

SQLアンチパターン ↓

カンマ区切り(CSV)で保存 ※ジェイ・ウォーク

Page 79: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 キャラクター 回答日

そーだい 榛名 2014/11/28

たけとも 高雄,榛名 2014/11/28

soudai1025 大和,金剛,武蔵 2014/11/29

Page 80: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 キャラクター 回答日

そーだい 榛名 2014/11/28

たけとも 高雄,榛名 2014/11/28

soudai1025 大和,金剛,武蔵 2014/11/29

保存するデータが カラムのサイズに依存する

Page 81: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

Page 82: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 検索が難しい

Page 83: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 検索が難しい • 集計が難しい

Page 84: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 検索が難しい • 集計が難しい • 更新が難しい

Page 85: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

SQLアンチパターン ↓

データの数だけカラムを増やす ※メタデータトリブン

Page 86: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 キャラ1 キャラ2 キャラ3 回答日

そーだい 榛名 NULL NULL 2014/11/28

たけとも 高雄 榛名 NULL 2014/11/28

soudai1025 大和 金剛 武蔵 2014/11/29

Page 87: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

Page 88: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 項目追加の度にカラムが増える

Page 89: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 項目追加の度にカラムが増える • データの可読性が下がる

Page 90: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うSQLアンチパターン

• 項目追加の度にカラムが増える • データの可読性が下がる • データの整合性を担保が難しい

Page 91: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

正規化

Page 92: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 回答日

そーだい 2014/11/28

たけとも 2014/11/28

soudai1025 2014/11/29

回答者 キャラクターそーだい 榛名たけとも 高雄たけとも 榛名soudai1025 大和soudai1025 金剛soudai1025 武蔵

Page 93: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

最初から正規化すれば両対応

Page 94: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

集合でデータを表現する

Page 95: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

変更に強くなる

Page 96: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

PostgreSQLのアプローチ

Page 97: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う

PostgreSQLのアプローチ ↓ 配列型

Page 98: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 キャラクター 回答日

そーだい {榛名} 2014/11/28

たけとも {高雄,榛名} 2014/11/28

soudai1025 {大和,金剛,武蔵} 2014/11/29

Page 99: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型

Page 100: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型

• INDEXが効く

Page 101: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型

• INDEXが効く • 柔軟な検索(内包なども可能)

Page 102: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型

• INDEXが効く • 柔軟な検索(内包なども可能) • 任意の箇所の更新も可能

Page 103: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型の注意点

• 外部制約が使えない • ORMが多くの場合使えない

Page 104: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型のその他の使い方

• タグなどの複数の値を持たせる • 木構造を表現する

Page 105: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型まとめ

Page 106: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型まとめ

• 外部制約の不要な場合に使う

Page 107: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型まとめ

• 外部制約の不要な場合に使う • ORMに依存しない場合に使う

Page 108: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱う配列型まとめ

• 外部制約の不要な場合に使う • ORMに依存しない場合に使う • 最初に正規化を検討する

Page 109: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うもっと柔軟に対応したい

Page 110: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うもっと柔軟に対応したい

• ドキュメント志向

Page 111: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うもっと柔軟に対応したい

• ドキュメント志向 • スキーマレス

Page 112: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うもっと柔軟に対応したい

• ドキュメント志向 • スキーマレス • Key=>Valueな関係性を保存

Page 113: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

Page 114: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• JSON本体をカラムに保存

Page 115: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• JSON本体をカラムに保存 • 高速な参照(INDEXが効く)

Page 116: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• JSON本体をカラムに保存 • 高速な参照(INDEXが効く) • 各種変換の関数を用意

Page 117: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 JSON 回答日

そーだい {キャラクタ:[榛名]} 2014/11/28

たけとも {キャラクタ:[高雄,榛名]} 2014/11/28

soudai1025 {キャラクタ:[大和,榛名,武蔵]} 2014/11/29

Page 118: Web エンジニアが postgre sql を選ぶ 3 つの理由

回答者 JSON 回答日

そーだい {キャラクタ:[榛名],Lv:40} 2014/11/28

たけとも {キャラクタ:[高雄,榛名]} 2014/11/28

soudai1025 {キャラクタ:[大和,榛名,武蔵]} 2014/11/29

Page 119: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

Page 120: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• 柔軟にデータを保存できる

Page 121: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• 柔軟にデータを保存できる • View変更によるDB変更が不要

Page 122: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型

• 柔軟にデータを保存できる • View変更によるDB変更が不要 • 9.4からはより強力なJSONB型

Page 123: Web エンジニアが postgre sql を選ぶ 3 つの理由

可変なプロパティを扱うJSON型の注意点

• 外部制約の不要な場合に使う • ORMに依存しない場合に使う • 問題点は配列型と同様

Page 124: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 125: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める豊富な型の例

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

Page 126: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める型を選ぶ利点

Page 127: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める型を選ぶ利点

• 正しいデータのみが保存される

Page 128: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める型を選ぶ利点

• 正しいデータのみが保存される • 正しいソートが行われる

Page 129: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める型を選ぶ利点

• 正しいデータのみが保存される • 正しいソートが行われる • 適切な検索が行える

Page 130: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極めるネットワークアドレス型

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• IPv4もIPv6も対応 • サブネットマスクの整合性 • 文字列ではなくIPとしてソート

Page 131: Web エンジニアが postgre sql を選ぶ 3 つの理由

IP

192.1.1.1/32

192.2.1.1/32

192.10.1.1/32

Page 132: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極める幾何データ型

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• point、boxなど豊富な型 • 充実した関数と演算子 • 地図の範囲検索など

Page 133: Web エンジニアが postgre sql を選ぶ 3 つの理由

店名 緯度 経度

品川AP 35.630793 139.73786

品川駅 35.630152 139.74044

五反田駅 35.626446 139.723444

Page 134: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQL

SELECT

sqrt(power((対象緯度-自分の緯度)*111,2)

 +

power((対象経度-自分の経度)* 91,2))

 AS distance

平均で緯度1度あたり111km

平均で経度1度あたり91km

Page 135: Web エンジニアが postgre sql を選ぶ 3 つの理由

検索例半径●●メートルの中の登録店を調べる

自分を中心とした円に含まれているか

Page 136: Web エンジニアが postgre sql を選ぶ 3 つの理由

実際のSQLSELECT 店名,

sqrt(power((お店.緯度 - 自分の緯度) * 111, 2)

+ power((お店.経度 - 自分の経度) * 91, 2)) AS 距離(km)

FROM お店

WHERE circle(point(お店.緯度*91.0,お店.経度*111.0), 円の半径)

@ circle(point(自分の緯度*91.0,自分の経度*111.0), 円の半径)

Page 137: Web エンジニアが postgre sql を選ぶ 3 つの理由

店名 距離(km)

品川AP 0.01

品川駅 0.4

Page 138: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極めるまとめ

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

Page 139: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極めるまとめ

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• 適切な型にデータを入れる

Page 140: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極めるまとめ

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• 適切な型にデータを入れる • 型を使い不正なデータを無くす

Page 141: Web エンジニアが postgre sql を選ぶ 3 つの理由

型を極めるまとめ

• 列挙(enum)型 • ネットワーク・アドレス型 • 範囲型 • 幾何データ型

• 適切な型にデータを入れる • 型を使い不正なデータを無くす • 特別な検索も可能になる

Page 142: Web エンジニアが postgre sql を選ぶ 3 つの理由

あじぇんだ

1 自己紹介 2 ランキングを作る 3 可変なプロパティを扱う 4 型を極める 5 まとめ

Page 143: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

Page 144: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

Webは日々複雑になっている

Page 145: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

Webは日々複雑になっている ↓

取り扱うデータも増えている

Page 146: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

運用が始まるとデータは変えれない

Page 147: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

運用が始まるとデータは変えれない ↓

どんなにコードが綺麗でもデータ構造がダメだとリファクタリングは難しい

Page 148: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

SQLや型を使ってデータを守る

Page 149: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

SQLや型を使ってデータを守る ↓

運用をシンプルにする

Page 150: Web エンジニアが postgre sql を選ぶ 3 つの理由

まとめ

データの寿命はコードより長い

Page 151: Web エンジニアが postgre sql を選ぶ 3 つの理由

ご静聴ありがとうございました。