【ITエンジニア】(4)データベースの基礎

DBとは

DB(データベース)とは「何らかの規則を持ったデータの集まり」 

ざっくり言うと、同じ項目をもっていているデータが複数あること。
エクセルの表にまとめられるような情報が2行以上あるようなイメージ。

電話帳や会員名簿のように紙に記録されているものもデータベースといえる。

特にITの世界では、電子的な媒体にファイルなどの形式で保存・蓄積したものを指す。
一般的にはデータに対する「追加」や「検索」「抽出」…といった管理のための機能を含んでいる。

→Oracle、MySQLなど、データを格納し、そのデータを操作するための機能を提供する製品があり、IT業界でDBというと大体システム内で利用されるDB製品になる。

ただ闇雲に集めたデータの集合は「データベース」とは言えません。
その情報を活用する機能が付いて初めて「データベース」と呼べるのです。

安全」に「効率」よく「大量のデータ」を扱えることが肝です。

DBの種類

DBのデータモデルには種類があります。

大きく分けると「Relational Data Base Management System (以降, RDBMS) 」と「NoSQL」
ざっくりいうと「RDBMS」はエクセルのようにデータを格納するデータモデル
「NoSQL」は、上記以外のデータモデルを使用したもの。

RDBMSの有名な製品は、下記のようなものがある。

製品系:Oracle、SQL Server、DB2
OSS系:MySQL、PostgreSQL、MariaDB

それ以外については、ざっくり下の図のような型や製品がある。

「NoSQL」が使用されるケースはビックデータ解析などの新しい分野と言う印象。
昔からあるレガシーなシステムはほぼすべて RDBMS。

RDBMS データの持ち方

リレーショナルデータベースでは、項目を「それぞれ関係を持った」複数のテーブルにわけておき、必要なテーブルの必要部分だけを集めて利用することができる

テーブル・レコード・カラム

リレーショナルデータベースでは、1つのデータをいくつかの項目の集まりで表す。

1件のデータをレコード(行)、項目をカラム(列)と呼び、レコードの集まりである表を、テーブルと呼び、1つのデータベースには複数のテーブルを置くことができる。

エクセルシートとの違い

①エクセルはどのセルにどんな文字でも入れられるが、RDBのカラムには、決まった文字の種類、決まった文字数しか入れることはできない。
テーブルを作るときに型と桁を決めなくてはならない。

②エクセルは元に戻すなどの操作があり、入力したらすぐに反映される。
DBでは、トランザクション処理(後述)を使用しないと、そのような処理はできない。

これだけを見ると、DBとは不便なもののように見えますが、「数字は数字だけ」「誰かが勝手に上書きしない」という状況はデータの信頼性としてはとても高い状態であるといえる。

あとから内容を見るときに「とても綺麗なデータが入っている」状態であるということは、検索しやすい、プログラムで使用しやすいということになる。

(半角と全角の数字が混ざったエクセルでソートかけても、うまくいかないですよね・・・?)

また、後述するSQLという言語を使うと、とても高速に検索することができます。

レスポンス命のシステムでは、エクセルよりもメリットが多い(エクセルでは無理)ものになります。

(Excel自体も、簡易的なDBの1つと言えますね)

正規化とは

正規化の定義

正規形とは、一言で言うと「データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式」です。

もし、正規化(正規形にすること)を行わなかったら…..

一つの情報が複数のテーブルに存在して無駄なデータ領域と面倒な更新処理 を発生させてしまう。
冗長性

こうした冗長なデータ保持をしていると、更新処理のタイムラグによって データの不整合が発生したり、そもそもデータを登録することができないようなテーブルを作ってしまうことがある
非一貫性

こうした冗長性や非一貫性の問題を解決するために考案された方法論が、正規化である。

正規化には何段階かレベルがあって、一般的には第1~第5正規形がよく知られています。数字が増えるほど正規化のレベル(次数)が上がっていきます。

