【DB2026 #7】NoSQLについて

目次

NoSQL

NoSQLとは

  • 従来のリレーショナルデータベース(RDBMS)とは異なる、非リレーショナルなデータベース管理システム
  • 一般には、Not only SQLの略称とされている

NoSQLの特徴

RDBとの違い

RDB NoSQL
データモデル テーブル(行と列) 多様(後述)
スキーマ 事前定義が必須(厳密) スキーマレス or 柔軟
スケーリング 垂直スケーリングが中心 水平スケーリングに強い
トランザクション ACID準拠 一部モデルでは非対応(結果整合性)
クエリ SQL(複雑な結合・集計が得意) 各モデル固有の方式(結合は苦手)
補足:垂直スケーリングと水平スケーリング

垂直スケーリング

  • 対応方法の例:サーバのスペックアップ
  • スペックの上限があるため、スケールに限界がある
  • 設計難易度は低い
Image in a image block

水平スケーリング

  • 対応方法の例:サーバの台数増加
  • 理論上スケールの上限がない(ただし無限には増やせない)
  • 設計難易度は高いが、対応自体は設計次第で容易
Image in a image block

NoSQLのメリット


  • 拡張性
    • 水平スケーリングに適しており、負荷の増減に対して柔軟
  • 高速
    • データ量が増えてもキーアクセスの速度が劣化しにくい
      • Bツリー(RDB):ツリーをたどって探索→ 計算コストは O(logn)O( \log n)
      • KVS(NoSQLの一種):ハッシュ関数でキーから直接格納先を計算 → O(1)O(1)で完結
  • 柔軟性
    • テーブルの構造を厳密に指定せず、そのままの形で拡張可能
  • 分散処理
    • 複数のノード(サーバ)に処理を分散することが可能
  • 可用性
    • 複数ノード運用に適しているためマルチゾーンの構成が用意、高い耐障害性

NoSQLのデメリット


  • 複雑な検索が苦手
    • KVSやドキュメント指向型では集計クエリ(JOIN)、ソートが使えない
  • データの一貫性を確保できないモデルもある
    • 一部のモデルでは、トランザクションが使えない
    • 同時並行で処理が実行された場合、整合性が取れなくなる可能性(結果整合性)
  • 設計の難易度が高い
    • スキーマレスのため、命名や項目定義を決めないとカオス化しやすい
    • 命名規則なしにデータを入れるとデータの管理や検索が大変
    • 厳密なスキーマ定義などが決められていないので、システムに合わせた対策(ドメイン知識)が必要

NoSQLの種類と具体例

キーバリュー(KVS)


  • データと一緒にキーを保存する形式
    • Pythonの辞書型が近い
  • IoTセンサのデータ記録、株価・為替データの管理などに適している
  • キーバリュー型の枠組みの中に、時系列型
    • キー(時間)
    • バリュー(データ)

ドキュメント指向型


  • ドキュメントでデータを管理するNoSQL
  • XMLJSONなどの形でデータを保存可能
  • 後述のMongoDBにはレプリケーション機能があるので、耐障害性が高い
  • SQLが書けなかったりトランザクションが制限される
    (MongoDB 4.0以降はマルチドキュメントトランザクションに対応しているが、RDBほど強力ではない)などのデメリットもある

ワイドカラム型(Wide-column)


  • リレーション型が「行」ごとでデータを管理するのに対し、カラム指向型では「列」単位でデータを管理する
    • 1つのキーに対して複数のカラムを作る
  • RDSと違い、データが無かったりしても良いし、カラムごとの型指定もない
  • 圧縮や分散処理に向いている

グラフ


  • データをグラフ(ノード、エッジ、プロパティの3要素で構成される)で管理
  • 目的のデータを検索するのは得意だが、全体から絞り込みをするなどの検索方法は苦手

階層型


  • 親ノードと子ノードを使ってツリーでデータを管理
  • ルートがグラフ型より限定されるため検索は非常に高速な一方で、柔軟性や拡張性に欠ける

