Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
実務で役立つ!
データベースの活用法
オープンセミナー2015@香川
What is it?
データベースは何を基準に選んでますか?
What is it?
利用するデータベースを
正しく選ぶこと
はプロジェクトの成功にとても大切です
What is it?
しかし、時代は大NOSQL時代
What is it?
RDBすら多いのに…
NOSQLって何よ…
どれがいいのよ…
What is it?
RDBすら多いのに…
NOSQLって何よ…
どれがいいのよ…
What is it?
RDBすら多いのに…
NOSQLって何よ…
どれがいいのよ…
What is it?
そう言ったお悩みに
種類別データベースの活用方法
を今日は発表します
What is it?
ただし
チューニングやDB設計
の話は今日はしません
What is it?
主にデータベースの選び方の話です
What is it?
正しいDB選択で
未来の自分を助ける
方法を説明します
あじぇんだ
1 自己紹介
2 データベースの種類と特徴
3 データベースの選び方
4 まとめ
あじぇんだ
1 自己紹介
2 データベースの種類と特徴
3 データベースの選び方
4 まとめ
自己紹介
名前:曽根 壮大(そね たけとも)
年齢:30歳(三人の子供がいます)
職業:Webエンジニア
所属:日本PostgreSQLユーザ会
   中国支部 支部長
  技術的にはLL系言語とかRDBが好きです
https://dbstudychugoku.github.io/
あじぇんだ
1 自己紹介
2 データベースの種類と特徴
3 データベースの選び方
4 まとめ
データベースの種類と特徴
RDBとNOSQL
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
データベースの種類と特徴
RDB
リレーショナルデータモデルの理論に
基づいたDBMSで現在もっとも広く使
われているデータベースシステム
データベースの種類と特徴
NOSQL(Not Only SQL)
RDB以外のDBシステムの総称
グラフデータモデルなどのリレーショ
ナルモデル以外のサポートなどRDBが
不得意な分野に特化している
データベースの種類と特徴
ACIDとCAP定理とBASE
データベースの種類と特徴
ACID
データベースの種類と特徴
ACID
関連する複数の処理を一つの処理単位
にまとめて管理するトランザクション
処理に求められる4つの特性
データベースの種類と特徴
ACID
• 原子性(Atomicity)
• 一貫性(Consistency)
• 独立性(Isolation)
• 永続性(Durability)
データベースの種類と特徴
ACID
• 原子性(Atomicity)
• 一貫性(Consistency)
• 独立性(Isolation)
• 永続性(Durability)
Atomicity(原子性)とは、
トランザクションに含まれる個々の手順が
  「すべて実行される」か「一つも実行されない」
