}3. リレーショナルデータベースの学習


3.1 リレーショナルデータベースとは。
(1)データベースはデータを効率良く記憶し、効率良く検索出来るようにする為の物です。
(2)データベースの中でもリレーショナルデータベースはデータを一番簡単な構造の2次元の表(テーブル)で持つ事で、コンピュータシステム全体を簡単に作れるように考え出された物です。
(3)リレーショナルデータベースはSQLで操作します、データ構造が簡単なので、SQLも文法が簡単で、命令数も少なく習得は容易ですが、難しい事もいとも簡単にこなせる優れ物です。
(4)SQLは文法が簡単なので難しい事を実現する為には知恵が必要です。
(5)SQLはリレーショナルデータベースを操作する機能しか無いので、プログラムを作るにはプログラミング言語が必要です。
(6)プログラミング言語はかなり難しいので、I言語を使い難しい部分はコンピュータに任せる事で、プログラムを簡単作れるようにしています。
3.2 テーブルとは。
(1)リレーショナルデータベースはデータを複数のテーブルで持ちます。
(2)テーブルの縦方向が列(カラム、フィールドとも言います)で人を表現する場合は氏名や生年月日と言った属性と成り、横方向が行(ロー、レコードとも言います)で個々のデータの組と成ります。
(3)コンピュータシステムは複数のテーブルから必要な情報を寄せ集め、目的の処理を行います。集める為に複数のテーブル同士をSQLの結合を使って簡単に行う事が出来ます。
(4)システム作りの最初はどのデータをどのテーブルに持つかを決める事から始めます、一般的には正規化と呼ばれる手法を使ってテーブルを設計します。
3.3 正規化とは。
(1)正規化には第1から第5、更にボイスコッド正規化まで有りますが、大事な事は3点だけですのでそれを説明します。
(2)説明のために家族構成を例に説明します。家族は夫婦2名で、列を住所、氏名、生年月日、年齢としてみます。
(3)1点目は他の列から導く事の出来る物は除きます。理由は他の列が変更された場合に整合性が取れなくなる可能性があるので、その可能性を無くす為です、年齢は生年月日と今日の日付から導く事が出来るので除きます。ただし、処理効率を考慮してあえて持つ場合も有ります。
(4)2点目は第1正規化の話で列に対し繰り返しは無いと言う事です、つまり家族は2人で氏名は2個有るので列で氏名を繰り返すのではなく、今回の場合は2名なので、2行で持つと言う事に成ります。
(5)3点目は第1正規化以外の正規化の話で、その列の主キーが同じ物を1個のテーブルにまとめる事が出来ると言う事です。第2正規化以降複数の正規化の作業が有りますが、正規化と言っても実際のデータは2次元の表で表せるような単純な構造ではなく、無理やり2次元の表にしようとしているので、主キーになりうる物が複数存在するので、そこの判定が難しい為です、どちらにしても、誰でも最初から目的に合った主キーを設定出来る訳では無いので、システムを開発している途中で、主キーの持ち方に問題有りとなる場合が有るので、その時点で主キーを変更する方法を取ります。実際には同じ主キーでも発生や消滅のタイミングが同じ物をまとめて1個のテーブルとします。
(5.1)主キーとは何かを説明します。SQLではデータを修正したり、削除したりするSQL文は条件を設定しないと全行に対して実行されます、そのため、その行と判別出来る情報が無いと、その行のみ処理する事が出来ません、つまり、他の行と区別する事の出来る列(複数列も可)を主キーと呼び、更新対象となるテーブルの場合は必ず主キーが必要に成ります。
(5.2)家族構成の場合住所は別の家族が同じ住所に同居している場合も有り、氏名も同名の可能性も有り、生年月日も同じ可能性も有るので、どちらも主キーには出来ません、最近マイナンバーの話題が出て来ていますが、人を区別する主キーが存在しないのでマイナンバーを作って主キーとしコンピューターで処理出来るように考え出された訳です。    よってテーブルを作るとすれば、列は主キーがマイナンバーで、氏名、生年月日は共に主キーはマイナンバーなので1個のテーブルと出来ます。住所は人ではなく家族単位ですので、主キーはマイナンバーでは無く、家族ナンバーを新設しそれが主キーとなり、家族ナンバーは主キーがマイナンバーなので、最初のテーブルに合わせます。結果次のようなテーブルとなります。
■人テーブル---マイナンバー(主キー)、家族ナンバー、氏名、生年月日。
■家族テーブル---家族ナンバー(主キー)、住所。
尚、今回は同じ住所に居る人が同じ家族の場合を想定していますが、別住所に家族が分散しても良い場合は当然この構造は間違いとなります。
★注意★マイナンバーは個人情報扱いですので、実際に企業で作る場合は社員番号を付与し使う方法をお勧めします。
3.4 SQLとは。
(1)SQLの文は大きく3種類の文が有ります。1つ目はデータ定義文、2つ目はデータ制御文、3つ目はデータ操作文です。I言語で必要なSQL文の概要を説明します。
★文の説明で[]で囲まれた物は省略可能の意味です。
(2)データ定義文。
(2.1)テーブルはデータを記憶する器です。
(2.1.1)テーブルを作成する文。「CREATE TABLE テーブル名 (列名 データ型 [DEFAULT 初期値] [NOT NULL] [,...])」
(2.1.2)テーブルを修正する文。「ALTER TABLE テーブル名 ...」
(2.1.3)テーブルを削除する文。「DROP TABLE テーブル名」
(2.2)インデックスは検索を早くしたり、ユニーク制約(重複を認めない)を設定する場合に使用します。
(2.2.1)インデックスを作成する文。「CREATE INDEX ...」
(2.2.2)インデックスを修正する文。「ALTER INDEX ...」
(2.2.3)インデックスを削除する文。「DROP INDEX ...」
(2.3)ビューはSELECT文を使ってテーブルの検索方法を変更した物をテーブルと同じ様に扱えるようにする物です。
(2.3.1)ビューを作成する文。「CREATE VIEW ...」
(2.3.2)ビューを修正する文。「ALTER VIEW ...」
(2.3.3)ビューを削除する文。「DROP VIEW ...」
(3)データ制御文。
(3.1)権限を作成する文。「GRANT [SELECT][,][INSERT][,][UPDATE][,][DELETE] ON テーブル名 TO ユーザー名」
(3.2)権限を削除する文。「REVOKE ALL ON テーブル名 FROM ユーザー名」
(3.3)トランザクションを開始する文。「BEGIN TRANSACTION」
★COMMITかROLLBACKが行われるまでテーブルの更新は実行されません。
(3.4)トランザクションを確定する文。「COMMIT TRANSACTION」
★BEGINから今までの更新が実行されます。
(3.5)トランザクションを取り消す文。「ROLLBACK TRANSACTION」
★BEGINから今までの更新が取り消されます。
(4)データ操作文。
(4.1)行を作成する文。「INSERT INTO テーブル名 (列名[,..]) VALUES(式[,..])」
★VALUES...の代わりにSELECT...でも可能です。
(4.2)行を修正する文。「UPDATE テーブル名 SET 列名=式[,..] [WHERE 条件]」
★条件を設定しないと全行が修正されます。
(4.3)行を削除する文。「DELETE FROM テーブル名 [WHERE 条件]」
★条件を設定しないと全行が削除されます。
(4.4)行を検索する文。「SELECT 式[,..] FROM テーブル名 [結合 テーブル名 ON 条件[...]] [WHERE 条件] [GROUP BY 式[,..] [HAVING 条件]] [ORDER BY 式[,..]]」
All Rights Reserved, Copyright (C) 2016-2016 Nobumichi Harasawa.