一部メインフレームで使われているため、めったに使われることはない

具体的なNoSQLの例


キーバリュー型
  • redis
  • memcahed
ドキュメント型
  • mongoDB
ワイドカラム型
  • Apache Cassandra
グラフ型
  • neo4j

などなど……

Amazon DynamoDB

さまざまなNoSQLの中で、今回はDynamoDBについて説明する。

Amazon DynamoDBについて

Image in a image block
  • KVSおよびドキュメント型をサポートするNoSQL
    • シンプルなキーでの読み書きはKVS
    • ネストしたJSON属性を持つデータの格納・検索はドキュメント型
  • スケーリングが容易なため、小規模~大規模まであらゆる規模のアプリケーションに対応可能
👌
概要を引用:
Amazon DynamoDB は、key-value およびドキュメントデータモデルをサポートする NoSQL データベースです。開発者は、DynamoDB を使用して小規模から開始してグローバルまで拡張できる最新のサーバーレスアプリケーションを構築して数ペタバイトのデータや 1 秒あたり数千万の読み込みおよび書き込みリクエストをサポートすることができます。DynamoDB は、従来のリレーショナルデータベースであれば高い負荷を生じさせていた高パフォーマンスのインターネット規模のアプリケーションを実行するように設計されています。
引用元: https://www.sunnycloud.jp/column/20210228-01/

用語の解説

AWSのチュートリアルで使われているサンプル(PeopleテーブルとMusicテーブル)を利用しながら用語を整理

DynamoDBテーブル構成
  • テーブル
    • パーティションの集合
  • 項目(パーティション)
    • データ(キー+バリュー)の集合
      • {...} のブロック
    • プライマリキーが設定される
  • 属性
    • キー+バリューの1つの組み合わせ
    • データの最小単位
Image in a image block
キーについて
  • プライマリキー
    • パーティションを一意に識別するためのキー
  • プライマリキーには2パターン
    • パーティションキーのみ
      • 1つの属性だけで構成
      • パーティションキーがテーブル内で組み合わせは
        一意でなければならない
    • パーティションキー + ソートキー(複合プライマリキー)
      • 2つの属性で構成(2つより多くは指定できない)
      • パーティションキーは重複OKだが、組み合わせは
        一意でなければならない
      • ソートキーは同じパーティション内の並べ替え・範囲検索に使う
        • Artist:パーティションキー
        • SongTitle:ソートキー

Image in a image block
複合プライマリキーの制約上、データが入れられない場合はどのようなケース?
ヒント
  • 複合プライマリキーは、2つの属性で構成(今回は、Artist+SongTitle)
  • パーティションキーは重複OKだが、組み合わせは一意でなければならない
答え

同じアーティストが同じタイトルで楽曲を出した場合(組み合わせが一意でない

  • セカンダリインデックス
    • パーティションキーやソートキーに加え、代替キーを用いて検索できる機能
    • DynamoDBでは以下の2種類をサポート
      • グローバルセカンダリインデックス
        • 今あるテーブルから、パーティションキーとソートキーを新たに作成してインデックスを作成
        • 1つのテーブルに付き、20個まで作成可能(参考
      • ローカルセカンダリインデックス
        • ソートキーのみ新たに設定したインデックス
        • テーブル作成時のみ作成可能
        • 1テーブルあたり5個まで(参考

テーブルからのデータの読み込み

DynamoDBでは以下のオペレーションをサポート

  • GetItem
    • プライマリーキーを使用して、単一項目を取り出す
    • データに直接アクセスするため、最も効率的にデータにアクセスできる
  • Query
    • 特定のパーティションキーがあるすべての項目を取り出す
  • Scan
    • 指定されたテーブルで、すべての項目を取り出す
    • 大量のリソースを消費するので、使用は必要最低限に留めること

※ソートキーだけで検索することはできないので、検索したい場合はインデックスを作成する


参考