オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【DBスペシャリスト】非正規形から第3正規形までの正規化の練習

本記事では、非正規形から第3正規形までの正規化について記載します。

非正規形→第1正規形→第2正規形→第3正規形

第3正規形までの正規化については、以下記事でも案内しているので、あわせてご参照ください。
auroralights.jp


非正規形について

非正規形の定義は以下の通りです。

<非正規形の定義>
リレーションRの属性の中に、単一でない値が含まれている

以下画像では、商品コード、商品名、単価、数量、小計が単一値でなく繰り返し項目になっています。
単一値になっていないため、第1正規形と判断できます。

非正規形

非正規形は、1枚の伝票をテーブルの1行にしたと考えるとわかりやすいです。以下の伝票イメージでは、1枚の伝票で商品コード、商品名、単価、数量、小計が繰り返し項目になっていることが分かります。

伝票イメージ


第1正規形について

第1正規形の定義は以下の通りです。

<第1正規形の定義>
リレーションRの全属性が単一値である

つまり、非正規形から第1正規形への正規化は、繰り返し項目をなくし、全属性を単一値にします。

非正規形から第1正規形


第2正規形について

第2正規形の定義は以下の通りです。

<第2正規形の定義>
リレーションRが次の2条件を満たすこと。
 ①第1正規形であること (全属性が単一値である)
 ②すべての非キー属性は、いかなる候補キーにも部分関数従属していないこと (完全関数従属であること)

第2正規形は非キー属性が候補キーに完全関数従属している、言い換えると、非キー属性がいかなる候補キーにも部分関数従属していない形になっています。

『非キー属性がいかなる候補キーにも部分関数従属していない』は、候補キーの一部から非キー属性が決定できない状態です。


第1正規形で候補キーの一部が非キー属性を決定している部分関数従属があるかどうかを確認します。

第1正規形

<部分関数従属>
1.伝票No → 店舗CD,店舗名,店舗,住所,売上日,合計,消費税,請求書,担当者ID,担当者名
2.商品コード → 商品名,単価,数量,小計

部分関数従属を排除するために、リレーションを分割します。
「1.」を売上ヘッダ、「2.」を商品というリレーションに分割します。

第1正規形から第2正規形への正規化


※今回の例では、主キーは伝票No,商品コードとしている。
 商品コードと商品名は1対1の関係であるので、{伝票No,商品名}は候補キーとなる。商品コード、商品名は候補キー同士なので分解しても、しなくても良いが、今回は分解して考える。

第3正規形について

第3正規形の定義は以下の通りです。

<第3正規形の定義>
リレーションRが次の2条件を満たすこと。
 ①第2正規形であること
 ②すべての非キー属性は、いかなる候補キーにも推移的関数従属していないこと
 ★導出項目も削除する

推移的関数従属とは、X→Y→Zが成立するが、Y→Xは成立しない状態です。
※ZはYの部分集合ではないことも条件です。

このとき、X → Zも成立します。ただし、Z → Xは成立しません。


以下画像の「売上ヘッダ」において、伝票No→店舗CD→店舗名、店舗住所、伝票No→担当者ID→担当者名が推移的関数従属しているので、リレーションを分割します。
また、小計、合計、消費税、請求額のような導出項目を取り除きます

第2正規形から第3正規形への正規化



以上、お読みいただきありがとうございました。

【DBスペシャリスト】スーパータイプとサブタイプとは (汎化・特化の関係を表現する)

本記事では、汎化・特化の関係を表現するスーパータイプ、サブタイプをわかりやすく紹介します。


スーパータイプ・サブタイプについて

スーパータイプサブタイプは、汎化と特化の関係を表現したものです。
汎化した側のエンティティがスーパータイプ特化した側のエンティティがサブタイプになります。

そもそも汎化、特化とは

汎化とは、複数の具体的なエンティティ(子)から共通の抽象的なエンティティ(親)を導くことを言います。
(例:トラック、スーパーカー、一般車→車)
特化とは、抽象的なエンティティ(親)から、より具体的なエンティティ(子)を派生させることを言います。
(例:車→トラック、スーパーカー、一般車)

