目次
NoSQLとは
AIに聞いてみた
NoSQLとは
NoSQLは、従来のリレーショナルデータベース(RDBMS)とは異なる、非リレーショナルなデータベース管理システムの総称です。
- RDBMS以外の DBMS (データベース管理システム: D ata B ase M anagement S ystem)を NoSQL と呼ぶ
-
RDBには
カラムの追加に対して柔軟性がない
- テーブル設計が必要
- 各カラム(列)の型が厳密に決まっている
- データ量に比例して処理時間も増加していく
- NoSQLを使用することで、膨大な量のデータを処理することができるようになる
NoSQLの特徴
AI君再度登場
NoSQLの特徴
NoSQLの主な特徴は以下のようなことが挙げられます
1. スキーマレス
- NoSQLデータベースは事前にデータ構造を定義する必要がなく、フレキシブルなデータモデルを採用しています。これにより、データ構造の変更が容易になります。
2. 水平スケーラビリティ
- NoSQLでは、データを複数のサーバーに分散して格納するため、データ量の増大に合わせてシステムを柔軟に拡張できます。
3. 高可用性
- NoSQLでは、データの複製や分散配置により、単一障害点が発生しにくく、高い可用性を実現できます。
4. 高スループット
- NoSQLは単純なデータモデルを採用しているため、大量のデータを高速に処理できます。
5. CAP定理への対応
- NoSQLでは、整合性よりも可用性とパーティション耐性を重視した設計が可能です。
6.柔軟なクエリ
- RDBMSのようなSQL言語による複雑なクエリは必要とせず、キーバリューペア、ドキュメント指向、列指向といったデータモデルに合わせたクエリ方式を採用しています。
NoSQLのメリット
-
拡張性
- 水平スケーリング(マシンの台数を増やすスケーリング方法)に適しているため、あとからサーバの台数を増やしやすい
- RBDMSは主に垂直スケーリング(マシンのスペックを上げるスケーリング方法)で対応する
-
高速性
- 大量のデータの処理を捌くのが得意
- RDBはデータ量が増えるほど、処理時間も増加していく
-
柔軟性
- テーブルの構造を厳密に指定せず、そのままの形で拡張可能
-
分散処理
- 複数のノード(サーバ)に処理を分散することができる
-
高可用性
- 複数ノード運用に適しているため、マルチゾーンの構成にしやすい
- そのため耐障害性が高い
垂直スケーリングと水平スケーリング
垂直スケーリング
水平スケーリング
垂直スケーリング | 水平スケーリング | |
---|---|---|
対応方法 | サーバのスペックアップ | サーバの台数増加 |
対応難易度 | 難しい | (設計次第で)容易 |
上限 | あり | なし(ただし無限には増やせない) |
設計難易度 | 低い | 高い |
NoSQLのデメリット
-
RDBで使える一部機能が使えない
- 後述のKVSやドキュメント指向型では集計クエリやソートが使えない
-
一部のモデルでは
トランザクション
が使えない
- 処理中にシステムがダウンすると、中途半端な状態になってしまう
- 同時並行で処理が実行された場合、整合性が取れなくなる可能性がある
-
命名規則などを決めないと闇鍋になる
- 何でも入るからと言って、命名規則なしにデータを入れるとデータの管理や検索が大変
-
トラブルシューティングに技術とシステムに対するドメイン知識が必要
- RDBの用に厳密なスキーマ定義などが決められているわけではないので、システムに合わせた対策が必要
- 要件定義(ユースケース)をはっきりさせてから設計しなくてはいけない
NoSQLの種類と具体例
ドキュメント指向型
- ドキュメントでデータを管理するNoSQL
- XML や JSON などの形でデータを保存することができる
- 後述の MongoDB にはレプリケーション機能があるので、耐障害性が高い
- ただし、 SQLが書けなかったり 、 トランザクションがない (データの一貫性が確保できない)などのデメリットもある
カラム指向型(ワイドカラム)
-
リレーション型が「行」ごとでデータを管理するのに対し、カラム指向型では
「列」単位
でデータを管理する
- 1つのキーに対して複数のカラムを作る
- RDSと違い、データが無かったりしても良いし、カラムごとの型指定もない
- 圧縮や分散処理に向いている
グラフ
- データを グラフ (ノード、エッジ、プロパティの3要素で構成される)で管理する
- 目的のデータを検索するのは得意だが、全体から絞り込みをするなどの検索方法は苦手
キーバリュー(KVS)
-
データと一緒にキーを保存する形式
- Pythonのdict型が近い
- IoTセンサーのデータ記録や株価・為替データの管理などに向いている
-
キーバリュー型の枠組みの中に、時系列型がある
- キー(時間)
- バリュー(データ)
階層型
- 親ノードと子ノードを使ってツリーでデータを管理する
- ルートがグラフ型より限定されるため検索は非常に高速だが、柔軟性や拡張性に欠ける
一部メインフレームで使われているため、めったに使われることはない(自分も見たことはない)
Amazon DynamoDB
Amazon DynamoDBとは
Amazon DynamoDB は、key-value およびドキュメントデータモデルをサポートする NoSQL データベースです。開発者は、DynamoDB を使用して小規模から開始してグローバルまで拡張できる最新のサーバーレスアプリケーションを構築して数ペタバイトのデータや 1 秒あたり数千万の読み込みおよび書き込みリクエストをサポートすることができます。DynamoDB は、従来のリレーショナルデータベースであれば高い負荷を生じさせていた高パフォーマンスのインターネット規模のアプリケーションを実行するように設計されています。
https://aws.amazon.com/jp/dynamodb/features/
- KVS およびドキュメント型をサポートするNoSQL
- スケーリングが容易なため、小規模~大規模まであらゆる規模のアプリケーションに対応する
以下はAWSのチュートリアルで使われているサンプル
用語
-
テーブル
- データの集まり
-
項目
- 1つのデータ(キー+バリューの集合)
- プライマリーキーが設定される
-
属性
- キー+バリューの1つの組み合わせ
- データの最小単位
-
プライマリーキー
-
パーティションキー
- 1つの属性で構成されるプライマリーキー
- テーブルの中で、必ず一意の値でなければいけない
-
パーティションキー
と
ソートキー
(
複合プライマリーキー
)
-
2つの属性で構成されたプライマリーキー
- 2つより多くは指定できない
-
1つ目の要素をパーティションキー、2つ目をソートキーと呼ぶ
- Atrist:パーティションキー
- SongTitle:ソートキー
- パーティションキーは重複しても良いが、パーティションキーとソートキーの組み合わせが必ず一意でなければ行けない
-
2つの属性で構成されたプライマリーキー
-
パーティションキー
答え
同じアーティストが同じタイトルで楽曲を出した場合
-
セカンダリインデックス
- パーティションキーやソートキーに加え、 代替キー を用いて検索できる機能
-
DynamoDBでは以下の2種類をサポート
-
グローバルセカンダリインデックス
- 今あるテーブルから、パーティションキーとソートキーを新たに作成してインデックスを作成する
- 1つのテーブルに付き、 20個まで 作成可能
-
ローカルセカンダリインデックス
- ソートキーのみ新たに設定したインデックス
- テーブル作成時のみ作成可能
- 1テーブルあたり 5個 まで
-
グローバルセカンダリインデックス
テーブルからのデータの読み込み
DynamoDBでは以下のオペレーションをサポートしている。
-
GetItem
- プライマリーキーを使用して、単一項目を取り出す
- データに直接アクセスするため、最も効率的にデータにアクセスできる
-
Query
- 特定のパーティションキーがあるすべての項目を取り出す
-
Scan
- 指定されたテーブルで、すべての項目を取り出す
- 大量のリソースを消費するので、使用は必要最低限に留めること
※ソートキーだけで検索することはできないので、検索したい場合はインデックスを作成する