正規化の中でも、通常の業務で使用するレベルとして、第3正規形までを考えることが多い

実際に仕事で正規化を行なう際には、第3正規形まで達成したら、その時点で以降の正規形の条件も満たしていることがほとんどなので、正規形のレベルは第5まであるが、普通は第3正規形まで理解すれば十分です。

正規化の必要性

使いやすくしておかないと、同じデータを2回登録しちゃったり、それによって2つのレコードで違いがあったときによくわからなくなってしまったりします。

たとえば…
「今日のパーティー、鈴木さんと佐藤さんを足して128人来ることになっていたのに、64人しか来ないのは何で??」
「山田課長のお子さん情報、同じ名前の子供が256人居ることになってるけど…?」

みたいなことが、正規化されていないDB作ってから数年後発生するかもしれません。

何よりこんなDBを使う前提のシステム、作るのが大変すぎます。
システムの作りやすさの一因は、綺麗なテーブル分けにあると言っても過言ではありません。

なので正規化して、1情報1レコードで綺麗に持てるようにしましょう。

正規化されていないテーブルを正規形にする流れ

① “子”の列にはデータが複数入っているように見える。(もしかしたら、加藤”達夫信二”さん という1人のことかもしれないけれど…)

このままだと 加藤信二さんを検索したりするときにすごく使いづらいので、分ける。

② テーブルで社員かつ子供を管理することにすると、三島さんを探すときに3行もひっかかるため、大変使いづらい。
もしかしたら入力ミスで三鳥さんがまざっているかもしれない。

ここでは、一意に特定できるキーを付けることができる状態。
このケースでは、「社員」「扶養者」の2つにわけ、それぞれを一意に特定できるキーを用意できる(下線部がキー)

上記のように、データを扱いやすく出来るよう、テーブルの正規化を行っていく。

基本的な流れは左の下の図のとおり。

日本語は文字化けするかもしれないので、キーとなる項目は英数字のコード値が望ましい。

正規化したデータの使い方

正規化を行うと、データが分割されて、人の目ではわかりづらくなるが、使用するときには後述するSELECT文を使い、各テーブルを結合し、見やすいデータとして表示することが可能である。

これを「表の結合」という。

結合の方法もいろいろあるが、入門編としては、くっつけたいテーブルで

同じコードを持っているもの同士をつなげて1つのレコードのように表示するもの

という認識で大丈夫。

SQL

SQL【Structured Query Language】とは、リレーショナルデータベース(RDB:Relational Database)の管理や操作を行うための人工言語の1つである。

業界標準として広く普及しており、様々なデータベース管理システム(DBMS:Databese Management System)で利用できる。

DBMSへ利用者や外部のソフトウェアから命令を発行するために用いる言語で、データベースへのテーブルの追加や設定変更、削除、テーブル間の関係の定義や削除、テーブルへのデータの追加、更新、削除、データベースやシステムの設定変更などを行うための命令語と構文、文法などを定めている。

SQL文の分類

「データ定義言語」(DDL:Data Definition Language) :
CREATE文などデータ構造や関係の定義に関するもの、

「データ操作言語」(DML:Data Manipulation Language) :
SELECT文などデータの操作に関するもの

「データ制御言語」(DCL:Data Control Language)
GRANT文などシステムの管理や制御に関するもの

よく使われる命令文
  • INSERT INTO文 : テーブルにレコードを挿入する
  • DELETE文 : 同、削除する
  • UPDATE文 : 同、更新(上書き)する
  • SELECT文 : 条件を元に抽出する
  • CREATE文 : テーブルや制約条件などの定義を行う
  • DROP文 : 同、削除を行う
  • ALTER文 : 同、設定変更を行う
  • GRANT文 : 利用者に権限を付与する
  • REVOKE文 : 同、剥奪する
  • BEGIN文 : トランザクション処理を開始する
  • COMMIT文 : 同、完了する
  • ROLLBACK文 : 同、取り消す