排他的サブタイプと共存的サブタイプについて

サブタイプには、排他的サブタイプ共存的サブタイプがあります。

排他的サブタイプ

排他的サブタイプは、1件1件のデータが、複数のサブタイプのうち1つにしか属しません。
親エンティティはいずれか1つの子エンティティにしか属さず、子エンティティ同士は排他的で重複しません。

以下画像の場合は、従業員は正社員か契約社員のいずれか一方にしか属さない、排他的サブタイプを表しています。

排他的サブタイプの例

概念データモデル:排他的サブタイプ

排他的サブタイプの関係スキーマ
 スーパータイプ 従業員(従業員コード,従業員名,雇用区分)
 サブタイプ   正社員(従業員コード,従業員名,基本給,勤続年数)
 サブタイプ   契約社員(従業員コード,従業員名,時給,契約期間)

共存的サブタイプ

共存的サブタイプは、1件1件のデータが複数のサブタイプに属することが可能です。
親エンティティは複数の子エンティティに同時に属する可能性があり、子エンティティ同士は重複可能です。

以下画像の場合は、人物は学生、会社員のどちらか一方または両方に属することができる共存的サブタイプを表しています。

共存的サブタイプの例

概念データモデル:排他的サブタイプ


共存的サブタイプの関係スキーマ
スーパータイプ 人物(マイナンバー,氏名,学生区分,会社員区分)
サブタイプ   学生(マイナンバー,学校名,学年)
サブタイプ   会社員(マイナンバー,会社名,部署)

包含サブタイプについて

排他的サブタイプ共存的サブタイプとは異なる概念である『包含関係のサブタイプ』というものがあります。

包含とは、サブタイプがスーパータイプの一部として含まれている(部分集合)関係を指します。

包含サブタイプの例

スーパータイプ:商品
サブタイプ  :販売品
販売品は商品に含まれるが、商品には販売品以外のものがあります。

スーパータイプ、サブタイプのポイント

種類 特性 実装方法
排他的サブタイプ どれか1つにだけ所属できる 社員は、正社員契約社員のどちらか一方にしか所属できない 区分コード
共存的サブタイプ 複数に同時に所属できる 取引先は、仕入れ先得意先のどちらか一方または両方に所属できる フラグ
包含サブタイプ 部分集合関係 販売品は、商品の部分集合関係である 外部キー
赤文字:スーパータイプ青文字:サブタイプ


以上、お読みいただきありがとうございました。

【DBスペシャリスト】 ACID特性

基本情報技術者、応用情報技術者、データベーススペシャリストでよく出題される「ACID特性」を紹介します。

ACID特性とは

データベースのトランザクションが満たすべき4つの特性(原子性・一貫性・独立性・永続性)をまとめて『ACID特性』といいます。

原子性 (Atomicity:アトミシティ)

原子性は、トランザクション内の処理がすべて実行されるか、または全く実行されないことを保証する特性です。
トランザクションがCOMMITまたはROLLBACKのいずれかで終了し、途中で終わることがない特性です。

一貫性 (Consistency:コンシステンシー)

一貫性は、トランザクション処理の実行前、実行後でデータの整合性が保証される特性です。
整合性と表現されることもあります。

独立性 (Isolation:アイソレーション)

独立性は、トランザクションが同時に実行している他のトランザクションから影響を受けず、複数のトランザクションを並列に実行した場合、順番に実行した場合の結果が等しくなることを保証する特性です。
隔離性と表現されることもあります

耐久性 (Durability:デュラビリティ)

耐久性は、正常終了したトランザクションの結果について、その後障害が起こっても回復できることを保証する特性です。
永続性と表現されることもあります。

ACID特性を確保するための機能

ACID特性 特性を確保するための機能
原子性 コミットメント制御 (COMMIT、ROLLBACK)
一貫性 排他制御 / 同時実行制御
独立性 排他制御 / 同時実行制御
耐久性 障害回復 (トランザクションログ、バックアップ)

以上、お読みいただきありがとうございました。