📕

図解で学ぶシステム設計 〜SQL vs NoSQL編〜

2024/12/08に公開

はじめに

データベースは、システムの中核を担う重要な要素の1つです。近年、データの性質や処理要件が多様化することにより従来のSQLでは対応できないケースも出てきました。以前、地理空間データを扱うプロジェクトで技術選定と実装を行った際、「SQL系」と「NoSQL系」のどちらのデータベースを使うべきか非常に悩んだ経験があります。

この記事では、同じように悩んでいる方に向けて、「SQL系」と「NoSQL系」データベースの特性や活用例について詳しく解説していきます。

SQL

構造化照会言語 (SQL) は、リレーショナルデータベースに情報を格納および処理するためのプログラミング言語です。リレーショナルデータベースは、情報を表形式で格納します。行と列は、さまざまなデータ属性と、データ値間のさまざまな関係を表します。
引用:
SQL (構造化クエリ言語) とは何ですか?|Amazon Web Services, Inc

SQLは構造があるデータベースとセットで使われてきたプログラミング言語です。この場合のデータベースとは行と列によるテーブル構造をもつ『リレーショナルデータベース(RDBMS)』を指しています。構造や制約があるため、複雑な問い合わせや結合が可能になります。

以下はUsersテーブルとOrdersテーブルの例です。

// Users table(ユーザー情報を保存)
+--------+----------+--------------------+--------------------+---------------------+---------------------+
| ID     | Username | Email              | PasswordHash       | CreatedAt           | UpdatedAt           |
+--------+----------+--------------------+--------------------+---------------------+---------------------+
| 1      | Bob      | bob@example.com    | hashed_password_123| 2024-12-07 12:00:00 | 2024-12-07 12:00:00 |
| 2      | Alice    | alice@example.com  | hashed_password_456| 2024-12-07 12:05:00 | 2024-12-07 12:05:00 |
+--------+----------+--------------------+--------------------+---------------------+---------------------+

// Orders table (注文情報を保存)
+---------+--------+-------------+----------+---------+---------------------+
| ID      | UserID | ProductName | Quantity | Price   | OrderDate           |
+---------+--------+-------------+----------+---------+---------------------+
| 1       | 1      | Laptop      | 1        | 999.99  | 2024-12-07 12:10:00 |
| 2       | 2      | Smartphone  | 2        | 699.99  | 2024-12-07 12:15:00 |
| 3       | 1      | Headphones  | 1        | 199.99  | 2024-12-07 12:20:00 |
+---------+--------+-------------+----------+---------+---------------------+

実際に手を動かして試したい人は、こちらのサービスをお勧めします。

サービス

RDBの例としては以下のサービスが挙げられます。

現在はMySQLのシェアが最も大きく、スタンダードなRDBとなっています。

  • クラウド型:
    • Amazon RDS(MySQL/PostgreSQL/Oracle/SQL Serverなど対応)
    • Google Cloud SQL
    • Azure SQL Database
  • オンプレミス/自前構築:
    • MySQL、PostgreSQL、MariaDB、Oracle Database、Microsoft SQL Server

Top 5 Relational Databases technologies in 2024

メリット

  • 強い制約条件やルール: データベース内のデータが一貫性を持つよう強制される。
    • 主キー制約(PRIMARY KEY)
    • 外部キー制約(FOREIGN KEY)
    • 一意制約(UNIQUE)
    • 非NULL制約(NOT NULL)
    • チェック制約(CHECK)
  • 強力なクエリ言語: 複雑なJOINや集計処理が容易
  • 長期的な標準化: SQLは長年標準化され、ドキュメントやノウハウが豊富で、技術者が多い

デメリット

  • スキーマ設計の柔軟性不足: データ構造の変更が難しく、開発初期段階で慎重な設計が必要
  • 拡張性の限界: 大量のデータ分散処理や超高トラフィック対応は、垂直スケーリング頼みになりがち
  • 特定領域以外ではやや重い: カジュアルなログ解析や急速なスキーマ変化が必要な場面には不向き

ユースケース

  • 金融・会計システム: 高い整合性が求められるためSQLが適合
  • 在庫管理、受発注管理など基幹系業務: データの正確性と再現性が重要
  • 分析レポート生成: 複雑なクエリで正確な集計が可能

SQLは構造化されたデータを扱うのに適しており、データの構造や制約を決めることによってデータの整合性を高いレベルで保証できます。これにより、例えば「在庫の減少と口座引き落とし」を1つのトランザクションとして処理することで、片方のみが実行されるといった不整合を防ぐことができます。このような高い整合性は、銀行システムや在庫管理システムのようなデータの一貫性が重要な場面に適しています。また、カテゴリーと商品を紐づけている場合、カテゴリーが削除されたら、商品データも一緒に削除することも可能になります。

一方で、構造が固定されているため、データベース構造の変更やスケールアウト(水平分散)には制約があります。そのため、柔軟な構造が求められる場面や大規模な分散データ管理が必要な場合には、NoSQLのような選択肢が適することもあります。

