データベース設計

snack
snack

前回はデータベース方式を勉強したっすが、膨大なデータをいきなりテーブルにしてデータベースを作るってことは難しいんすね。

ボキタロー
ボキタロー

たしかにそうだよね。ただデータを表にするだけだったら誰も苦労しないよ。

snack
snack

どういった目的で、だれが何のために、どのような情報をどう使うか、といったことなどを考えて設計しないと駄目なんすよ。

目標・データの分析・設計の考え方を理解する。
説明・データの分析・設計の必要性や,その基本的なプロセスを理解する。
データベース設計の概要

データ分析

データベースでは、単にデータ(情報)を保存するだけでなく、それらを効率的かつ有効に活用できることを目的としています。そのためには必要なデータを正確な形式で蓄積することが必要不可欠となります。

そこで、データの質を向上させるために、対象となる業務を分析したうえで、業務で使用するデータの洗出しと整理を行います。このプロセスにおいて、不正確、不完全、重複、または不適切なデータを特定して修正または削除する作業を行いますが、この作業のことをデータクレンジングと呼びます。

snack
snack

このプロセスを正確に行わないと、せっかく蓄積したデータを活用できないといった事態が起こるっすよ。

さらっと学習【インデックス】

DBMS(データベース管理システム)におけるインデックスとは、データ検索を高速化するためのデータ構造です。インデックスは本の索引のようなもので、大量のデータから目的の情報を素早く探し出すために使われます。インデックスがあると、DBMSはそのインデックスを使って該当するデータの場所を直接特定し、検索時間を短縮できます。

データベースの設計

E-R図(実態関連図)

データベース設計とは、情報を効率的かつ一貫性のある形で保存・管理・検索するために、データベースの構造を計画・設計するプロセスです。このプロセスにおいては、E-R図(実態関連図)を用いてデータ同士の関連性を整理します

E-R図は、データベース設計において実体(Entity:エンティティ)とその関係(Relationship:リレーションシップ)を視覚的に表現する図です。

エンティティは管理すべき「もの」や「概念」を表し、リレーションシップはエンティティ同士の関連を表します。また、リレーションシップは「1対1」、「1対多」、「多対多」の多重度をもちます。

MEMO

上の形式で書くか下の形式で書くかは問題によって異なります。

データの正規化

関係データベースにおける正規化は、データの冗長性(重複・ムダ)を排除し、データの整合性を保つための設計手法です。データを効率的に管理し、更新・検索時の矛盾を防ぐために使用されます。正規化には内容によって段階が存在します。

次のような正規化されていないテーブル(学生と履修科目の情報)で考えてみましょう。

学生ID学生名科目教員科目教員
1山田数学佐藤英語鈴木
2田中数学佐藤国語高橋

第1正規形

繰り返しの項目を排除し表の構造をシンプルにするため、すべての列が単一の値で構成されている状態にします。

学生ID学生名科目教員
1山田数学佐藤
1山田英語鈴木
2田中数学佐藤
2田中国語高橋
履修テーブル

第2正規形

複合主キーの一部にしか依存しない列を分離し、冗長性を排除します。このテーブルの主キーは学生IDと科目ですが、「学生名」は学生IDにだけ依存していて、科目には関係ありません。このような状態を部分関数従属といい、第2正規形では部分関数従属がない状態にします。

snack
snack

要するに、学生を特定するには学生IDだけあれば十分ということっす。なので、冗長性(ムダ)を排除するために学生情報を分離してやるっすよ。

学生ID学生名
1山田
2田中
学生テーブル
学生ID科目教員
1数学佐藤
1英語鈴木
2数学佐藤
2国語高橋
履修テーブル
MEMO

なお、「科目」は主キー(学生ID + 科目)全体に依存しているので、第2正規化においては分離の対象ではありません。

第3正規形

非キー属性(列)が他の非キー属性(列)に依存している状態を推移的関数従属といいます。

「教員」は「科目」に依存しているため、科目 →教員という推移的関数従属があります。第3正規形では、この推移的関数従属を排除します。

学生ID学生名
1山田
2田中
学生テーブル
科目教員
数学佐藤
英語鈴木
国語高橋
科目テーブル
学生ID科目
1数学
1英語
2数学
2国語
履修テーブル

確認○×問題

問1

データベース設計におけるデータ分析で行うこととしては、「必要なデータ項目を洗い出し、項目間の関連を整理する」といったことが挙げられる。

答え:〇

記述の通りです。

データベース設計の前段階として、データ分析を行います。データの質を向上させるために、業務で使用するデータの洗出しと整理を行い、不正確、不完全、重複、または不適切なデータを特定して修正または削除する作業を行います。この作業のことをデータクレンジングと呼びます。

問2

E-R図では、処理手順などのアルゴリズムを図で表記する。

