データベースには様々な種類のものがあります。それぞれのDBの特徴について学習していきます。この記事では以下のデータベースタイプについて説明していきます。
- リレーショナルタイプ
- キー・バリュータイプ
- グラフタイプ
- 検索エンジンタイプ
- ドキュメントタイプ
リレーショナルタイプ
RDBMS(Relationa Database Management System)で、MariaDB, MySQL, PostgreSQLなどがあります。強力なクエリ言語であるSQLを使用してデータの問い合わせを行うことができます。
一番の特徴は何といっても長年の実績!
MariaDB/MySQLの特徴
使用用途 : 小規模から大規模システムまで汎用的に使える。大量データではクエリのパフォーマンスが問題となる。
スキーマ : ExcelやSpreadSheetの様なテーブル型で、データの持ち方をDBに定義する必要がある。 テーブルのJOINという形でデータを連結して取得できる。 データが大量になり複雑なクエリになるとインデックスの設定があっても遅くなりがち。 データの多いテーブルに対するスキーマの変更には時間がかかる。 とはいえ、スキーマがあるおかげでデータの整合性の実績がある。
トランザクション : ACID 準拠のトランザクション管理可能なので、メインのデータベースとして使える。
クエリ言語 : SQL(Structured Query Language)を使う。一度使い慣れると本当に使いやすいと思う。 スキーマが複雑になってくるとJOINがややこしくなり可読性が下がる。
検索 : 全文検索にMyISAMエンジンがあるがElasticSearchには到底及ばない。 LIKE句のあいまい検索はデータが多いと本当に遅い。 インデックスを適切に設定すれば割と大きなデータ量でもレスポンスは早いが限界は感じる。
インストールと設定方法
</db-server-mariadb/>
キー・バリュータイプ
インメモリのデータベースでキー・バリューでデータを管理する。 RedisやDynamoDBがあり共にNoSQL。メモリ上のデータなので高速処理に向いている。高度なクエリやデータの関連性の管理には向いていない。
セッション管理のような単純なキー・バリュー型でデータを取得するにはもってこいのツール。
Redisの特徴
使用用途 : - セッション管理 - クエリのキャッシュ - Kafka Consumer のオフセットのキャッシュ
スキーマ : キー・バリューのデータ管理なのでスキーマというものはない。
トランザクション : 一定のタイミングで永続化は可能だが、RDBMSの様なロールバックできるトランザクションはない。
クエリ言語 : NoSQLなので、SQLの様なクエリ言語はない代わりにプログラミング言語的な記述をしないといけない。
検索 : RedisJSONモジュールを使うと、JSON クエリ機能が使え、NoSQL データベースのように 複雑なクエリ を実行できます。 RediSearch というモジュールを使と、SQL のような全文検索フルテキスト検索 や フィルタリング も可能になる。
インストールと設定方法
</db-server-redis/>
グラフタイプ
グラフデータベースにはNeoj4、AWSのNeptuneや、インメモリのMemgraphなどがあります。テーブル型、キーバリュー型とはまた別の発想のDBで、ノード、リレーション、プロパティーというデータ単位を使って関連性を表すデータの管理をする。
レコメンデーションデータの取得にはうってつけ!
Neo4jの特徴
使用用途 : - 複雑な人間関係を表すソーシャルネットワークのデータの保持などに向いている - レコメンデーションシステムに向いている
スキーマ : 良くも悪くもスキーマレス。RDBの様なスキーマがない分柔軟性があるが、検索対象のプロパティー(フィールド)が存在しない可能性を常に念頭に置かないといけない。
トランザクション : ACID 準拠のトランザクション管理可能なので、メインのデータベースとして使える。
クエリ言語 : CypherというSQLの構文を取り込んだクエリを書く。ただし、SQLとはデータの取得の方法の概念が全く異なるが、慣れるとこっちの方が楽かも。テーブルジョインという概念がなく、関連性のクエリが短く高速に行えるのでレコメンデーションデータの取得に便利。そして、クエリ言語のキーワードがSQLから盛り込まれているのでSQLユーザには学習しやすいのがメリット。
検索 : Neoj4もElasticSearch同様にApache Luceneをエンジンに使用していますが、検索に特化したElasticSearchの方が精度が高く、拡張性も分散型のElasticSearchの方が高そうです。JOINがない分RDBMSに比べるとデータが多くても高速でリアルタイムなレスポンスが期待できる。
インストールと設定方法
</db-server-neo4j/>
検索エンジンタイプ
検索エンジンデータベースには ElasticSearch や Apache Solr などがあります。
ElasticSearchは日本語全文検索のデファクトスタンダード!
ElasticSearchの特徴
使用用途 : - 全文検索 - 高速なリアルタイム検索
スキーマ : スキーマレスをうたっているが、動的なスキーマ設定にすればスキーマレスになりますが、より効率的なデータ管理をしようとすると結局割とスキーマ的なものを管理しないといけない。
トランザクション : 分散型の検索エンジンでスピードや拡張性を重視しているので、トランザクションは無い。
クエリ言語 : DSL(Domain Specific Language)クエリを使う。DSLクエリはJSONで記述するのでフォーマットしたJSONを書くと、結構冗長な書き方にならざるを得ない。それに比べてSQLやCypherは可読性が高いです。とはいえ学習コストはそこまで高くないです。
検索 : 細かい調整もできる日本語の全文検索検索に非常に向いていて高速です。
インストールと設定方法
追記予定です。楽しみにしておいてください。
ドキュメントタイプ
ドキュメント型データベースには Firebase Firestore や MongoDB があります。共にNoSQLです。
モバイルのバックエンドには使える。大規模システムのDBには向かない。
Firestoreの特徴
使用用途 : データのリアルタイム同期が可能で、JSONのネスト化の様なデータ保存ができるので、ここのユーザに紐づくデータが多いチャットやゲームの様なモバイルアプリ用バックエンドには向いている。
スキーマ : スキーマレスでデータ構造を柔軟に編子できる。Firestore は 「ドキュメント(JSONオブジェクト)」 とその集合である「コレクション」という単位でデータを管理する。階層構造を持つことができるので、ネストしたデータをそのまま保存できるのが利点。
トランザクション : 同時実行の対象のドキュメント数に上限はあるがロールバックできるトランザクションはサポートしているのでデータの整合性は守られている。排他ロックはなく楽観ロックなので処理の同時実行の競合がある場合はリトライになる。
クエリ言語 : NoSQLなので、SQLの様なクエリ言語はない代わりにプログラミング言語的な記述をしないといけない。
検索 : 複雑なソートがしにくいのが難点。しかし、ネスト化されたデータを取得できるのは便利。
まとめ
今回は次のデータベースタイプの特徴について理解を深めました。リレーショナルタイプ、キー・バリュータイプ、グラフタイプ、検索エンジンタイプ、ドキュメントタイプなどがありました。RDBMSは長年の実績があり未だにシステムのメインデータベースとしても使用されています。キー・バリュー型のRedisはセッション管理に向いています。グラフデータベースのNeo4jはレコメンデーション用。検索エンジン型のElasticSearchは全文検索に使えます。ドキュメントタイプはモバイルとの相性が良い。それぞれの特徴を活かした使い方をしていきましょう。









