開発者ドキュメント

SQLiteとMySQLとPostgreSQL:リレーショナルデータベース管理システムの比較

序章

データを行と列のテーブルに編成するリレーショナルデータモデルは、データベース管理ツールで主流です。 現在、NoSQLNewSQLなどの他のデータモデルがありますが、リレーショナルデータベース管理システム(RDBMS)は、世界中でデータを保存および管理するための主要なのままです。

この記事では、最も広く実装されている3つのオープンソースRDBMS、 SQLite MySQL 、およびPostgreSQLを比較対照します。 具体的には、各RDBMSが使用するデータ型、それらの長所と短所、およびそれらが最適化される状況について説明します。

データベース管理システムについて少し

データベースは、論理的にモデル化された情報のクラスター、またはデータです。 一方、データベース管理システム(DBMS)は、データベースと対話するコンピュータープログラムです。 DBMSを使用すると、データベースへのアクセスの制御、データの書き込み、クエリの実行、およびデータベース管理に関連するその他のタスクの実行を行うことができます。

データベース管理システムは「データベース」と呼ばれることがよくありますが、2つの用語は互換性がありません。 データベースは、コンピューターに保存されているデータだけでなく、任意のデータのコレクションにすることができます。 対照的に、DBMSは、データベースとの対話を可能にするソフトウェアを具体的に指します。

すべてのデータベース管理システムには、データの保存方法とアクセス方法を構造化する基盤となるモデルがあります。 リレーショナルデータベース管理システムは、リレーショナルデータモデルを採用したDBMSです。 このリレーショナルモデルでは、データはテーブルに編成されています。 RDBMSのコンテキストでは、テーブルはより正式にはRelationsと呼ばれます。 リレーションは、テーブルの行であるタプルのセットであり、各タプルは、テーブルの列である属性のセットを共有します。

ほとんどのリレーショナルデータベースは、構造化クエリ言語(SQL)を使用してデータを管理およびクエリします。 ただし、多くのRDBMSは、SQLの独自の方言を使用します。これには、特定の制限または拡張機能がある場合があります。 これらの拡張機能には通常、ユーザーが標準SQLを使用する場合よりも複雑な操作を実行できるようにする追加機能が含まれています。

注:「標準SQL」という用語は、このガイド全体で何度か出てきます。 SQL標準は、米国規格協会(ANSI)国際標準化機構(ISO)、および国際電気標準会議(IEC)によって共同で管理されています。 。 この記事で「標準SQL」または「SQL標準」について言及する場合は常に、これらの機関によって公開されているSQL標準の現在のバージョンを指します。

完全なSQL標準は大きく複雑であることに注意してください。完全なコアSQL:2011準拠には、179の機能が必要です。 このため、ほとんどのRDBMSは標準全体をサポートしていませんが、一部のRDBMSは他のRDBMSよりも完全に準拠しています。

データ型と制約

各列にはデータ型が割り当てられ、その列で許可されるエントリの種類が決まります。 異なるRDBMSは異なるデータ型を実装しますが、これらは常に直接交換可能であるとは限りません。 一般的なデータ型には、日付、文字列、整数、ブール値などがあります。

データベースに整数を格納することは、テーブルに数値を格納するよりも微妙な違いがあります。 数値データ型は、正の数と負の数の両方を表すことができる符号付き、または正の数のみを表すことができる符号なしのいずれかです。 たとえば、MySQLの tinyint データ型は8ビットのデータを保持できます。これは256の可能な値に相当します。 このデータ型の符号付きの範囲は-128〜127ですが、符号なしの範囲は0〜255です。

データベースに許可されるデータを制御できることが重要です。 データベース管理者は、テーブルに制約を課して、テーブルに入力できる値を制限する場合があります。 通常、制約は1つの特定の列に適用されますが、一部の制約はテーブル全体にも適用できます。 SQLで一般的に使用されるいくつかの制約は次のとおりです。

データベース管理システムの詳細については、NoSQLデータベース管理システムとモデルの比較に関する記事をご覧ください。