答え:×

E-R図では、データベースの設計に当たって、データ間(エンティティ同士)の関係を表記します。なお、設問の文章はフローチャートの説明になります。

問3

[条件]①~④を全て満たすとき、出版社と著者と本の関係を示すE−R図は
出版社著者

となる。

[条件]
①出版社は、複数の著者と契約している。
②著者は、一つの出版社とだけ契約している。
③著者は、複数の本を書いている。
④1冊の本は、1人の著者が書いている。

ここで、E−R図の表記法は次のとおりとする。

[表記法]
ab

aとbが、1対多の関係であることを表す。

答え:×

[条件] ①と②から、出版社と著者の関係は「1対多」となり、これをE−R図で表記すると
出版社著者

となります。

また、[条件] ③と④から、著者と本の関係は「1対多」となり、これをE−R図で表記すると
著者

となります。

以上より、出版社と著者と本の関係を示すE−R図は

出版社著者

が適切な表記です。

問4

関係データベースを構築する際にデータの正規化を行う目的は、データに冗長性をもたせて、データ誤りを検出することにある。

答え:×

関係データベースを構築する際にデータの正規化を行う目的は、データの矛盾や重複を排除して、データの維持管理を容易にすることにあります。むしろ、データの冗長性を排除することが目的なので、設問の記述は誤りです。

問5

関係データベースで管理された”会員管理”表を正規化して、”店舗”表、”会員種別”表及び”会員”表に分割した。このとき、”会員”表は次のようになる。ここで、表中の下線は主キーを表し、一人の会員が複数の店舗に登録した場合は、会員番号を店舗ごとに付与するものとする。

店舗コード会員コード会員名
“会員”表

答え:×

【第1正規化】

繰り返しの項目を排除し表の構造をシンプルにするため、すべての列が単一の値で構成されている状態にします。設問の会員管理表は繰り返しの項目がないため、この作業は不要です。

【第2正規化】

複合主キーの一部にしか依存しない列を分離し、冗長性を排除します。「店舗コード」がわかれば店舗名が特定できるため、「店舗コード」とそれに連なる「店舗名」を別表に分離します。

なお、設問中に「会員番号を店舗ごとに付与する」とあるため、「会員番号」のみでは会員名を特定することはできないので、これを分離することはできません。

店舗コード会員番号会員名会員種別コード会員種別名
0011試験花子02ゴールド
0012情報太郎02ゴールド
0021高度次郎03一般
0022午前桜子01プラチナ
0031午前桜子03一般
“会員”表
店舗コード店舗名
001札幌
002東京
003大阪
“店舗”表

【第3正規化】

キー属性が他の非キー属性に依存している状態を排除して更新時の整合性を保ちます。非主キーの「会員種別コード」が分かれば「会員種別名」が特定できるため、これを別表に分離します。

店舗コード会員番号会員名会員種別コード
0011試験花子02
0012情報太郎02
0021高度次郎03
0022午前桜子01
0031午前桜子03
“会員”表
店舗コード店舗コード
001札幌
002東京
003大阪
“店舗”表
会員種別コード会員種別名
01プラチナ
02ゴールド
03一般
“会員種別”表

以上より、”会員”表は次のようになります。

店舗コード会員コード会員名会員種別コード
“会員”表
MEMO

正規化で考えなくても、本問では店舗表と会員種別表が示されているので、これらを会員管理表から分離することで正解は導けると思います。

問6

一つの表で管理されていた受注データを、受注に関する情報と商品に関する情報に分割して、正規化を行った上で関係データベースの表で管理する。ここで、同一商品で単価が異なるときは商品番号も異なるものとする。また、発注者名には同姓同名はいないものとする。

このとき、正規化を行った結果の表の組合せは次のようになる。

答え:〇

【第1正規化】

繰り返しの項目を排除し表の構造をシンプルにするため、すべての列が単一の値で構成されている状態にします。設問の受注データ表は繰り返しの項目がないため、この作業は不要です。

【第2正規化】

複合キーの一部にしか依存しない列を分離し、冗長性を排除します。「受注番号」のみがわかればレコードを特定できる(一意に識別できる)ため、主キーは「受注番号」となります。主キーが単一のため、この作業は不要です。

【第3正規化】

キー属性が他の非キー属性に依存している状態を排除して更新時の整合性を保ちます。非主キーの「商品番号」が分かれば「商品名」と「単価」が特定できるため、これを別表に分離します。

受注番号発注者名商品番号個数
T0001試験花子M00015
T0002情報太郎M00023
T0003高度秋子M00012
商品番号商品名単価
M0001商品13,000
M0002商品24,000

以上より、正規化を行った結果の表の組合せは次のようになります。

受注番号発注者名商品番号個数
商品番号商品名単価