データを取り扱うにあたり、多くの場合でデータベースの知識は避けられないものとなります。本稿ではこれからデータベースについて学ぶ方、データベースの基本事項について学習したい方向けに、データベースの基本的な知識や役割について解説していきたいと思います。
専門用語の使用はなるべく避け、業務を行う上で分かりやすい言葉で説明しようと思います。
データベース構築前の準備
「データを活用しようと思うけど、まず何をするべきなのだろう?」
これからデータを扱う方の中で、漠然とこのような疑問を抱いている方は少なくないと思います。
データを活用するにはまず、そのデータを使って何をやりたいのか?という部分を明確にイメージすることがとても重要です。データというせっかくの宝石を腐らせないよう、データを使って自分が実現したいことを明確にしておきましょう。
やりたいことが決まったら、いよいよデータベース構築です。業務を実現するためにデータをデータベースに入れるための知識の準備をしましょう。
DBMSとSQL
「データベースとは?」という問いに対する答えとして、初学者のうちは「データがたくさん入った箱」くらいで捉えておいてそこまで問題ありませんが、出来ればもう一歩踏み込んだ理解をしておくとよいでしょう。
一歩踏み込んだ理解に必要なキーワードは2つです。
・DBMS(Data Base Management System):データベースの操作を行うソフトウェア
・SQL(Structured Query Language):DBMSに対して命令を送る際に使用する言語
DBMSはSQLによる命令を理解し、データベースの操作を実行します。私たちはSQLを介してDBMSと会話し、データベース内にあるデータを操作していくわけですね。
リレーショナルデータベース(RDB)
データ操作のイメージが掴めたら、次はデータの扱い方について説明してきたいと思います。
一口にデータベースといっても実際にはデータベースの種類は様々あるのですが、一般的に特に指定なくデータベースといった場合にはリレーショナルデータベースのことを指します。
リレーショナルデータベースではデータをテーブルという単位で保持し、そのテーブル同士に関係をもたせることにより、データ操作を実現します。テーブルというのは以下のような表をイメージしていただければ十分です。
店舗コード | 店舗名 | エリア | 取引番号 | 金額 |
013_556_0001 | A | X | 001 | 200 |
013_556_0001 | A | X | 002 | 500 |
033_278_0005 | D | Y | 004 | 1000 |
マスタデータとトランザクションデータ
データは大きくマスタデータとトランザクションデータに分けることができます。マスタデータは更新頻度が少ないデータ、トランザクションデータは随時更新されるデータと捉えると分かりやすいです。
マスタデータの例としては店舗データ、商品データ、医薬品データなどがあり、トランザクションデータの例としては注文履歴、入退院履歴、勤怠などがあげられます。データを分ける大きな理由として保守性とメンテナンス性の向上があります。
例として先ほどのテーブルを見てみましょう。
店舗コード | 店舗名 | エリア | 取引番号 | 金額 |
013_556_0001 | A | X | 001 | 200 |
013_556_0001 | A | X | 002 | 500 |
033_278_0005 | D | Y | 004 |
1000 |
このテーブルのデータ内容をよく見ると、同じ店舗コードで違う取引番号である行が含まれていることが分かります。
このままですと、エリアが変更されたときに複数の行を直さなければならないため更新が大変ですし、万が一更新漏れが発生してしまうとデータの整合性が壊れてしまいます。(ひとつはエリアXの店舗A、ひとつはエリアWの店舗Bなど
このようなことを起こさないために、以下のようにテーブルの持ち方を変えてみましょう。
テーブル1:店舗マスタ
店舗コード | 店舗名 | エリア |
013_556_0001 | A | X |
033_278_0005 | D | Y |
テーブル2:取引明細
店舗コード | 取引番号 | 金額 |
013_556_0001 | 001 | 200 |
013_556_0001 | 002 | 500 |
033_278_0005 | 004 | 1000 |
テーブルが2つになったものの、それぞれのテーブルに関してはだいぶシンプルになりました。そしてテーブルを分割することでエリアが変わった際のデータ更新は店舗マスタのエリアを更新するだけでよくなりました。
ここで店舗マスタは更新の少ないマスタテーブル、取引明細は日々の取引情報が更新されるトランザクションテーブルと、業務上の扱いにおいても分けることができています。このようにデータを分ける手続きを正規化と言い、データ更新時に整合性が壊れてしまうことを更新時異常と言ったりしますが、詳細については割愛します。
さて、テーブルを分割して保守性やメンテナンス性が向上したのはいいのですが、最初のテーブルのように店舗情報と取引情報を一緒に見たいときはどうするのでしょうか。この疑問を解決していきたいと思います。
テーブルの結合
関係をもったテーブル同士をくっつけることを、テーブルの結合といいます。「先ほどの店舗マスタと取引明細を、店舗コードをキーとして結合する」という操作を見てみましょう。
まず、2つのテーブルを並べます。
テーブル1:店舗マスタ
店舗コード | 店舗名 | エリア |
013_556_0001 | A | X |
033_278_0005 | D | Y |
テーブル2:取引明細
店舗コード | 取引番号 | 金額 |
013_556_0001 | 001 | 200 |
013_556_0001 | 002 | 500 |
033_278_0005 | 004 | 1000 |
次に、同じ店舗コードをもつ行に関して、データをくっつけます。店舗コード013_556_0001についてくっつけると以下のようになります。
店舗コード | 店舗名 | エリア | 取引番号 | 金額 |
013_556_0001 | A | X | 001 | 200 |
013_556_0001 | A | X | 002 | 500 |
033_278_0005 | D |
さらに店舗コード033_278_0005に関してくっつけると以下のようになり、元に戻りましたね。
店舗コード | 店舗名 | エリア | 取引番号 | 金額 |
013_556_0001 | A | X | 001 | 200 |
013_556_0001 | A | X | 002 | 500 |
033_278_0005 | D | Y | 004 | 1000 |
このように、「同じもの(結合キー)があればくっつける、なければくっつけない」という操作を内部結合、またはインナージョインといいます。内部結合以外にも外部結合や交差結合など、いくつか種類がありますが、今回は業務で一番使われることが多い内部結合のみの紹介にとどめておこうと思います。
リレーショナルデータベースの一番の強みはこのテーブル同士の結合にあるといっても過言ではないでしょう。結合できることを前提としてテーブルの持ち方を変えたり、入れるデータを考えたりするわけですね。ここまで読んでいただけた方は、最初のテーブルの分割方法がある程度意図的であったことにも気付かれると思います。
最後に
いかがでしたでしょうか。今回はデータベースを構築する上で重要なことを、なるべく易しい言葉で書いてみました。キーワードについて振り返りましょう。
・マスタデータ
・トランザクションデータ
・リレーショナルデータベース
・テーブルの結合
より進んだ学習をしたい方は以下のキーワードをヒントに進められることをお勧めします。
・データモデリング
・ER図
・テーブルの正規化
・更新時異常