リレーショナルデータベース管理システム全般について説明したので、この記事で取り上げる3つのオープンソースリレーショナルデータベースの最初のSQLiteに移りましょう。

SQLite

SQLiteは、自己完結型のファイルベースの完全にオープンソースのRDBMSであり、移植性、信頼性、および低メモリ環境でも強力なパフォーマンスで知られています。 そのトランザクションは、システムがクラッシュしたり停電したりした場合でも、ACID準拠です。

SQLiteプロジェクトのWebサイトは、これを「サーバーレス」データベースとして説明しています。 ほとんどのリレーショナルデータベースエンジンは、プログラムが要求を中継するプロセス間通信を介してホストサーバーと通信するサーバープロセスとして実装されます。 対照的に、SQLiteでは、データベースにアクセスするすべてのプロセスがデータベースディスクファイルを直接読み書きできます。 これにより、サーバープロセスを構成する必要がなくなるため、SQLiteのセットアッププロセスが簡素化されます。 同様に、SQLiteデータベースを使用するプログラムに必要な構成はありません。必要なのはディスクへのアクセスだけです。

SQLiteは無料のオープンソースソフトウェアであり、使用するために特別なライセンスは必要ありません。 ただし、このプロジェクトでは、圧縮と暗号化に役立ついくつかの拡張機能が提供されています(それぞれ1回限りの料金がかかります)。 さらに、このプロジェクトでは、それぞれ年会費でさまざまな商用サポートパッケージを提供しています。

SQLiteでサポートされているデータ型

SQLiteでは、次のストレージクラスに編成されたさまざまなデータ型を使用できます。

データ・タイプ 説明
null を含む NULL 値。
integer 値の大きさに応じて1、2、3、4、6、または8バイトで格納される符号付き整数。
real 8バイトの浮動小数点数として格納された実数または浮動小数点値。
text データベースエンコーディングを使用して格納されたテキスト文字列。UTF-8、UTF-16BE、またはUTF-16LEのいずれかです。
blob データの任意のblob。すべてのblobは、入力されたとおりに正確に格納されます。

SQLiteのコンテキストでは、「ストレージクラス」と「データ型」という用語は互換性があると見なされます。 SQLiteのデータ型とSQLite型の親和性について詳しく知りたい場合は、このテーマに関するSQLiteの公式ドキュメントを確認してください。

SQLiteの利点

SQLiteのデメリット

SQLiteを使用する場合

SQLiteを使用しない場合

MySQL

DB-Enginesランキングによると、MySQLは、サイトが2012年にデータベースの人気を追跡し始めて以来、最も人気のあるオープンソースRDBMSです。 これは、Twitter、Facebook、Netflix、Spotifyなど、世界最大のWebサイトやアプリケーションの多くを強化する機能豊富な製品です。 MySQLの使用を開始するのは比較的簡単です。これは、主に網羅的なドキュメントと大規模な開発者コミュニティ、およびオンラインのMySQL関連リソースの豊富さのおかげです。

MySQLは、標準SQLに完全に準拠することを犠牲にして、速度と信頼性を考慮して設計されました。 MySQL開発者は、標準SQLへの準拠に継続的に取り組んでいますが、それでも他のSQL実装に遅れをとっています。 ただし、コンプライアンスに近づけるためのさまざまなSQLモードと拡張機能が付属しています。

SQLiteを使用するアプリケーションとは異なり、MySQLデータベースを使用するアプリケーションは、別のデーモンプロセスを介してSQLiteにアクセスします。 サーバープロセスはデータベースと他のアプリケーションの間にあるため、データベースにアクセスできるユーザーをより細かく制御できます。

MySQLは、その機能を拡張し、操作を容易にする、豊富なサードパーティのアプリケーション、ツール、および統合ライブラリに影響を与えました。 これらのサードパーティツールの中でより広く使用されているものには、 phpMyAdmin DBeaver 、およびHeidiSQLがあります。

MySQLでサポートされているデータ型

MySQLのデータ型は、数値型、日付と時刻の型、文字列型の3つの大きなカテゴリに分類できます。

