派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【コラム】データベースのしくみと使い方を知る:エンジニアが生き残るためのテクノロジーの授業 #4

この記事では、動画 「エンジニアが生き残るためのテクノロジーの授業 #4:データベースのしくみと使い方を知る」をまとめています。今回はデータベースを使う際に必ず知っておきたい基本的なことをご紹介。データベースを使ってはいるが詳しくはわからないといった方、ぜひこのコラムをご活用ください。

社内で資料を作成するときに、ファイルを使っている人は多いでしょう。一方で、組織のシステムではデータベースが多く使われています。なぜファイルではなくデータベースを使うのか、データベースを使うメリットについて知っておくとともに、データベースの持つ機能や特徴、データベースを操作するときに使うSQLという言語について、基本的な内容を知っておきましょう。

【筆者】
増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピューターを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『Pythonではじめるアルゴリズム入門』『IT用語図鑑』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『プログラマのためのディープラーニングのしくみがわかる数学入門』『プログラミング言語図鑑』(以上、ソシム)、『基礎からのプログラミングリテラシー』(技術評論社)などがある。

データベースを使うメリットを知る

組織でデータがバラバラに管理されていると、管理者はどこにどんなデータがあるのか把握しておく必要があります。しかし、一箇所にデータをまとめて保存しておくことで、管理者の手間がかからなくなります。このように、データベースには、データをまとめて管理するという役割があります。

この場合は、ファイルサーバーでも同じようにまとめて管理できると思うかもしれません。しかし、ファイルを使うとさまざまなデメリットが存在します。

例えば、複数の人が同時にアクセスするとどうなるでしょうか?

ある人が開いて、ファイルを編集している最中に、他の人がそのファイルを編集して先に保存してしまうかもしれません。最初の人が編集した内容を保存すると、後の人が編集した内容が失われてしまうかもしれません。

CSVファイルやExcelファイルなどを使うと、入力するときにチェックされないため、電話番号を入れる箇所に住所を入力してもエラーにならず、そのままデータが登録されることも考えられます。

Excelなどの場合は、表の数が少しであればそれほど問題になりませんが、表の数が増えると管理が大変になります。目的の表を見つけるのも大変ですし、それらを結合してデータを抜き出そうとすると難しいでしょう。

データベースの場合は、専用のソフトウェアを使うことで、大量のデータから必要なデータだけを素早く取り出せるだけでなく、複数の人が同時にアクセスできるように制御されています。

また、データベースでは登録できるデータの形を制限し、それぞれのデータを紐づけておくことで、データの整合性を確保できます。

DBMSについて知る

上記のような便利な機能を実現してくれるのが、データベース管理システムで、英語の頭文字をとってDBMS(Data Base Management System)と呼ばれることもあります。

DBMSを使えば、私たちはSQLという言語で書かれた文を発行するだけです。その記述内容に沿って、DBMSが処理を行い、結果を返してくれます。

DBMSの内部では、実行されたSQL文を解析し、データの行数やインデックスと呼ばれる索引などを元に最適化され、実行されます。

つまり、私たちはSQL文を発行するだけで、後の処理は全部DBMSがうまく処理してくれるのです。

このDBMSが存在することで、利用者だけでなくプログラマも楽になります。

もしDBMSがない場合、プログラマはアプリケーションの画面を設計するだけでなく、どのようにデータを保存するのかを考える必要があります。

そのとき、同時に実行された場合はどうするのか、もし途中で何らかの障害が発生した場合はどうするのか、アクセス権限やログなどのセキュリティ面はどのように管理するのか、ということを全部考えなくてはいけなくなります。

しかし、DBMSが存在することで、データの管理をすべてDBMSに任せられます。プログラマは画面などを考え、DBMSに対してSQLで指示するだけでよくなるのです。

f:id:itstaffing:20210824151906j:plain

データベースに使われている技術を知る

■トランザクション
トランザクションは、一連の処理のことを指します。例えば、ある口座から別の口座へ振り込む処理を行うとき、振込元の口座の残高を減らして、振込先の口座の残高を増やす必要があります。このとき、もし振込元の口座の残高だけが減ってしまうと困ります。

このように、複数の更新処理を実行するとき、一部だけが更新され、残りが更新されないと困ってしまうので、処理がすべて成功した場合は反映し、途中で失敗した場合は処理前の状態に戻すという処理をおこないます。

これを実現するために、すべての処理が終わった後で、データを確定するためのコミットという処理をおこないます。

コミットが行われると、データベースの更新内容が有効になり、もし、途中で問題が発生した場合には、ロールバックという処理を行うことで、それまでの更新内容を全て無効にして取り消します。

f:id:itstaffing:20210824151828j:plain

■同時実行制御
同時実行制御は、複数の人が同時にアクセスしても問題なく処理できることを指します。これを実現するために、トランザクションの分離やロックという技術があります。

トランザクションの分離とは、更新中の処理を他からは読み取れないようにする方法です。例えば、2つのトランザクションが動いていたとき、一方の処理からは他の処理で更新されたデータは読み取れないようにします。

ロックは、更新中のデータを他から更新できないようにする仕組みです。もし一方の処理と同じデータを更新しようとすると、もう一方の処理は同時に実行できず、相手の処理が終了するまで待たされることになります。

ロックによって他からの更新を防げますが、デメリットもあります。

例えば、複数の処理が実行中に、それぞれの処理の結果待ちになって動かなくなることをデッドロックといいます。

デッドロックとは、図のようにAさんが「Aさんの口座」から「Bさんの口座」に振り込もうとしています。同時に、Bさんが「Bさんの口座」から「Aさんの口座」に振り込もうとしています。