一部の命令文では文の一部に別の文を含めることができ、複雑な処理を記述することができる。

INSERT文

INSERT文は、テーブルに新しいデータを追加するための命令である。
どこに、どのようなデータを追加するのかを指定する構造になっている。

  • 1行目の INSERT には、INTOのキーワードに続けて、データを追加するテーブル名を記述する。
  • さらにテーブル名の後ろに、カッコでくくってデータを追加する列名を指定する。
  • ただし、そのテーブルのすべての列に値を追加する場合には、2行目をまるごと省略可能。
  • 3行目は VALUES 句といい、2行目に記述した列名に対応するデータの値を指定する。
  • 列名をまるごと省略した場合は、テーブルのすべての列について、値を指定する必要がある。
DELETE文

DELETE文は、すでにテーブルに存在する行を削除するための命令である。
既存のデータに対する操作という点では、これまでに登場した SELECT文や UPDATE文と同じだが、行をまるごと削除する機能であるため、特定の列だけを指定するようなことはできない。

【「WHERE句」を絶対に忘れないこと】

WHERE句は、SQLの対象となる行の条件を設定する句である。ない場合は全てが対象となる。

※実行前に[DELETE]を[SELECT *]と書き換えて、本当に消したい行だけが抽出されることを確認すること

DELETE 文では列名を指定する必要がないため、1行目の DERETE の後ろには何も記述しない。
続けて記述する FROM句にテーブル名を指定するのは  SELECT文と同様である。

UPDATE文

UPDATE 文は、テーブルに既にあるデータを更新するための命令。

「WHERE句」を絶対に忘れないこと】 ※忘れたら全件更新されます

  • 1行目の UPDATE の直後には、更新したいデータの存在するテーブル名を記入する
  • 2行目を SET句といい、更新したい列名と、その列に書き込むデータを記述する
SELECT文

データベースとデータをやり取りするにあたって、最も頻繁に使われるSQLが SELECT文である。

テーブルから目的のデータを指定して取得することが役割。

1行目の SELECT の後ろには、取得したい列の名前をカンマで区切って記述する。
列の名前で、アスタリスク(*)を記述すれば、すべての列を指定するのと同等の効果が得られる。

2行目はFROM句といい、データを取得するテーブルを指定するために必ず指定する。
以降、必要に応じて、WHEREによる修飾やその他の修飾を続けて記述するその他の修飾文は沢山ある。(状況に応じて検索しましょう)

COUNT や SUM など抽出と同時に計算することもでき、また、SELECT文は2つ以上のテーブルを結合することもできる。

その際の書き方は以下となる。
「SELECT 列名 FROM  テーブル1, テーブル2 WHAREテーブル1.キー =  テーブル2.キー 」

書き方例:
SESELECT * FROM sample_db; (意味:sample_dbにあるすべての列(*)を抽出(select)する)

トランザクション処理とロック

トランザクション処理とは、データベースを利用するシステムにおいて、処理の一貫性を保証するために、関連する一連の処理全体を一個の処理単位として管理する仕組みのことである。

業務用途で用いられるデータベースシステムでは、複数の処理が関連するため、個々の小さな処理単位の成功・失敗を管理するだけでは不十分な場合がある。

引用:トランザクション処理とは – IT用語辞典 Weblio辞書

トランザクション処理を家賃振込で考えると …

例:【自分の出金と、管理会社への入金が同時に完了】

(一貫性の保持)しないと、

「自分は払ったけど、相手にお金は届いていない … お金はもうどこにもない!!!!」
という大変なことになる。

支払い処理と、受け取り処理、両方成功しない場合は、「全部失敗にする(1からやりなおす)」ことができるのが、トランザクション処理である。

※最新の情報の取得・更新に努めておりますが、掲載内容については、その正確性、完全性、有用性、最新性等についていかなる保証もするものではありません。

タイトルとURLをコピーしました