#はじめに
学生アルバイトのsosonoです。
プロジェクトでAmazon DynamoDBを使用する予定になり、今まで使用していたRDBMS(PostgreSQL)との違いが気になったのでまとめてみました。
#NoSQLとRDBMS
DBMS
データベース管理システム。DBを構築するために必要なDB運用、管理のためのシステム、またそのソフトウェアのこと。
-
RDBMS
リレーショナルデータベース管理システム。構造化クエリ言語(SQL)を使用する。有名どころはMySQLやPostgreSQL、SQLite。Rは関係という意味を持ち、データ=表の「関係モデル」が基礎。 -
NoSQL
Not only SQLの略であり、NoSQLデータベースシステムとなる。例としてAmazon DynamoDBなど。キーと値のペア、ドキュメントストレージといった、データ管理のための「新しいモデル」が基礎になっている。RDBMSの弱点を補うような立ち位置。
比較
-
ワークロード
- RDBMS
- アドホッククエリ、データウェアハウス、オンライン分析処理、etc
- DynamoDB
- SNS、ゲーム、IoT関連、メディア共有、etc
- 単純なデータ構造で、データ数が多いものに向いている
- RDBMS
-
データモデル
- RDBMS
- 実装やパフォーマンスをあまり気にせず柔軟に設計できる。が、テーブル、列、行といった明確な構造(スキーマ)が必要。
- DynamoDB
- スキーマレス。テーブル毎に、PrimaryKeyが必要になる。JSONドキュメントを含む構造化データまたは半構造化データを管理可能。
- RDBMS
-
データアクセス
- RDBMS
- SQLを使用。テーブルを連結した複合的な検索も可能。柔軟に使えるが、比較的高コストで、トラフィック量によってはスケールがうまくいかない可能性もある。読み書きは遅い。
- DynamoDB
- SQLは使えない。AWSマネジメントコンソール、AWS CLIを使用してDB自体を操作。AWS SDKを活用すれば、PHP、JavaScript、Python、Ruby等からアクセスできるようになる。読み書きは速い。
- RDBMS
-
パフォーマンス
- RDBMS
- 開発者、データベース管理者が別だったりと、パフォーマンス向上のためにはクエリやDBの構造を最適化する必要がある。
- DynamoDB
- パフォーマンスはハードウェアなどに依存する。マネージド型であるため、実装の詳細から離れ、堅牢な設計を比較的簡単に行える。
- RDBMS
-
拡張性
- RDBMS
- データ構造はあらかじめ定義されており、高コスト。
- DynamoDB
- シンプルなデータ構造のため、自由に拡張できる。前提として、テーブルは少ない方が優れたものとされる、というのがある。
- RDBMS
実際のコードで比較
- RDBMS
- 作成時に,テーブルの列、データ型全て、プライマリーキー等を定義する必要があった(ALTER TABLE使えば変更はできる)
- 自分的には見慣れた記述方法です。
CREATE TABLE Music (
Artist VARCHAR(20) NOT NULL,
SongTitle VARCHAR(30) NOT NULL,
AlbumTitle VARCHAR(25),
Price FLOAT,
Tags TEXT,
PRIMARY KEY (Artist, SongTitle)
);
- DynamoDB
- RDBMSとは全く違う感じの記述です。基本的にはキーと値から成っています。
- KeySchema(属性)はプライマリーキーに使用、AttributeDefinitionsはKeySchema属性のデータ型と言ったように、基本的な考え方はRDBMSのそれと変わりません。
{
TableName : "Music",
KeySchema: [
{
AttributeName: "Artist",
KeyType: "HASH",
},
{
AttributeName: "SongTitle",
KeyType: "RANGE"
}
],
AttributeDefinitions: [
{
AttributeName: "Artist",
AttributeType: "S"
},
{
AttributeName: "SongTitle",
AttributeType: "S"
}
],
}
※RDBMSのコードと特に互換性はありません。
#展望
- シンプルで初歩的なコードの紹介でしたが、大きな違いがありました。一例として、PHPでDBにアクセスする時でもRDBMSとNoSQLでは記述量などに大きな変化があります。また整理がついたらまとめていきます!!
[参考:AWS公式サイト]https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.CreateTable.html