数値タイプ

データ・タイプ 説明
tinyint 非常に小さい整数。 この数値データ型の符号付き範囲は-128〜127ですが、符号なし範囲は0〜255です。
smallint 小さな整数。 この数値タイプの符号付き範囲は-32768〜32767ですが、符号なし範囲は0〜65535です。
mediumint 中型の整数。 この数値データ型の符号付き範囲は-8388608〜8388607ですが、符号なし範囲は0〜16777215です。
int また integer 通常サイズの整数。 この数値データ型の符号付き範囲は-2147483648〜2147483647ですが、符号なし範囲は0〜4294967295です。
bigint 大きな整数。 この数値データ型の符号付き範囲は-9223372036854775808〜9223372036854775807であり、符号なし範囲は0〜18446744073709551615です。
float 小さい(単精度)浮動小数点数。
double, double precision、 また real 通常のサイズ(倍精度)の浮動小数点数。
dec, decimal, fixed、 また numeric パックされた固定小数点数。 このデータ型のエントリの表示長は、列の作成時に定義され、すべてのエントリはその長さに準拠します。
bool また boolean ブール値は、2つの可能な値のみを持つデータ型であり、通常は次のいずれかです。 true また false.
bit 1から64までの値ごとのビット数を指定できるビット値タイプ。

日付と時刻のタイプ

データ・タイプ 説明
date として表される日付 YYYY-MM-DD.
datetime 日付と時刻を示すタイムスタンプ。 YYYY-MM-DD HH:MM:SS.
timestamp Unixエポック(1970年1月1日の00:00:00)からの経過時間を示すタイムスタンプ。
time として表示される時刻 HH:MM:SS.
year 2桁または4桁の形式で表された年で、デフォルトは4桁です。

文字列タイプ

データ・タイプ 説明
char 固定長の文字列。 このタイプのエントリは、格納時に指定された長さに合うように右側にスペースが埋め込まれます。
varchar 可変長の文字列。
binary に似ています char タイプですが、非バイナリ文字列ではなく、指定された長さのバイナリバイト文字列です。
varbinary に似ています varchar タイプですが、非バイナリ文字列ではなく、可変長のバイナリバイト文字列です。
blob データの最大長が65535(2 ^ 16-1)バイトのバイナリ文字列。
tinyblob A blob データの最大長が255(2 ^ 8-1)バイトの列。
mediumblob A blob データの最大長が16777215(2 ^ 24-1)バイトの列。
longblob A blob データの最大長が4294967295(2 ^ 32-1)バイトの列。
text 最大長が65535(2 ^ 16-1)文字の文字列。
tinytext A text 最大長が255(2 ^ 8-1)文字の列。
mediumtext A text 最大長が16777215(2 ^ 24-1)文字の列。
longtext A text 最大長が4294967295(2 ^ 32-1)文字の列。
enum 列挙型。これは、テーブルの作成時に宣言される値のリストから単一の値を取得する文字列オブジェクトです。
set 列挙型と同様に、0個以上の値を持つことができる文字列オブジェクト。各値は、テーブルの作成時に指定される許可された値のリストから選択する必要があります。

MySQLの利点

MySQLのデメリット

MySQLを使用する場合

MySQLを使用しない場合

PostgreSQL

Postgresとしても知られるPostgreSQLは、「世界で最も先進的なオープンソースのリレーショナルデータベース」と自称しています。 これは、高度に拡張可能で標準に準拠することを目的として作成されました。 PostgreSQLはオブジェクトリレーショナルデータベースです。つまり、これは主にリレーショナルデータベースですが、オブジェクトデータベースに関連付けられることが多い機能(テーブル継承や関数のオーバーロードなど)も含まれています。

Postgresは、同時に複数のタスクを効率的に処理できます。これは、同時実行として知られる特性です。 Multiversion Concurrency Control(MVCC)の実装により、読み取りロックなしでこれを実現します。これにより、トランザクションのアトミック性、一貫性、分離、および耐久性が保証されます。これは、ACIDコンプライアンスとも呼ばれます。

