はじめに
皆さんは、SQL / NoSQL / NewSQLの違いは正確に説明できるでしょうか?
正直、私はこの記事を書くためにしっかりと調べるまで理解が曖昧でした。
また、データベース設計をする時にも、なんとなく自分が実装したことのある得意な手法(SQLやNoSQL)で実装するという方も多いのではないでしょうか?
この記事では、それぞれのデータベース言語の概要を解説した後に、「どういう時にどの技術を採用したら良いか?」という羅針盤のような知識を示します。
データベース言語とは?
データベース言語は、プログラミング言語と正確には異なる概念になります。
具体的に、データベース言語とプログラミング言語の違いは、下記の通りです。
言語 | 意味 | 例 |
---|---|---|
データベース言語 | DBMSへ処理を命令する「非手続き型言語」 | SQL |
プログラミング言語 | プログラム本体を作成する「手続き型言語」 | Python, Java, C++ |
データベース言語における基本知識
データベース言語を理解する上で、次の4つの概念を理解しておく必要があるため、こちらを先に説明します。これらは全て非常に重要な概念です。
(1) ACID特性とは?
ACID特性とは、「トランザクションにおける4つの重要な特性」です。
Atomicity、Conistency、Isolation、Durabilityからなる略語で、それぞれ次のような意味を持ちます。
-
Atomicity / 原子性とは?
トランザクションの中の全て処理が実行されるか、全ての処理が実行されないかを保証する性質。 -
Consistency / 一貫性とは?
トランザクションの開始時と終了時における整合性を保証する性質。 -
Isolation / 独立性とは?
複数のトランザクションがお互いに独立して順番に実行されることを保証する性質。 -
Durability / 永続性とは?
トランザクションの完了通知(コミット)が発生した時点で、永続的な結果になることを保証する性質。
(2) CAP定理とは?
CAP定理とは、「分散システムにおいて、一貫性・可用性・分断耐性のうち2つしか提供できないことを示した定理」です。
ここで、分散システムとは、「複数のノード(物理マシンもしくは仮想マシン)に対して、データを同時に保管するネットワーク」を表し、現代のコンピューティング技術の柱となっています。
ちなみに、、CAP定理は「ブリュワーの定理(Brewer's Theorem)」とも呼ばれ、Eric A. Brewer教授が、2000年に提唱されました。
CAP定理は、Consistency、Availability、Partition-toleranceからなる略語で、それぞれ次のような意味を持ちます。
-
Consistency / 一貫性とは?
別々のノード上に接続したどのクライアントにおいても、データの一貫性がある性質。 -
Availability / 可用性とは?
1つ以上のノードがダウンしたとしても、システムとして正常に動作し続ける性質。 -
Partition-tolerance / 分断耐性とは?
ノード間の通信障害(接続が切れたり、遅延したりした状態)が起きたとしても、システムとして正常に動作し続ける性質。
(3) シャーディングとは?
シャーディング(データベースシャーディング、Sharding)とは「データベースの負荷分散手法の一つ」です。
一つの大きなデータセットを複数のノードに分割して記録することにより、高速に管理できます。データセットが大きすぎて、一つのデータベースへの格納が難しい時に、データシャーディングを行います。
また、シャーディングは「水平方向のパーティション分割の種類」を指し、シャードとは「データベースサーバーのインスタンスに存在する個々のパーティション自体」のことを指します。
(4) スケールアップとスケールアウト
サーバーの処理能力を上げるアプローチとして「スケールアップ」と「スケールアウト」の二つの方法があります。それぞれの概要 / メリット / デメリットは次の通りです。
項目 | スケールアップ | スケールアウト |
---|---|---|
概要 | サーバー自体の性能を向上させて、処理能力を上げるアプローチ。 | サーバーの並列化によって、処理能力を上げるアプローチ。 |
メリット | 導入の際に気にすることが少ない。 | 拡張性が高い。 |
デメリット | コンピュータのスペックに限界があるため、処理能力が頭打ちする可能性がある。 | サーバー間のデータの整合性を保つ必要がある。 |
ビッグデータやDXがどんどんと広がっているトレンドから見ると、スケールアップだけでシステムを構築することには将来的な限界があるでしょう。一方で、スケールアウトの場合、シャーディングなどの複雑な仕組みを内部に作る必要があります。
そのため、PoCや導入コストの制約がある場合は、スケールアップ・アプローチを取り、それ以外の場合(将来的に大規模になる見込みがある場合)はスケールアウト・アプローチを取ることをおすすめします。
SQLとは?
- 略称:
Structured Query Language
- 概要:RDBMSを操作・制御するためのデータベース言語。
- 特徴
- 対象データ:構造化データ(表データ)
- 長所
- 🙆♂️ ACIDなトランザクションが可能
- 🙆♂️ CAP定理の内「一貫性」と「可用性」に強い
- 短所
- 🙅♂️ スケーラビリティにおける限界
- 🙅♂️ スキーマ変更に対する柔軟性が低い
- 🙅♂️ 非構造化データ(画像データなど)を扱いづらい
- 分類:DML、DDL、TCL、DCLの4種類(詳しくは次の章を参照)
- スケール方法:スケールアップ
- 歴史
- 1970年:IBMのエドガー・F・コッドによって発表
- 1976年:SQLへ名称変更
- 1986年:国際標準化機構(ISO)で規格化
NoSQLとは?
- 略称:Not only SQL
- 概要:非リレーショナルなデータベースを管理するデータベース言語。
- 特徴
- 対象データ:非構造化データ
- 長所
- 🙆♂️ 高いスケーラビリティ
- 🙆♂️ CAP定理の内「分断耐性」と「可用性」に強い
- 🙆♂️ スキーマ変更に対する柔軟性が高い
- 🙆♂️ 高い分散性による高い処理速度(SQLと比較した時)
- 🙆♂️ 非構造化データ(画像データなど)も扱える
- 短所
- 🙅♂️ 型制約が弱い
- 🙅♂️ ACID特性に弱い(SQLほどの強さはない)
- 🙅♂️ 構造化データを扱うことが困難
- 分類
- (1) キーバリュー型(Key-Value):「データを識別するキー(鍵)」と「それに対応するバリュー(値)」で扱う形式。
- (2) カラム指向型(Wide-Column):列単位のデータで扱う形式。
- (3) ドキュメント指向型(Document):半構造化されたドキュメントデータ(XMLやJSONなど)を扱う形式。
- (4) グラフ型(Graph):ネットワーク情報などのデータ間のつながりをグラフ構造(ノード、エッジ、プロパティ)データを扱う形式。
- スケール方法:スケールアップ、スケールアウト
- 歴史
- 1998年:カルロ・ストロツィにより提唱
- 2006年:BigTableの発表
- 2007年:DynamoDBの発表
NewSQLとは?
- 略称:NewSQL(そのまま)
- 概要:分散性を持ったSQL-likeなデータベース言語
- 特徴
- 対象データ:構造化データ(表データ)
- 長所
- 🙆♂️ 高いスケーラビリティを持ちながら、ACIDなトランザクションが可能
- 🙆♂️ CAP定理の内「一貫性」と「分断耐性」に強く、「可用性」も(ある程度)強い
- 短所
- 🙅♂️ 非構造化データを扱うことが困難
- スケール方法:スケールアップ、スケールアウト
- 歴史
- 2011年:概念が登場
- 2012年:Spannerの論文が発表
- 2017年:Cloud Spannerのサービスがリリース
SQL / NoSQL / NewSQLのメリットとデメリットまとめ
モデル言語 | 一貫性(C) | 可用性(A) | 分断耐性(P) | ACIDトランザクション | スケーラビリティの高さ | コストの安さ |
---|---|---|---|---|---|---|
SQL | ◯ | ◯ | × | ◯ | × | ◯ |
NoSQL | × | ◯ | ◯ | × | ◯ | △ |
NewSQL | ◯ | △ | ◯ | ◯ | ◯ | × |
DBMSの種類
最後に、DBMSの種類をまとめました。
(※ Commercial: 商用、OSS:オープンソース)
(※ 一部OSSは、商用利用する際の制約あり)
モデル言語 | 名前 | 開発元 | ライセンス | 備考 |
---|---|---|---|---|
SQL | Oracle Database | Oracle | Commercial | - |
Db2 | IBM | Commercial | - | |
SQL Server | Microsoft | Commercial | - | |
Cloud SQL | Commercial | - | ||
MySQL | Oracle | OSS | - | |
PostgreSQL | PostgreSQL Global Development Group | OSS | - | |
H2 Database | Thomas Mueller | OSS | - | |
MariaDB | MariaDB Corporation Ab, MariaDB Foundation | OSS | - | |
SQLite | D. Richard Hipp | OSS | - | |
NoSQL | Cloud Firestore | Commercial | ドキュメント指向型 | |
Cloud BigTable | Commercial | カラム指向型 | ||
DynamoDB | Amazon | Commercial | キーバリュー型 | |
Redis | Salvatore Sanfilippo | OSS | キーバリュー型 | |
Cassandra | Apache Software Foundation | OSS | カラム指向型、キーバリュー型 | |
MongoDB | MongoDB | OSS | ドキュメント指向型 | |
Neo4j | Neo4j | OSS | グラフ型 | |
NewSQL | Cloud Spanner | Commercial | - | |
CockroachDB | CockroachLabs | OSS | - |
終わりに
いかがだったでしょうか?
データベースって正直複雑ですよね。
なるべくわかりやすく記事としてまとめたつもりなのですが、もしもよりわかりやすい(もしくはより正確な)表現があれば、ぜひコメントで教えていただけますと幸いです!
次の記事では、「概念モデル / 論理モデル / 物理モデル」について解説します。
参考文献
基本用語
https://databricks.com/jp/glossary/acid-transactions
https://www.ibm.com/jp-ja/cloud/learn/cap-theorem
https://azure.microsoft.com/ja-jp/overview/what-is-database-sharding/
SQL
https://hnavi.co.jp/knowledge/blog/sql/
NoSQL
https://aws.amazon.com/jp/nosql/
https://products.sint.co.jp/topsic/blog/nosql
https://rakusui.org/nosql/
NewSQL
https://qiita.com/tzkoba/items/5316c6eac66510233115
https://qiita.com/tzkoba/items/3e875e5a6ccd99af332f
https://gihyo.jp/admin/clip/01/linux_dt/201901/17
比較記事
https://www.ibm.com/cloud/blog/sql-vs-nosql
https://cloud.google.com/blog/ja/topics/developers-practitioners/your-google-cloud-database-options-explained