のどちらかの状態になるという性質
データベースの種類と特徴
ACID
• 原子性(Atomicity)
• 一貫性(Consistency)
• 独立性(Isolation)
• 永続性(Durability)
Consistency(一貫性)とは、
トランザクションの前後でデータの整合性が保たれ、
矛盾の無い状態が継続される性質
データベースの種類と特徴
ACID
• 原子性(Atomicity)
• 一貫性(Consistency)
• 独立性(Isolation)
• 永続性(Durability)
Isolation(独立性)とは、
トランザクション実行中の処理過程が外部から隠 され、
他の処理などに影響を与えない性質
データベースの種類と特徴
ACID
• 原子性(Atomicity)
• 一貫性(Consistency)
• 独立性(Isolation)
• 永続性(Durability)
Durability(永続性)とは、
トランザクションが完了したら、
その結果は記録され、失われることがないという性質
データベースの種類と特徴
CAP定理
データベースの種類と特徴
CAP定理
Webサービスを想定して作られた
分散化データベースの定理
全てを完璧に満たすことができず、
いずれかに偏る形でしか出来ない
データベースの種類と特徴
CAP定理
• 整合性 (Consistency)
• 可用性 (Availability)
• 分断耐性 (Partitions)
データベースの種類と特徴
CAP定理
• 整合性 (Consistency)
• 可用性 (Availability)
• 分断耐性 (Partitions)
整合性 (Consistency)とは、
全てのクライアントが常に同一のデータを見る性質
データベースの種類と特徴
CAP定理
• 整合性 (Consistency)
• 可用性 (Availability)
• 分断耐性 (Partitions)
可用性 (Availability)とは、
全てのクライアントが読み出しと書き込みが出来る性質
データベースの種類と特徴
CAP定理
• 整合性 (Consistency)
• 可用性 (Availability)
• 分断耐性 (Partitions)
分断耐性 (Partitions)とは、
物理ネットワークが分断されても
間違った結果が発生しない性質
データベースの種類と特徴
A:可用性C:整合性
P:分断耐性
データベースの種類と特徴
A:可用性C:整合性
P:分断耐性
CA型
PostgreSQL、MySQLなど(RDB全般)
データベースの種類と特徴
A:可用性C:整合性
P:分断耐性
Dynamo、Cassandraなど
AP型
データベースの種類と特徴
A:可用性C:整合性
P:分断耐性
MongoDB、Redisなど
CP型
データベースの種類と特徴
BASE
データベースの種類と特徴
BASE
整合性(C)と分断耐性(P)を重視した場
合はACIDを満たす必要がある
しかし整合性(C)よりも可用性(A)と分
断耐性(P)を重視する場合はBASEを
満たす必要がある
データベースの種類と特徴
ACID(CP型)とBASE(AP型)
データベースの種類と特徴
BASE
• Basically Available
• Soft-State
• Eventual Consistency
データベースの種類と特徴
BASE
• Basically Available
• Soft-State
• Eventual Consistency
どんな時でもアプリケーションが動く
データベースの種類と特徴
BASE
• Basically Available
• Soft-State
• Eventual Consistency
常に整合性を保つ必要がない
データベースの種類と特徴
BASE
• Basically Available
• Soft-State
• Eventual Consistency
結果として整合性が取れる状態に至る
データベースの種類と特徴
アーキテクチャ
データベースの種類と特徴
アーキテクチャ
↓
ACIDやBASEを
どのように実現するか
データベースの種類と特徴
アーキテクチャ
↓
マスタ型とP2P型
データベースの種類と特徴
マスタ型
マスタ
スレーブ スレーブ スレーブ
データベースの種類と特徴
マスタ型
• RDB
• MongoDB
• Bigtable
• HBase …など
データベースの種類と特徴
P2P型
マスタ
マスタ
マスタ
マスタ
データベースの種類と特徴
P2P型
• Cassandra
• Dynamo
• Riak
• Voldemort …など
データベースの種類と特徴
データモデル
データベースの種類と特徴
データモデル
↓
どのようなデータを扱うか
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
RDBの元となるデータモデル
集合と関連でデータを表現する
データベースの種類と特徴
リレーショナル
user_id name
1 hoge
2 fuga
3 bar
4 foo
role_id name
1 開発部
2 営業部
3 運用部
4 総務部
user_id role_id
1 1
1 3
3 2
4 4
データベースの種類と特徴
リレーショナル
user_id name
1 hoge
2 fuga
3 bar
4 foo
role_id name
1 開発部
2 営業部
3 運用部
4 総務部
user_id role_id
1 1
1 3
3 2
4 4
集合を定義する
関係を定義する
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
KeyとValueの組み合わせでデータを表現する
シンプルな構造なのでスケールアウトに適している
keyとvalueが1対1
データベースの種類と特徴
キーバリュー
key value
1 hoge
2 fuga
3 bar
4 foo
5 test
6 花子
7 一太郎
8 三四郎
データベースの種類と特徴
キーバリュー
key value
1 hoge
2 fuga
3 bar
4 foo
5 test
6 花子
7 一太郎
8 三四郎
1:1の関係を保持する
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
キーバリュー型を拡張して行とカラムの概念を追加
RDBのテーブルに似ているがカラムは事前に定義しない
keyに対してvalue(カラム)が1対多も可能
データベースの種類と特徴
カラム指向
key name 所属 所属2 年齢
1 hoge 開発 運用 30
2 fuga 営業 25
3 bar 総務 運用 22
4 foo 運用 35
5 test 開発 42
6 花子 デザイン 運用 25
7 一太郎 ドキュメント 開発 25
8 三四郎 表計算 総務 25
データベースの種類と特徴
カラム指向
key name 所属 所属2 年齢
1 hoge 開発 運用 30
2 fuga 営業 25
3 bar 総務 運用 22
4 foo 運用 35
5 test 開発 42
6 花子 デザイン 運用 25
7 一太郎 ドキュメント 開発 25
8 三四郎 表計算 総務 25
1:Nの関係を保持する
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
階層構造を持たず、ドキュメントそのものを保持する
ドキュメントにはユニークなIDが振られる
スキーマレスなので柔軟な変更が可能
データベースの種類と特徴
ドキュメント指向
name : hoge
role1 : 開発
role2 : 運用
age : 30
name : fuga
role1 : 営業
from : 広島
age : 25
name : bar
role1 : 総務
データベースの種類と特徴
ドキュメント指向
name : hoge
role1 : 開発
role2 : 運用
age : 30
name : fuga
role1 : 営業
from : 広島
age : 25
name : bar
role1 : 総務
それぞれが独立したドキュメント
ドキュメントにはユニークなIDでアクセスが可能
データベースの種類と特徴
ドキュメント指向
name : hoge
role1 : 開発
role2 : 運用
age : 30
name : fuga
role1 : 営業
from : 広島
age : 25
name : bar
role1 : 総務
それぞれが独立しているので
自由な変更が可能
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
データベースの種類と特徴
データモデル
• リレーショナル
• キーバリュー
• カラム指向
• ドキュメント指向 …など
他にもグラフ型やツリー型など多種多様にある
データベースの種類と特徴
これらの組み合わせで
データベースの種類と特徴が決まる
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
あじぇんだ
1 自己紹介
2 データベースの種類と特徴
3 データベースの選び方
4 まとめ
データベースの選び方
ドメインに合わせて選ぶ
ACIDの必要性、CAP定理の条件でど
れが必要か考えて選択肢を選ぶ
データベースの選び方
RDBは多くのデータに対応している
データベースの選び方
しかしRDBは万能ではない
データベースの選び方
NOSQLは目的を絞り込んだDB
データベースの選び方
まずはRDBで検討する
↓
その後、不足をNOSQLで補う
データベースの選び方
RDBで問題なければRDBのみ
データベースの選び方
RDBで問題なければRDBのみ
↓
無理にNOSQLを使わない
データベースの選び方
RDBも要件によって選ぶ
データベースの選び方
SQL Server
• 開発環境(VS,C#など)の連携が強力
• 標準的な機能の多くをサポート
• GUIツールが便利
データベースの選び方
Oracle
• Active - Activeな構成が可能(RAC)
• 独自・標準的な多くの機能
• GUIやサードパーティが充実
• 強力なOracleサポートチーム(有償)
データベースの選び方
MySQL
• レプリケーションが柔軟で強力
• 自動フェイルオーバー完備
• 高速なコネクション(multi Thread)
• OSSなサードパーティが充実
• SSDと相性が良い
データベースの選び方
PostgreSQL
• Oracleにも負けない豊富な機能
• 企業に属さない中立なOSS
• コミュニティを含めたサポート
• OSSなサードパーティが充実
データベースの選び方
デメリットも見る
データベースの選び方
SQL Server
• 商用なので有償
• スケールアウトが苦手
• MS以外の環境でメリットが少ない
• CUIの連携が少ない
データベースの選び方
Oracle
• 商用なので有償(しかも高い)
• 行連鎖や行移行など設計が難しい
• サードパーティが有償(しかも高い)
• ORA-00600のトラウマ
データベースの選び方
MySQL
• 実装されてない機能がある
Window関数が無い
マテビューがない等
• ギャップロック
• 相関サブクエリが苦手(遅い)
データベースの選び方
PostgreSQL
• 追記型の制約(VACUUM、HOT等)
• SSDにしても劇的な高速化はしない
• GUIが弱い(設定を含め、CUIベース)
• デフォルトがdataチェックサム無効
そもそも9.3以上の機能
データベースの選び方
RDBで解決できない問題
データベースの選び方
RDBで解決できない問題
↓
それをNOSQLで解決する
データベースの選び方
RDB全般の問題
• 大量のデータを処理(ビックデータ)
• DBの水平拡張(スケールアウト)
• 多種多様なデータモデル対応
データベースの選び方
RDB全般の問題
• 大量のデータを処理(ビックデータ)
• DBの水平拡張(スケールアウト)
• 多種多様なデータモデル対応
データベースの選び方
大量のデータを処理
• テラやペタ級を処理
• それを高速に処理
• 結果を高速に表示 …など
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
大量のデータから高速に結果を場合
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
結果のみを高速に返す場合
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
大量のデータを集計する場合
データベースの選び方
大量のデータを処理
PaaS(クラウド)がマッチしやすい
・BigQuery
・RedShift
・TreasureData
データベースの選び方
高速に処理
キャッシュのようにKVSを使う
・Memcached
・DynamoDB
・Redis
データベースの選び方
RDB全般の問題
• 大量のデータを処理(ビックデータ)
• DBの水平拡張(スケールアウト)
• 多種多様なデータモデル対応
データベースの選び方
DBの水平拡張(スケールアウト)
• 参照の負荷分散
• 更新の負荷分散
• 可用性の確保 …など
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
RDBでも出来るが
高速ではなかったり、
サードパーティが必要だったりする
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
Dataは分散するが
偏ったアクセスなどは
分散しない場合も多い
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
MongoDBはマスタ型だか
自動フェイルオーバーするので
要件によってはマッチする
データベースの選び方
DBの水平拡張(スケールアウト)
• RDBでも可能
シャーディングやレプリケーション
・負荷の予測と分散化が難しい
・RDBよりも簡単にNOSQLで行う
データベースの選び方
DBの水平拡張(スケールアウト)
• NOSQLは弱い整合性が多い(AP型)
• データにリアルタイム性が不要な場
合がにマッチする(履歴ログなど)
• データの一貫性が不要な場合もマッ
チする(ブログなど)
データベースの選び方
RDB全般の問題
• 大量のデータを処理(ビックデータ)
• DBの水平拡張(スケールアウト)
• 多種多様なデータモデル対応
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
JSONなど非構造化データを格納
最近、PostgreSQLやMySQLも対応してきた領域
アーキテクチャ
ーーーーーーー
データモデル
マスタ型 P2P型 その他
リレーショナル RDB全般 pgpool2など
キーバリュー Hibari
Dynamo
Riak
Memcached
Redis
カラム指向
Bigtable
HBase
Cassandra
ドキュメント指向
MongoDB
CouchDB
グラフ指向 Neo4J InfiniteGraph
グラフ型はRDBが苦手なデータモデルの最たる例
RDBでは難しいデータ構造の表現を可能にする
データベースの選び方
多種多様なデータモデル対応
• リレーショナルモデルで表現出来ないデー
タ構造は無理しない
無理に表現すると問題の原因になる
• データモデルが違う場合、お互いのデータ
利用にインターフェイスが必要
多くの場合はプログラムが結合する
あじぇんだ
1 自己紹介
2 データベースの種類と特徴
3 データベースの選び方
4 まとめ
まとめ
データの寿命はコードより長い
まとめ
一度作ったデータは変更が難しい
まとめ
一度作ったデータは変更が難しい
↓
ソフトウェアの選択が大事
まとめ
長所と短所を把握する
まとめ
長所と短所を把握する
↓
苦手なことをさせない
まとめ
ACIDとCAP定理で比較する
+
データモデルと要件を比較する
まとめ
データモデルとソフトウェア
の特性を理解する
まとめ
リレーショナル・データベース
まとめ
リレーショナル・データベース
↓
グラフやツリーを表現させない
まとめ
ACIDを担保してないNOSQL
まとめ
ACIDを担保してないNOSQL
↓
お金の管理や集計をさせない
まとめ
インフラをデザインする
¦¦
得意分野を組み合わせる
まとめ
適切な設計は適切な拡張を生む
まとめ
適切な設計は適切な拡張を生む
↓
Scale UpやScale Outを可能にする
まとめ
データの寿命はコードより長い
大事なことなので二回(ry
まとめ
オススメの書籍
まとめ
まとめ
まとめ
まとめ
もし現在のアプリケーションがRDBで
上手く動いているのであれば、
それをNOSQLに置換する理由は無いし、
それを勧めたりはしない
Nate McCall(@zznate)
ご静聴ありがとうございました。

More Related Content

実務で役立つデータベースの活用法