1
NoSQL
概要
• 近年注目を浴びているNoSQLを学習します。
• NoSQLの一つであるMongoDBを学習します。
2
目次
• NoSQLとは
• NoSQLの種類
• それぞれのDBの特徴
• MongoDB
• まとめ
3
NoSQLとは
4
NoSQLとは
• NoSQLとは
• 近年、DBの世界でNoSQLという言葉がよく登場するようになりました。
• NoSQLは、RDB以外のDBMSを指す場合に使用されていますが、実は明
確な定義はありません。
• いわゆる「バズワード」と呼ばれるやつです。
5
NoSQLとは
• NoSQLは大きく分けて3つの種類がある。
• KVS(キーバリューストア)
• ドキュメントDB
• グラフDB
6
NoSQLの分類
• KVS(キーバリューストア)
• キーとバリュー(値)がセットになっているデータを格納するNoSQL
のDBです。
• ドキュメントDB
• JSON形式のデータを格納するNoSQLのDBです。
• グラフDB
• 関連性を表すデータを格納するNoSQLのDBです。
※これ以外にもRDB以外のDBは存在しますが、NoSQLに分類されるのは
上記の3つだそうです。
7
DBの4つのエリア
• DBの4つのエリア
8
KVS
DocumentDB
RDB(OLTP)
グラフDB
Hadoop
RDB(DWH)
スケールアウトできる
スケールアウトできない
集計・分析向きオペレーション
向き
「RDB技術者のためのNoSQLガイド」より
KVS(キーバリューストア)
• KVS(キーバリューストア)
• KVSは、キーとバリュー(値)がセットになっているデータを格納す
るNoSQLのDBです。
• JavaでいうところのMap、PHPでいうところの連想配列のようなもの。
またはシステムの設定ファイルのようなイメージです。
• 一つのキーに対して複数の値(カラム)をセットする、ワイドカラム
と呼ばれるデータも扱うことができます。
9
ドキュメントDB
• ドキュメントDB
• JSON形式のデータを格納するNoSQLのDBです。
• シンプルなデータしか扱わない場合は、KVSでも十分でしたが、デー
タ形式としてJSONが多く使われるようになった背景から、ドキュメン
トDBが誕生しました。
• JSON
• JSONとは、JavaScript Object Notation の略で、軽量でテキストベースの
データ交換方式です。
• 変数名と値を「:」で区切り、「,」でデータを連結できます。
• JSONの例
{ ID: 1234, NAME: "kishimoto" }
10
JSON
• JSON
• JSONでは、入れ子構造(階層構造)を表現することができます。
• また、配列なども扱うことができます。
• JSONの例
{
id : 1234 ,
name : "kishimoto" ,
address : {
city : "Okinawa",
zipno : "901-0001"
}
tel : ["090-1234-5678", "080-1234-5678"]
}
11
グラフDB
• グラフDB
• 「グラフ」というのは、物事の関連性を表す表現方法です。
• 点(ノード)と、それらを結ぶ線(リレーション)で表現します。
• RDBでは結合が多くなると処理速度が低下しますが、グラフDBでは
データのつながりからデータをたどっていく複雑なクエリが高速で実
行できます。
• グラフの例
• SNSの人物間の関連
• 拠点間を結ぶ関連
12
KVS/ドキュメントDB
13
KVS
• KVS
• キーとバリューがセットになっているDB
• KVSの中でも、「キーバリュー」と「ワイドカラム」の2種類がありま
す。
• KVSの製品
• Redis
• Cassandra
• Oracle NoSQL Database
• Amazon DynamoDB
14
KVS
• Redis
• KVSに属するDB製品の一つです。
• 格納できる値には、「String」「List」「Set」「Hash」「Sorted Set」な
どがあります。
• データの蓄積は基本的にメモリ上で行われるため、非常に高速です。
⇒ディスクへの書き出しやRDBによる永続化は可能。
• 条件検索や、order by、distinctなどの機能はありません。
15
KVS
• Redisの使いどころ
• 前ページの特徴から分かるように、RedisはRDBの代わりにはなりませ
ん。
• 大量かつ高速な処理が必要となる場合にシステムの一部に部分的に使
用されるケースが多いです。
• 例えば、Webアプリケーションのキャッシュとして利用したりします。
16
ドキュメントDB
• ドキュメントDB
• KVSのバリューの値にJSONがセットされるDB
• ドキュメントDBの製品
• MongoDB
• Counchbase
• Microsoft Azure DocumentDB
17
KVS/ドキュメントDBの特徴
• スケールアウトして大量のデータを高速に扱える
• スケールアウト:サーバーの台数を増やして処理性能を上げること。
• スケールアップ:CPUやメモリのスペックを上げて処理性能を上げる
こと。
• RDBでは外部キー制約やトランザクションの制約があるため、スケー
ルアウトしても性能が上がりにくい。
(スケールアップによる性能向上は可能)
• 一方で、KVS/ドキュメントDBでは、スケールアップを可能にすること
で、大量のデータを高速に処理することができる。
18
KVS/ドキュメントDBの特徴
• スケールアウトできる仕組み
• シャーディング(水平処理)によりスケールアウトを実現
• データ同士の関連やトランザクションがないため、クエリを独立させ
て処理を分散させることができる。
• レプリケーションで読み込みと書き込みの処理を独立させることがで
きる。
19
KVS/ドキュメントDBの特徴
• スキーマレス
• 事前にデータ構造を定義する必要がない。
• RDBだとレコードを挿入するためには事前にテーブル定義が必要。
• ドキュメントDBは事前の定義が必要ない。その分データ構造の変化に
柔軟に対応することが可能。
20
グラフDB
21
グラフDB
• グラフDB
• 関連性を表すデータを格納するDBです。
• 例えば、SNSの人間関係などを表すことができます。
• グラフDBはRDB以上にデータ同士の関連性が強いため、そのためス
ケーラビリティ(サーバーを増やして性能を拡張できるか)はRDBよ
りも低い。
• グラフDBの製品
• neo4j
22
グラフDB
• neo4j
• ブラウザから見た画面
23
MongoDB
24
MongoDB
• MongoDBとは
• オープンソースのドキュメントDBです。(商用版もある)
• 現在日本で最も普及しているNoSQLです。
25
MongoDB
• MongoDBへのアクセス
• VM環境にMongoDBはインストール済みです。
• Tera Term またはターミナルからVMへ接続してください。
26
MongoDB
• MongoDBの用語
• Document
• データ(ここではJSON)のこと。
• Collection
• ドキュメントを格納するもの。
• RDBでいうところのテーブルに該当するもの。
• Database
• 複数のコレクションを格納するもの。
• PostgreSQLのデータベースの概念と同じ。
• MongoDBの中には複数のデータベースが作成可能。
27
MongoDB
• 実習
• まずはMongoDBへのアクセスしてみます。
• アクセスできたら、次はデータベースの一覧を確認します。
既に作成されているデータベースの一覧が表示されます。
28
$ mongo
> show dbs;
MongoDB
• 実習
• では「axizdb」にアクセスしてみましょう。
これで使用するデータベースを指定できませした。
• 続いてはコレクションの一覧を確認します。
「users」というコレクションが存在することが確認できます。
29
> use axizdb
> show collections;
MongoDB
• 実習
• 続いて「users」にあるドキュメントを参照してみましょう。
「users」に格納されているドキュメント(JSON)が確認できるかと思
います。
• 続いではドキュメントの件数を確認してみます。
ドキュメントの件数が表示されます。
30
> db.users.find();
> db.users.count();
MongoDB
• 実習
• 続いては検索条件を絞り込んでみます。
nameの値が「satou」のドキュメントを取得するには以下のようにしま
す。
引数で絞り込み条件をJSON形式で渡すことで取得するデータを絞り込
むことができます。
• 続いては、取得する項目を選択してみます。
nameとbirthだけ取得したい場合は以下のようにします。
31
> db.users.find({name:"satou"});
> db.users.find({name:"satou"},{_id: 0, name: 1, birth: 1});
MongoDBコマンド一覧
32
MongoDB
• コマンド一覧
• バージョン確認
• MongoDBへのアクセス
• 終了
• 使用できるコマンドの確認
33
$ mongo --version
$ mongo
> exit
> help
MongoDB
• コマンド一覧(データベース操作)
• データベースの一覧の確認
• データベースの作成 or 切り替え
• DBの状態の確認
• データベースの削除
34
> show dbs;
> use データベース名;
> db.stats();
> db.dropDatabase();
MongoDB
• コマンド一覧(コレクション操作)
• コレクションの作成
• コレクションの一覧確認
• コレクションの名前の変更
• コレクションの削除
35
> db.createCollection("コレクション名");
> show collections;
> db.コレクション名.renameCollection("新コレクション名");
> db.コレクション名.drop();
MongoDB
• コマンド一覧(ドキュメント操作)
• データの挿入
• データ件数の確認
• データの全件検索
• データの全件削除
36
> db.コレクション名.insert({データ});
> db.コレクション名.count();
> db.コレクション名.find ();
> db.コレクション名.remove ({});
MongoDB
• コマンド一覧(データの検索)
• データの検索
• 抽出条件の書き方
• 等値検索:{フィールド名 : 値}
• 比較演算子の使用:{フィールド名 : {比較演算子 : 値}}
• 比較演算子
• $gte:以上
• $gt:大なり
• $lte:以下
• $lt:小なり
• $eq:等しい
• $ne:等しくない
37
> db.コレクション名.find({抽出条件}, {抽出フィールド});
MongoDB
• 抽出条件の書き方(データの検索続き)
• 正規表現:{フィールド名 : jsの正規表現}
• 複数の条件指定(AND):カンマ区切りで条件を指定
• {条件1, 条件2, …}
• 複数の条件指定(OR):$orを使用し、[]の中に条件を記述
• {$or : [条件1, 条件2, …]}
• 一つのフィールドに複数の条件指定(in)
• {フィールド名 : {$in : [値1, 値2, …]}}
38
MongoDB
• コマンド一覧(データの検索)
• データの検索
• 抽出フィールドの描き方
• フィールド名: [0|1]
• 0:非表示、1:表示
• {name: 1} とすると、nameのみが
• {id: 0} とすると、id以外が表示される
• 0と1は基本的に混在させることはできないが、idは0で他の項目を1に
することができる。
{ _id: 0, name: 1}
39
> db.コレクション名.find({抽出条件}, {抽出フィールド});
MongoDB
• コマンド一覧(検索・その他)
• 抽出件数の絞り込み
• 並び替え(昇順)
• 並び替え(降順)
• 読み飛ばし
40
> db.コレクション名.find().limit(取得件数);
> db.コレクション名.find().sort({フィールド: 1});
> db.コレクション名.find().sort({フィールド: -1});
> db.コレクション名.find().skip(読み飛ばし件数);
MongoDB
• コマンド一覧(更新)
• 1件のドキュメントを更新(条件に合致した最初の1件が更新される)
• 複数のドキュメントの更新
• ドキュメントがあれば更新、なければ挿入
• ドキュメントの削除
41
> db.コレクション名.update({抽出条件}, {更新内容});
> db.コレクション名.update({抽出条件}, {更新内容}, {multi: true});
> db.コレクション名.update({抽出条件}, {更新内容}, {upsert: true});
> db.コレクション名.remove({抽出条件});
MongoDB
• 更新内容の書き方
• {$set: {フィールド名: 更新値, …}}
• 存在しないフィールドの場合、そのまま追加される。
42
MongoDB
• インデックス
• MongoDBではコレクションに対してインデックスの作成が可能です。
• インデックスを作成することによるメリット・デメリットは基本的に
RDBと同じです。
43
MongoDB
• コマンド一覧(インデックス)
• インデックスの確認
• インデックスの作成(1:昇順, -1:降順)
• インデックスの削除
44
> db.コレクション名.getIndexes();
> db.コレクション名.createIndex({フィールド名: [1|-1]});
> db.コレクション名.dropIndex("インデックス名");
MongoDB
• MongoDBにできないこと
• トランザクションの制御
• ドキュメント同士の結合
• ストアドプロシージャ、トリガー、ビューなどの機能
45
MongoDB
• まとめ
• MongoDBは現在NoSQLの中で最もメジャーなドキュメントDB
• JSON形式のデータを扱えるため、階層構造や配列のデータも簡単に格
納できる
• レプリケーションやシャーディングの機能により、スケールアウトが
簡単に実現できる
• RDBでいうところの結合の処理はできない。
• トランザクション制御も基本的にできない。
46
MongoDBの使いどころ
47
MongoDB
• ログ格納システム
• ログは様々な形式があるのでフォーマットを決めておくことが難しい
⇒RDBに不向き
⇒MongoDBならスキーマレスで対応可能
• システムの運用期間や規模が大きくなるほど量が増える
⇒RDBではスケールアウトしにくいので不向き
⇒MongoDBならスケールアウトできる
• トランザクション制御、結合の処理が必要ない
⇒MongoDBに向いている
48
MongoDB
• 商品のカタログ管理
• ECサイトでは、商品のカテゴリによって登録したい属性が異なること
があります。(家電、本、ファッションアイテムではそれぞれ表示し
たい情報が異なります。)
⇒RDBだと対応が難しい。
・1つのテーブルで対応すると、余分なカラムが増える。
・テーブルを分けて扱うと、プログラムが複雑になる。
• MongoDBだとスキーマレスで対応が容易。
※購入などのトランザクションが必要な処理はRDBで行う必要がある。
データ構造の都合で対応が難しい部分のみをMongoDBで対処する。
49
まとめ
50
まとめ
• NoSQLにはKVS、ドキュメントDB、グラフDBがある。
• データの特性やデータ量、また、データの整合性をどこまで許
容できるかによってはKVS、ドキュメントDBの使用を検討する
のもあり。
51
まとめ
• とはいえRDBがまだまだスタンダード
• RDB(とSQL)の知識はシステム開発に必須です。NoSQLの前に
RDBの知識をしっかり学習しましょう。
• RDBの知識を抑えたうえで、システムの中でRDBでは対応でき
ない複雑なデータや大量のデータを扱う場合、NoSQLを検討し
ましょう。
52
参考文献
• 参考文献
• RDB技術者のためのNoSQLガイド
53
参考文献
• 参考文献
• ドットインストール(https://dotinstall.com/)
• MongoDB入門
• SlideShare
• MongoDB基本の基本
• https://www.slideshare.net/naruoga/mongodb-37598058?qid=01339086-1d29-4620-
920c-e942a2f4cc79&v=&b=&from_search=5
• MongoDB事例紹介
• https://www.slideshare.net/tetsutarowatanabe/mongodb-32964238?qid=9c9c40f6-
c717-4b83-9983-bae2779e14cc&v=&b=&from_search=13
54

2019年度 若手技術者向け講座 NoSQL