目次
NoSQL
NoSQLとは
- 従来のリレーショナルデータベース(RDBMS)とは異なる、非リレーショナルなデータベース管理システム
- 一般には、Not only SQLの略称とされている
NoSQLの特徴
RDBとの違い
| RDB | NoSQL | |
|---|---|---|
| データモデル | テーブル(行と列) | 多様(後述) |
| スキーマ | 事前定義が必須(厳密) | スキーマレス or 柔軟 |
| スケーリング | 垂直スケーリングが中心 | 水平スケーリングに強い |
| トランザクション | ACID準拠 | 一部モデルでは非対応(結果整合性) |
| クエリ | SQL(複雑な結合・集計が得意) | 各モデル固有の方式(結合は苦手) |
補足:垂直スケーリングと水平スケーリング
垂直スケーリング
- 対応方法の例:サーバのスペックアップ
- スペックの上限があるため、スケールに限界がある
- 設計難易度は低い
水平スケーリング
- 対応方法の例:サーバの台数増加
- 理論上スケールの上限がない(ただし無限には増やせない)
- 設計難易度は高いが、対応自体は設計次第で容易
NoSQLのメリット
- 拡張性
- 水平スケーリングに適しており、負荷の増減に対して柔軟
- 高速
- データ量が増えてもキーアクセスの速度が劣化しにくい
- Bツリー(RDB):ツリーをたどって探索→ 計算コストは
- KVS(NoSQLの一種):ハッシュ関数でキーから直接格納先を計算 → で完結
- データ量が増えてもキーアクセスの速度が劣化しにくい
- 柔軟性
- テーブルの構造を厳密に指定せず、そのままの形で拡張可能
- 分散処理
- 複数のノード(サーバ)に処理を分散することが可能
- 可用性
- 複数ノード運用に適しているためマルチゾーンの構成が用意、高い耐障害性
NoSQLのデメリット
- 複雑な検索が苦手
- KVSやドキュメント指向型では集計クエリ(JOIN)、ソートが使えない
- データの一貫性を確保できないモデルもある
- 一部のモデルでは、トランザクションが使えない
- 同時並行で処理が実行された場合、整合性が取れなくなる可能性(結果整合性)
- 設計の難易度が高い
- スキーマレスのため、命名や項目定義を決めないとカオス化しやすい
- 命名規則なしにデータを入れるとデータの管理や検索が大変
- 厳密なスキーマ定義などが決められていないので、システムに合わせた対策(ドメイン知識)が必要
NoSQLの種類と具体例
キーバリュー(KVS)
- データと一緒にキーを保存する形式
- Pythonの辞書型が近い
- IoTセンサのデータ記録、株価・為替データの管理などに適している
- キーバリュー型の枠組みの中に、時系列型
- キー(時間)
- バリュー(データ)
ドキュメント指向型
- ドキュメントでデータを管理するNoSQL
- XMLやJSONなどの形でデータを保存可能
- 後述のMongoDBにはレプリケーション機能があるので、耐障害性が高い
- SQLが書けなかったり、トランザクションが制限される
(MongoDB 4.0以降はマルチドキュメントトランザクションに対応しているが、RDBほど強力ではない)などのデメリットもある
ワイドカラム型(Wide-column)
- リレーション型が「行」ごとでデータを管理するのに対し、カラム指向型では「列」単位でデータを管理する
- 1つのキーに対して複数のカラムを作る
- RDSと違い、データが無かったりしても良いし、カラムごとの型指定もない
- 圧縮や分散処理に向いている
グラフ
- データをグラフ(ノード、エッジ、プロパティの3要素で構成される)で管理
- 目的のデータを検索するのは得意だが、全体から絞り込みをするなどの検索方法は苦手
階層型
- 親ノードと子ノードを使ってツリーでデータを管理
- ルートがグラフ型より限定されるため検索は非常に高速な一方で、柔軟性や拡張性に欠ける
一部メインフレームで使われているため、めったに使われることはない
具体的なNoSQLの例
キーバリュー型
- redis
- memcahed
ドキュメント型
- mongoDB
ワイドカラム型
- Apache Cassandra
グラフ型
- neo4j
などなど……
Amazon DynamoDB
さまざまなNoSQLの中で、今回はDynamoDBについて説明する。
Amazon DynamoDBについて
- KVSおよびドキュメント型をサポートするNoSQL
- シンプルなキーでの読み書きはKVS
- ネストしたJSON属性を持つデータの格納・検索はドキュメント型
- スケーリングが容易なため、小規模~大規模まであらゆる規模のアプリケーションに対応可能
👌
概要を引用:
Amazon DynamoDB は、key-value およびドキュメントデータモデルをサポートする NoSQL データベースです。開発者は、DynamoDB を使用して小規模から開始してグローバルまで拡張できる最新のサーバーレスアプリケーションを構築して数ペタバイトのデータや 1 秒あたり数千万の読み込みおよび書き込みリクエストをサポートすることができます。DynamoDB は、従来のリレーショナルデータベースであれば高い負荷を生じさせていた高パフォーマンスのインターネット規模のアプリケーションを実行するように設計されています。
引用元: https://www.sunnycloud.jp/column/20210228-01/
Amazon DynamoDB は、key-value およびドキュメントデータモデルをサポートする NoSQL データベースです。開発者は、DynamoDB を使用して小規模から開始してグローバルまで拡張できる最新のサーバーレスアプリケーションを構築して数ペタバイトのデータや 1 秒あたり数千万の読み込みおよび書き込みリクエストをサポートすることができます。DynamoDB は、従来のリレーショナルデータベースであれば高い負荷を生じさせていた高パフォーマンスのインターネット規模のアプリケーションを実行するように設計されています。
引用元: https://www.sunnycloud.jp/column/20210228-01/
用語の解説
AWSのチュートリアルで使われているサンプル(PeopleテーブルとMusicテーブル)を利用しながら用語を整理
DynamoDBテーブル構成
- テーブル
- パーティションの集合
- 項目(パーティション)
- データ(キー+バリュー)の集合
-
{...}のブロック
-
- プライマリキーが設定される
- データ(キー+バリュー)の集合
- 属性
- キー+バリューの1つの組み合わせ
- データの最小単位
キーについて
- プライマリキー
- パーティションを一意に識別するためのキー
- プライマリキーには2パターン
- パーティションキーのみ
- 1つの属性だけで構成
- パーティションキーがテーブル内で組み合わせは
一意でなければならない
- パーティションキー + ソートキー(複合プライマリキー)
- 2つの属性で構成(2つより多くは指定できない)
- パーティションキーは重複OKだが、組み合わせは
一意でなければならない - ソートキーは同じパーティション内の並べ替え・範囲検索に使う
- Artist:パーティションキー
- SongTitle:ソートキー
- パーティションキーのみ
❓
複合プライマリキーの制約上、データが入れられない場合はどのようなケース?
ヒント
- 複合プライマリキーは、2つの属性で構成(今回は、Artist+SongTitle)
- パーティションキーは重複OKだが、組み合わせは一意でなければならない
答え
同じアーティストが同じタイトルで楽曲を出した場合(組み合わせが一意でない)
- セカンダリインデックス
テーブルからのデータの読み込み
DynamoDBでは以下のオペレーションをサポート
- GetItem
- プライマリーキーを使用して、単一項目を取り出す
- データに直接アクセスするため、最も効率的にデータにアクセスできる
- Query
- 特定のパーティションキーがあるすべての項目を取り出す
- Scan
- 指定されたテーブルで、すべての項目を取り出す
- 大量のリソースを消費するので、使用は必要最低限に留めること
※ソートキーだけで検索することはできないので、検索したい場合はインデックスを作成する