PostgreSQLはMySQLほど広く使用されていませんが、pgAdminPostbirdなど、PostgreSQLの操作を簡素化するように設計されたサードパーティのツールやライブラリがまだ多数あります。

PostgreSQLでサポートされているデータ型

PostgreSQLは、MySQLのような数値、文字列、および日付と時刻のデータ型をサポートしています。 さらに、幾何学的形状、ネットワークアドレス、ビット文字列、テキスト検索、JSONエントリのデータ型、およびいくつかの固有のデータ型をサポートします。

数値タイプ

データ・タイプ 説明
bigint 符号付き8バイト整数。
bigserial 自動インクリメントの8バイト整数。
double precision 8バイトの倍精度浮動小数点数。
integer 符号付き4バイト整数。
numeric また decimal 金額など、正確さが重要な場合に使用するために推奨される、選択可能な精度の数。
real 4バイトの単精度浮動小数点数。
smallint 符号付き2バイト整数。
smallserial 自動インクリメントの2バイト整数。
serial 自動インクリメントの4バイト整数。

文字タイプ

データ・タイプ 説明
character 指定された固定長の文字列。
character varying また varchar 可変であるが長さが制限されている文字列。
text 可変長の無制限の文字列。

日付と時刻のタイプ

データ・タイプ 説明
date 日、月、年で構成される暦日。
interval 期間。
time また time without time zone タイムゾーンを含まない時刻。
time with time zone タイムゾーンを含む時刻。
timestamp また timestamp without time zone タイムゾーンを含まない日付と時刻。
timestamp with time zone タイムゾーンを含む日付と時刻。

ジオメトリックタイプ

データ・タイプ 説明
box 平面上の長方形のボックス。
circle 平面上の円。
line 平面上の無限の線。
lseg 平面上の線分。
path 平面上の幾何学的パス。
point 平面上の幾何学的な点。
polygon 平面上の閉じた幾何学的パス。

ネットワークアドレスタイプ

データ・タイプ 説明
cidr IPv4またはIPv6ネットワークアドレス。
inet IPv4またはIPv6ホストアドレス。
macaddr メディアアクセス制御(MAC)アドレス。

ビット文字列タイプ

データ・タイプ 説明
bit 固定長のビット文字列。
bit varying 可変長ビット文字列。

テキスト検索タイプ

データ・タイプ 説明
tsquery テキスト検索クエリ。
tsvector テキスト検索ドキュメント。

JSONタイプ

データ・タイプ 説明
json テキストのJSONデータ。
jsonb 分解されたバイナリJSONデータ。

その他のデータ型

データ・タイプ 説明
boolean いずれかを表す論理ブール true また false.
bytea 「バイト配列」の略で、このタイプはバイナリデータに使用されます。
money 通貨の金額。
pg_lsn PostgreSQLログシーケンス番号。
txid_snapshot ユーザーレベルのトランザクションIDスナップショット。
uuid 普遍的に一意の識別子。
xml XMLデータ。

PostgreSQLの利点

PostgreSQLのデメリット

PostgreSQLを使用する場合

PostgreSQLを使用しない場合

結論

今日、SQLite、MySQL、およびPostgreSQLは、世界で最も人気のある3つのオープンソースリレーショナルデータベース管理システムです。 それぞれに独自の機能と制限があり、特定のシナリオで優れています。 RDBMSを決定する際には、かなりの数の変数が関係しており、最速のものまたは最も多くの機能を備えたものを選択するほど簡単な選択はめったにありません。 次回、リレーショナルデータベースソリューションが必要になったときは、これらのツールやその他のツールを詳細に調べて、ニーズに最適なツールを見つけてください。

SQLと、SQLを使用してリレーショナルデータベースを管理する方法について詳しく知りたい場合は、SQLデータベースの管理方法のチートシートを参照することをお勧めします。 一方、非リレーショナル(またはNoSQL)データベースについて知りたい場合は、NoSQLデータベース管理システムの比較を確認してください。

参考文献

モバイルバージョンを終了