NoSQL

NoSQL とは、データを格納するためにテーブルを使用しない非リレーショナルデータベースをいいます。デベロッパーは、グラフ、ドキュメント、キー値など、さまざまなタイプの NoSQL データベースに情報を格納します。
引用:SQL (構造化クエリ言語) とは何ですか?|Amazon Web Services, Inc

つまり構造を持たないデータベースを扱います。行と列といったリレーショナルモデルに囚われない、多様なデータモデルとしてデータを管理します。また、多くの NoSQL データベースでは Javascript Object Notation (JSON) が使用されています。これは、データを名前と値のコレクションとしてデータを保存します。

以下はUsersテーブルとOrdersテーブルの例です。

// User情報
[
  {
    "_id": 1,
    "username": "Bob",
    "email": "bob@example.com",
    "passwordHash": "hashed_password_123",
    "createdAt": "2024-12-07T12:00:00Z",
    "updatedAt": "2024-12-07T12:00:00Z"
  },
  {
    "_id": 2,
    "username": "Alice",
    "email": "alice@example.com",
    "passwordHash": "hashed_password_456",
    "createdAt": "2024-12-07T12:05:00Z",
    "updatedAt": "2024-12-07T12:05:00Z"
  }
]

// 注文情報
[
  {
    "_id": 1,
    "userId": 1,
    "productName": "Laptop",
    "quantity": 1,
    "price": 999.99,
    "orderDate": "2024-12-07T12:10:00Z"
  },
  {
    "_id": 2,
    "userId": 2,
    "productName": "Smartphone",
    "quantity": 2,
    "price": 699.99,
    "orderDate": "2024-12-07T12:15:00Z"
  },
  {
    "_id": 3,
    "userId": 1,
    "productName": "Headphones",
    "quantity": 1,
    "price": 199.99,
    "orderDate": "2024-12-07T12:20:00Z"
  }
]

サービス

NoSQLの例としては以下のサービスが挙げられます。

現在はMongoDBのシェアが最も大きく、スタンダードなデータベースとなっています。

  • クラウド型:
    • Amazon DynamoDB(キー・バリュー/ドキュメント型)
    • Google Cloud Firestore(ドキュメント型)
    • Azure Cosmos DB(複数モデル対応)
  • マネージド/ホスト型:
    • MongoDB Atlas(ドキュメント型)
    • Redis Enterprise(キー・バリュー型)
  • 特化型:
    • Neo4j(グラフ型)
    • Cassandra(ワイドカラム型)
    • ElasticSearch(全文検索特化)

Top 5 NoSQL Databases technologies in 2024

メリット

  • スキーマレス: データ構造の変更が容易で、開発サイクルが短縮
  • 高いスケーラビリティ: 水平分割により、データ量・アクセス数増加に柔軟対応
  • 高速アクセス: 特定の操作に特化することで超高速読み書きが可能(例:キャッシュ用途のRedis)

デメリット

  • 一貫性モデルの緩さ: データ整合性やACID特性が弱く、最終的整合性に留まるケースが多い
  • 標準クエリ言語の欠如: SQLのような共通言語がなく、個々のDBごとに異なる操作メソッドが必要
  • 複雑な分析は苦手: 柔軟なスキーマを活かした高速処理が強みだが、複雑な結合や集計は不得手な場合が多い

ユースケース

  • Webスケーリング: 大規模SNSやECサイトで、トラフィック急増時も高速に対応
  • ログ・イベント解析: データ形式や量が常に変化するログデータを手軽に蓄積・分析
  • 柔軟なデータ統合: IoTデバイスやセンサー情報など、一定のフォーマットに縛られないデータ取り込み

NoSQLは、柔軟なデータ構造やスケールアウトに優れており、スキーマを固定せずに多様なデータ形式に対応できます。これにより、SNSやログデータのような大規模でリアルタイム性の高いシステムに適しています。また、データを埋め込み形式で保存することでパフォーマンスを向上できます。

一方、データの整合性管理はアプリケーション側で対応する必要があり、銀行や在庫管理などの一貫性が重要な場面には向きません。カテゴリー削除時の関連データ削除など、外部キーのような制約もアプリケーション側で実装する必要があります。

まとめ

以上のように、SQLとNoSQLはデータ特性・システム要件・スケーラビリティの必要性などに応じて使い分けられます。安定性・整合性が求められる金融・業務分野ではSQLが依然として中心的な役割を担い、柔軟性・拡張性が求められるWebサービスやビッグデータ解析領域ではNoSQLが選択肢となります。いずれも得意分野が異なるため、プロジェクト要件を踏まえて最適な技術スタックを選定することが求められます。

参考文献

https://aws.amazon.com/jp/what-is/sql/

https://aws.amazon.com/jp/nosql/

https://www.ibm.com/think/topics/sql-vs-nosql

https://www.mongodb.com/ja-jp/resources/products/capabilities/acid-compliance

https://6sense.com/tech/relational-databases

https://6sense.com/tech/nosql-databases

Discussion