いぬぼきアプリ登場!詳しくはこちら

データベース設計

snack
snack

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

ボキタロー
ボキタロー

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

snack
snack

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

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

データ分析

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

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

snack
snack

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

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

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

データベースの設計

E-R図(実態関連図)

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

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

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

MEMO

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

データの正規化

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

次のような正規化されていないテーブルで考えてみましょう。

注文番号顧客名商品名値段市区町村郵便番号
001たろうりんご,バナナ100,150板橋区123-4567
注文表

第1正規形(1つの列に単一の情報)

繰り返しをなくして、各セルを単一の値にします。今の表では、「商品名」と「値段」の1つの列に2つの情報が入っているため、別の行に分けて繰り返しをなくします。

注文番号顧客名商品名値段市区町村郵便番号
001たろうりんご100円板橋区173-0001
001たろうバナナ150円板橋区173-0001
注文表

第2正規形(くり返しの情報を別にする)

今は、同じ注文番号「001」で「たろう」「板橋区」「173-0001」という情報が2行に出てきます。表を分けることによって、このムダを排除します(2つの表は「注文番号」で紐づけます)。

注文番号顧客名市区町村郵便番号
001たろう板橋区173-0001
注文表
注文番号商品名値段
001りんご100円
001バナナ150円
商品表
snack
snack

こうすることで、「たろう=板橋区=173-0001」の情報を1回だけ書けばよくなるっすね。これが第2正規形っす。

第3正規形(関係ない情報も分ける)

「板橋区=173-0001」というのは、市区町村と郵便番号の関係であって、注文そのもの(注文番号)とは直接関係ありません。しかも、市町村が分かれば郵便番号も自動的に決まります。よって、冗長性を排除するためにその情報も別の表に分けます(2つの表は「市区町村」で紐づけます)。

注文番号顧客名市区町村
001たろう板橋区
注文表
注文番号商品名値段
001りんご100円
001バナナ150円
商品表
市区町村郵便番号
板橋区173-0001
郵便番号表
MEMO

ITパスポート試験では正規化の細かいところまでは聞かれないので、あくまでもざっくりとしたイメージで説明しましたが、問題では「どの項目で表同士を紐づけることができるか」ということを考えて表を分割すれば大丈夫です。

確認○×問題

問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正規形(1つの列に単一の情報)】

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

【第2正規形(くり返しの情報を別にする)】

同じ「店舗コード」で「店舗名」が複数表出てくる(「001」で「札幌」が、「002」で「東京」がそれぞれ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正規形(1つの列に単一の情報)】

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

【第2正規形(くり返しの情報を別にする)】

同じ「受注番号」で複数の行に同一の情報がない(主キーが単一)のため、この作業は不要です。

【第3正規形(関係ない情報も分ける)】

「商品番号=商品名=単価」という関係は、注文そのものとは直接関係ありません。したがって、これも別の表に分けます。

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

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

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