f:id:itstaffing:20210824151831j:plain

このとき、Aさんが自分の口座から出金の操作をすると、Aさんのデータをロックします。そして、Bさんが自分の口座から出金の操作をすると、Bさんのデータをロックします。

次に、AさんがBさんの口座に入金しようとすると、Bさんの口座は出金の操作でロックされているため、更新できません。そこで、Bさんのトランザクションが終わるまで待つことになります。

一方、BさんもAさんの口座に入金しようとすると、Aさんの口座も出金の操作でロックされているため、更新できません。つまり、こちらもAさんのトランザクションが終わるまで待つことになります。どちらも処理が進まなくなくなり、処理を取り消すしかありません。

■障害回復
障害回復は、停電や故障などが発生したときに、データを障害発生時点の状態に戻すことで、ロールバックとロールフォワードという方法が使われます。

例えば、図のような状況を考えてみましょう。いくつかのトランザクションが実行されていますが、チェックポイントの段階でコミットされているデータはバックアップが取得されているとします。その後、障害が発生したとしましょう。

f:id:itstaffing:20210824151835j:plain

このとき、一番下のトランザクションのように、障害発生時点で処理中のデータがあったとします。これは、なかったものとしてもとに戻す必要があります。これをロールバックといいます。

また、上から2つ目と3つ目のトランザクションは、チェックポイントの時点でコミットされていないので、バックアップにありません。このデータは、バックアップされたデータに加えてログなどを使って復旧するのです。これをロールフォワードといいます。

基本的なSQLを知る

■SQLとは
SQLは、関係データベースを操作するための言語のことで、元々は「構造化されたデータを照会する言語(Structured Query Language)」という言葉の略語だと言われていました。

現在は略語ではないとされていますが、構造化データを扱う言語である、ということは変わりません。また、標準として定められているため、多くの関係データベースで同じように操作できます。

よく使われているSQLとして、表のようなものがあり、DDLとDML、DCLの3つに分かれています。

DDLはデータベースの中にテーブルを作成したり削除したりするときに使います。テーブルを作成するときには、テーブルのそれぞれの列にどのようなデータを入れるのか、その内容を事前にDDLで定義するのです。

f:id:itstaffing:20210824151839j:plain

DDLはテーブルを作成するときだけですが、そのほかのDMLとDCLは普段から使うものが多く、データの取得や登録、更新、削除、確定、取り消しなどがあります。

■データの取得
テーブルからデータを抜き出す場合はSELECTという文を使います。SELECTの後に抽出したい列の名前、FROMに続けてテーブルの名前を指定します。そして、WHEREの後に条件を指定し、並べ替えたい場合にはORDER BYの後に列を指定します。

これによって、指定したテーブルから条件を満たす行を抽出し、指定した列だけを表示できます。このとき、並べ替えの順序も実行前に指定しておくことが必要です。

例えば、図のような都道府県テーブルがあったとします。それぞれの都道府県の名前と、面積が格納されています。

f:id:itstaffing:20210824151844j:plain

このテーブルから面積が1万平方キロメートルより大きい都道府県を抽出し、面積の大きい方から順に並べることを考えます。この表を作成する場合、抽出したい列は都道府県名と面積、条件は面積が1万平方キロメートルより大きい、というものを指定すると、次のようになります。

f:id:itstaffing:20210824151847j:plain

また、面積を合計したい場合は、SELECTの後にSUMという合計の関数を指定します。すると、次のように合計を計算できます。

f:id:itstaffing:20210824151851j:plain

■データの登録
テーブルにデータを登録するにはINSERTという文を使います。INSERT INTOの後にテーブル名を指定し、登録する列に続けてVALUESと登録する値を指定します。

例えば、住所録テーブルに登録する場合、このようなSQLが考えられます。

f:id:itstaffing:20210824151854j:plain

ここでは、名前、郵便番号、住所、電話番号、メールアドレスという5つの項目に、それぞれ値を設定しています。これを実行すると、住所録テーブルにデータが登録されます。ここで、左端にあるIDはSQLの中では指定していませんが、自動的に連番が割り振られるように設定されていることが多いものです。

■データの更新
テーブルに格納されているデータの更新にはUPDATEという文を使います。UPDATEの後にテーブル名を指定し、SETの後に更新する内容を、WHEREの後に更新するデータを指定する条件を記述します。

例えば、今回は先ほど登録したデータのメールアドレス部分を更新してみましょう。先ほどのデータの場合、IDが1だったので、次のように記述できます。

f:id:itstaffing:20210824151858j:plain

これにより、住所録テーブルにおいて、IDが1の行のメールアドレスが変更されます。もし複数の項目をまとめて更新したい場合には、SETに指定する項目をそれだけ増やせば一度に実行できます。WHEREの部分はテーブルを取得するときと同じです。

■データの削除
テーブルからデータを削除するにはDELETEという文を使います。DELETE FROMの後にテーブル名を指定し、WHEREの後に削除するデータを指定する条件を記述します。これにより、指定されたテーブルの中から条件の一致するものを選び出し、削除します。

先ほどのデータの場合は、次のように削除できます。これを実行すると、データが物理的に削除されます。

f:id:itstaffing:20210824151902j:plain

データベースは最初のハードルは高いですが、一度作ってしまえば便利に使えます。ぜひ活用してみてください。

▼ これまでの「コラム:エンジニアが生き残るためのテクノロジーの授業」
#1「現代のITエンジニアに求められるスキルとは?」
#2「プログラミングに必要なアルゴリズムの考え方とは?」
#3「ネットワークがつながる理由を知る」