ホーム > データベーススペシャリスト試験 > 2015年
データベーススペシャリスト試験 2015年 午後1 問01
データベースの設計に関する次の記述を読んで, 設問1〜3に答えよ。
A社は,書籍の販売を主力事業とする会社である。 A社では現在, インターネット上で書籍を販売する ECサイトの開設を計画しており, システム部のB君がデータベースの設計を行っている。
〔書籍の概要〕
1.書籍
書籍は, 単行本 新書 文庫本など、 様々な書籍の形態で出版されている。
(1) 書籍作品とは、 書籍の形態にかかわらない作品そのものであり, 書籍のタイトルなどの属性をもつ。
(2) 形態別書籍とは, 書籍作品を様々な書籍の形態で出版したものであり,出版社名, ページ数などの属性をもつ。
(3) 書籍作品には 1 人又は複数の著者が存在し,著者ごとに, 主要な著者役割が一つ定められている。
(4) 著者役割とは,著者が著作に関わった際の役割である。 例えば, ‘著作者',*共著者','原著者', '翻訳者', '監修者' などである。
(5) カテゴリとは, 書籍作品の分類である。 カテゴリは階層構造となっており、例えば,情報技術” と “データベース’というカテゴリでは, 'データベース'の上位カテゴリが ‘情報技術” である。 書籍作品は,一つ又は複数のカテゴリに属する。
2.販売書籍
書籍のうち, A 社のECサイトで購入できる書籍を販売書籍と呼ぶ。 販売書籍は,新品書籍, 中古書籍に分類される。
(1) 新品書籍は, 形態別書籍ごとに, 販売価格, 実在庫数, 受注残数を記録する。
(2) 中古書籍は, 1冊ごとに,販売価格,品質ランク, 品質コメント, ステータスを記録する。
(3) 新品書籍が, 絶版, 重版待ち又は出版社の在庫僅少の場合は,実在庫数を上回る注文を受け付けない。 その他の場合は,実在庫数にかかわらず,注文を受け付ける。
〔会員の概要〕
A社のECサイトを利用して販売書籍を注文するためには,氏名,住所, メールアドレスなどの情報を登録して会員になる必要がある。
(1) 会員は、1回の注文で, 新品書籍・中古書籍にかかわらず、 複数種類の販売書籍を注文できる。 また, 新品書籍については,それぞれ複数冊注文できる。
(2) 出品会員とは, A 社の EC サイト上で中古書籍を販売できる会員である。 会員は、仮想店舗名などの情報を追加登録すれば, 出品会員になれる。
(3) 出品会員が, ECサイト上で中古書籍を出品するには、 販売価格, 品質ランク,品質コメントを登録し, 中古書籍の現物をA社宛てに送付する。
(4) 会員は,購入した中古書籍が, ECサイトに表示されていた品質ランク, 品質コメントどおりであったかなど, 出品会員を評価できる。 会員による評価は, 会員ごと出品会員ごとに最新の評価だけを記録する。
〔業務の概要〕
1.登録業務
書籍作品, 形態別書籍, 販売書籍の情報を登録する。
2.入荷業務
販売書籍の入荷を記録し, 所定の保管場所に格納する。
3.受注業務
ECサイトで会員からの注文を受け付け, 在庫の引当てを行う。 注文日時 注文した書籍のタイトルなどを記載した電子メールを、 会員宛てに送付する。
4.出荷業務
(1) 受注した販売書籍を保管場所から取り出し, 梱包して出荷する。 出荷日時,出荷した書籍のタイトルなどを記載した電子メールを、 会員宛てに送付する。
(2) 出荷時点で同一会員から複数回の注文があった場合,一つにまとめて出荷する。 同一会員からの複数回の注文に、 同じ新品書籍が含まれる場合がある。
(3) 出荷時点で出荷対象の新品書籍の在庫が不足していた場合、 実在庫数分だけ出荷し、残りは入荷後に出荷する。
〔データモデルの設計〕
B君は, 概念データモデル (図1) 及び関係スキーマ (図2) の設計を行った。


図2の関係スキーマの主な属性とその意味 制約を, 表1に示す。

〔データベースの更新処理〕
B君は,図2の関係スキーマをテーブルとして実装し, 入荷業務, 受注業務,出荷業務で行うデータベース更新処理を整理し, 表2にまとめた。

解答に当たっては, 巻頭の表記ルールに従うこと。
設問1(1):図2の関係 “書籍作品” について(1),(2)に答えよ。
関係 “書籍作品” の候補キーを全て答えよ。 また, 部分関数従属性, 推移的関数従属性の有無を, “あり” 又は “なし” で答えよ。 “あり” の場合は, その関数従属性の具体例を一つ, 次の表記法に従って示せ。

模範解答
候補キー:{書籍作品ID, 著者ID}
部分関数従属性の有無:あり
部分関数従:
・書籍作品ID → タイトル
・著者ID → 著者名
推移的関数従属性の有無:あり
推移的関数従:
{書籍作品ID, 著者ID } → 著者役割コード → 著者役割名
解説
キーワードと論点整理
- 関係スキーマ「書籍作品」の属性
書籍作品(書籍作品ID, タイトル, 著者ID, 著者名, 著者役割コード, 著者役割名) - 候補キー
1つの書籍作品に複数の著者が紐づくため,主キーとして「書籍作品ID」だけでは一意に行を特定できない - 関数従属性
- 部分関数従属性:複合キーの一部だけで決まる非キー属性
- 推移的関数従属性:キー→中間属性→さらに非キー属性
- 正規化の視点
- 2NF(第2正規形):複合キーの部分関数従属性を排除
- 3NF(第3正規形):推移的関数従属性を排除
解答の理由
1. 候補キーの判定
書籍作品テーブルの属性と業務記述より
問題文の記述
「(3) 書籍作品には 1 人又は複数の著者が存在し」
から,ある書籍作品IDに対して複数の著者ID が存在し得るため,
書籍作品ID 単独では行を一意に特定できません。
したがって,行を一意に識別するには
{書籍作品ID, 著者ID} の複合が必要です。
これが唯一の最小キーであり,候補キーとなります。
「(3) 書籍作品には 1 人又は複数の著者が存在し」
から,ある書籍作品IDに対して複数の著者ID が存在し得るため,
書籍作品ID 単独では行を一意に特定できません。
したがって,行を一意に識別するには
{書籍作品ID, 著者ID} の複合が必要です。
これが唯一の最小キーであり,候補キーとなります。
2. 部分関数従属性
複合キー {書籍作品ID, 著者ID} の一部だけで決まる属性を探します。
(ア) 書籍作品ID → タイトル
「(1) 書籍作品とは…タイトルなどの属性をもつ」
タイトルは書籍作品ID だけで決まるため,部分関数従属性があります。
「(1) 書籍作品とは…タイトルなどの属性をもつ」
タイトルは書籍作品ID だけで決まるため,部分関数従属性があります。
(イ) 著者ID → 著者名
「(3) 書籍作品には…著者ごとに…著者が存在」
著者名は著者ID だけで決まるため,部分関数従属性があります。
「(3) 書籍作品には…著者ごとに…著者が存在」
著者名は著者ID だけで決まるため,部分関数従属性があります。
表記法に従うと
・部分関数従属性:
・部分関数従属性:
- 書籍作品ID→タイトル
- 著者ID→著者名
3. 推移的関数従属性
複合キー→中間属性→さらに非キー属性の形を探します。
(ウ) 著者役割コード→著者役割名
「(4) 著者役割とは…, 例えば ‘著作者’, ‘翻訳者’ など」
著者役割名はコードで一意決定されるので,中間の著者役割コードを介して従属します。
「{書籍作品ID, 著者ID}→著者役割コード→著者役割名」
これが推移的関数従属性の具体例です。
「(4) 著者役割とは…, 例えば ‘著作者’, ‘翻訳者’ など」
著者役割名はコードで一意決定されるので,中間の著者役割コードを介して従属します。
「{書籍作品ID, 著者ID}→著者役割コード→著者役割名」
これが推移的関数従属性の具体例です。
誤りやすいポイント
-
候補キーを「書籍作品ID のみ」と答える
書籍作品ID が表すのは作品そのものですが,著者ごとの行があるため複合キーが必要です。 -
部分関数従属性を見落とす
「タイトルはキー全体で決まる」と誤認すると,2NF違反を見落とします。
書籍作品ID 単独でタイトルが決まる点を押さえましょう。 -
推移的関数従属性の表記法
「書籍作品ID→著者役割コード→著者役割名」と書いてしまうと,キー全体が中間に省略されます。
正しくは{書籍作品ID, 著者ID}→著者役割コード→著者役割名
です。
試験対策まとめ
- 関係スキーマのキー判定
→ エンティティとリレーションシップの関係性(多対多,1対多)を業務記述から読み取る - 正規化の段階
1NF:属性の原子性
2NF:複合キーの部分関数従属性の排除
3NF:推移的関数従属性の排除 - 関数従属性の表記ルール
- 部分関数従属性: 「属性1→属性2」
- 推移的関数従属性: 「{キー}→中間属性→非キー属性」
- 表記の際は複数属性を
{}
でまとめ,一意に定義される範囲を明示する
正規化とキーの理解はデータベース設計の基本です。問題文の制約や業務フローを参照し,属性間の依存関係を的確に把握しましょう。
設問1(2):図2の関係 “書籍作品” について(1),(2)に答えよ。
関係書籍作品” は, 第1正規形, 第2正規形, 第3正規形のうち、どこまで正規化されているか答えよ。 また, 第3正規形でない場合は,第3 正規形に分解し、主キー及び外部キーを明記した関係スキーマを示せ。
模範解答
正規形:第1正規形
関係スキーマ:
著者(著者ID, 著者名)
著者役割(著者役割コード, 著者役割名)
書籍作品(書籍作品ID, タイトル)
書籍作品著者(著者ID, 書籍作品ID, 著者役割コード)
解説
1.キーワード・論点整理
- 正規化(Normalization)
- 第1正規形(1NF)/第2正規形(2NF)/第3正規形(3NF)
- マルチバリュー属性(多値属性)と繰り返しグループ
- 関数従属性(Functional Dependency)
- 推移的従属性(Transitive Dependency)
- 分解(Decomposition)
- 主キー(Primary Key)/外部キー(Foreign Key)
2.なぜ「第1正規形」か
(1) 問題箇所の確認
問題文に示された関係スキーマ「書籍作品」は,図2より次の属性を持ちます。
一方,【書籍の概要】には次の記述があります。
“(3) 書籍作品には 1 人又は複数の著者が存在し, 著者ごとに, 主要な著者役割が一つ定められている。”
つまり,1つの書籍作品IDに対して「著者ID」「著者名」「著者役割コード」「著者役割名」が繰り返し現れることになります。
これは 多値属性(マルチバリュー属性) を平坦化した設計であり,第1正規形の要件を満たしていません。
これは 多値属性(マルチバリュー属性) を平坦化した設計であり,第1正規形の要件を満たしていません。
(2) 第1正規形の要件
- 「すべての属性が原子値(単一値)である」
- 「繰り返しグループ(同じ論理的集合に属する複数値)を持たない」
ここで,「書籍作品」テーブルにおける「著者関連属性」は
「同一作品に複数行で繰り返し登録される→著しく冗長」
という状態であり,1NF違反です。
「同一作品に複数行で繰り返し登録される→著しく冗長」
という状態であり,1NF違反です。
3.第3正規形への分解例
第1正規形→第3正規形への分解では,
(a) 繰り返し多値属性を独立テーブル化
(b) 属性間の推移的従属性を排除
(b) 属性間の推移的従属性を排除
を行います。
以下のように4つのリレーションに分解すると,第3正規形を満たします。
主キーは下線,外部キーは上表中に矢印で示しています。
この分解により、
- 書籍作品ごとの著者情報は「書籍作品著者」テーブルで管理
- 「著者名」「著者役割名」はそれぞれのマスタに一度だけ登録
され,完全に第3正規形となります。
4.受験者が誤りやすいポイント
-
第1正規形と第2正規形の混同
- 第2正規形は「部分関数従属性の排除」が要件だが,キーが単一属性の場合には自動的に満たす。
- 本例では「書籍作品ID」が単一キーなら2NF違反ではないが,そもそも多値属性の平坦化で1NF違反となる。
-
主キーの設定ミス
- 「書籍作品」関係をどうキー定義するかで違反内容が変わるため,図2の意図を正確に把握する必要がある。
-
推移的従属性の見落とし
- 「著者役割コード → 著者役割名」のように,非キー同士の従属性(推移的従属性)がある場合,3NF違反に該当する。
5.試験対策のまとめ
- 第1正規形:多値属性や繰り返しグループを排除し,すべての属性を原子値とする。
- 第2正規形:主キーが複合キーの場合,主キーの一部にだけ依存する属性(部分関数従属性)を排除する。
- 第3正規形:非キー属性同士の従属性(推移的従属性)を排除し,すべての非キー属性が主キーに直接従属するようにする。
- 実践ポイント:
- ER図やリレーションの属性リストから,キー・非キー属性を明確に書き出す。
- 関数従属性を洗い出し,「どの属性が何に依存しているか」を表形式で整理する。
- 分解後のリレーションは必ずキーと外部キーを明示し,情報の再結合(射影・結合)によるロスがないか確認する。
これらを意識して設問を読むと,「正規形判定」→「分解スキーマ作成」がスムーズになります。
頑張ってください!
頑張ってください!
設問2(1):図12及び表2について,(1)〜(3)に答えよ。
図 2 中の(a)〜(d)に入れる適切な属性名を答えよ。また、主キー又は外部キーを構成する属性の場合、主キーを表す実線の下線, 又は外部キーを表す破線の下線を付けること。
模範解答
a:会員ID
b:上位カテゴリーコード
c:販売価格
d:出品会員会員ID
解説
キーワード・論点整理
本問で埋めるべき空欄は,以下の2か所です。
解答の論理的説明
(ア) の理由
問題文の「表1 主な属性とその意味・制約」で,「ステータス」は以下のように定義されています。
ステータス:中古書籍の販売状態。中古書籍の登録時に「入荷待」、入荷時に「入荷済」、
受注時に「引当済」、出荷時に「出荷済」となる。
したがって,受注業務における中古書籍の更新処理では,該当行のステータス列の値を,“引当済” に更新することが空欄(ア)に対応します。
(イ) の理由
出荷業務に関して,問題文中の「入荷業務」「受注業務」「出荷業務で行うデータベース更新処理を整理し,表2にまとめた。」の記述と,出荷業務の要点から考えます。
- 受注時
- 新品書籍テーブルの「受注残数」を受注数量だけ加算(在庫を引当てたため)
- 出荷時
- 実際に会員に渡すため,新品書籍テーブルの:
- 「実在庫数」列の値を,出荷数量だけ減算
- 「受注残数」列の値を,出荷数量だけ減算
- 実際に会員に渡すため,新品書籍テーブルの:
この更新は,表2の出荷行にある空欄(イ)に該当します。
したがって,(イ) には実在庫数列および受注残数列を,出荷した数量を減算した値に更新するという処理内容を記述します。
したがって,(イ) には実在庫数列および受注残数列を,出荷した数量を減算した値に更新するという処理内容を記述します。
誤りやすいポイント
-
中古書籍のステータス更新タイミングの混同
- 「入荷時に『入荷済』」「受注時に『引当済』」「出荷時に『出荷済』」とステータスが変化することを整理しておかないと, 受注業務で『出荷済』と誤答しやすいです。
-
新品書籍での在庫管理項目の違い
- 「実在庫数」と「受注残数」は両方とも残数を表しますが,
- 受注時:受注残数を加算
- 出荷時:実在庫数と受注残数の両方を減算
と更新対象が異なる点に注意してください。
- 「実在庫数」と「受注残数」は両方とも残数を表しますが,
-
中古書籍の「ステータス」と「品質ランク/コメント」の混同
- 中古書籍テーブルには品質ランクや品質コメントもありますが,受注・出荷に関係するのはステータスのみです。
試験対策まとめ
-
中古書籍のステータス遷移は必須知識
「入荷待」→「入荷済」→「引当済」→「出荷済」の順に変化する。 -
新品書籍の在庫管理
- 入荷:実在庫数 += 入荷数量
- 受注:受注残数 += 受注数量
- 出荷:実在庫数 受注残数 それぞれ - 出荷数量
-
在庫引当(受注残数加算)と在庫実渡し(実在庫数減算)を区別し,
どの業務でどの項目を更新するかを正確に理解すること。
これらをおさえておくと,業務フローに対応したテーブル更新処理問題で落ち着いて解答できます。
設問2(2):図12及び表2について,(1)〜(3)に答えよ。
図1のエンティティタイプ間のリレーションシップを全て記入せよ。 ただし,エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。
なお,識別可能なサブタイプが存在する場合, 他のエンティティタイプとのリレーションシップは, カーディナリティの違いを含めてスーパタイプ又はサブタイプのいずれか適切な方との間に記述せよ。 また, 図に表示されていないエンティティタイプは考慮しなくてよい。
模範解答

解説
模範解答の核となるキーワード・論点
- 一般化(継承):
- 「会員」→「出品会員」
- 「販売書籍」→「新品書籍」/「中古書籍」
- 関係(リレーションシップ):
- 「会員」―「出品会員評価」―「出品会員」
- 「形態別書籍」―「新品書籍」
- 「形態別書籍」―「中古書籍」
- カーディナリティ(多対1、1対多など)
なぜその解答になるのか
-
一般化:会員 ⇔ 出品会員
問題文より「出品会員とは, A 社の EC サイト上で中古書籍を販売できる会員である。 会員は、仮想店舗名などの情報を追加登録すれば, 出品会員になれる。」
→ 出品会員は会員のサブタイプ(一般化/特化関係) -
関係:会員 ― 出品会員評価 ― 出品会員
問題文より「会員による評価は, 会員ごと出品会員ごとに最新の評価だけを記録する。」
→ 評価履歴を表す「出品会員評価」エンティティは、評価を行う会員と評価を受ける出品会員をつなぐ関連関係をもつ。 -
一般化:販売書籍 ⇔ 新品書籍/中古書籍
問題文より「販売書籍は, 新品書籍, 中古書籍に分類される。」
→ 販売書籍はスーパータイプ、新品書籍・中古書籍はそのサブタイプ -
関係:形態別書籍 ― 新品書籍/中古書籍
問題文より「新品書籍は, 形態別書籍ごとに…記録する。」
「中古書籍は, 1冊ごとに…記録する。」
→ 形態別書籍を元に、新品/中古それぞれが複数生成される(多対1の関係)
関係のまとめ(図1に記入するリレーションシップ例)
受験者が誤りやすいポイント
- 会員⇔出品会員を“関連”とする
→ 実際は「会員」を元に「出品会員」が一般化(継承)で表現される。 - 出品会員評価のつなぎ先
→ 「会員」と「出品会員」を両方つなぐリレーションエンティティである点を忘れやすい。 - 販売書籍/形態別書籍の役割混同
→ 「販売書籍」は新・中古の分類用スーパタイプ。「形態別書籍」は出版形態情報のエンティティで、別関係をもつ。 - カーディナリティの向き
→ 「形態別書籍 1:N 新品書籍」など、多対1の向きを正しく描くこと。
試験対策として覚えておくべきポイント
- 一般化/特化(スーパタイプ/サブタイプ)を見抜くキーワード
→ 「~できる」「~に分類される」など - 関係エンティティ(関連)の見極め
→ 多対多の解消や“最新の1件だけ”といった要件で登場 - カーディナリティの表記方法
→ 1:1、1:N、N:Mなどを正確に - 図にない属性/エンティティは考慮しない
- 問題文の「○○とは」「○○ごとに」「××場合は」といった要件表現をデータモデルに落とし込む練習
以上を意識して概念データモデルを描ければ、高得点が狙えます。
設問2(3):図12及び表2について,(1)〜(3)に答えよ。
表2中の(ア),(イ)に入れる適切な更新処理の内容を,列名及び具体的な更新内容を含め、(ア)は30字以内、(イ)は55字以内で述べよ。
模範解答
ア:ステータス列の値を,'引当済'に更新する。
イ:・実在庫数列及び受注残数列の値を,出荷した数量を減算した値にそれぞれ更新する。
・実在庫数列の値を,出荷した数量を減算した値に更新し,受注残数列の値を,出荷した数量を減算した値に更新する。
解説
キーワード・論点整理
- (ア)受注時の中古書籍の更新
- 対象テーブル:中古書籍
- 更新内容:ステータス列を「引当済」に変更
- (イ)出荷時の新品書籍の更新
- 対象テーブル:新品書籍
- 更新内容:
- 実在庫数列から出荷数量を減算
- 受注残数列から出荷数量を減算
解答に至る論理的説明
-
(ア)の根拠
問題文の「データベースの更新処理」表2【受注】欄には、・受注した販売書籍に該当する、“中古書籍” テーブルの行の ア。
とあり、さらに表1の「ステータス」の説明で、
中古書籍の登録時に「入荷待」、入荷時に「入荷済」、受注時に「引当済」、出荷時に「出荷済」となる。
とあることから、受注時に中古書籍のステータス列の値を『引当済』に更新する必要があります。 -
(イ)の根拠
同じく表2の【出荷】欄には、・出荷した販売書籍に該当する、“新品書籍” テーブルの行の イ。
とあり、問題文の入荷・受注・出荷のフローで新品書籍に関する更新は「在庫数(実在庫数)」「受注残数」の管理です。
また表1で、
実在庫数:新品書籍の在庫数量
受注残数:新品書籍の注文を受けて出荷していない数量
と定義されているため、出荷した数量だけ実在庫数列と受注残数列の両方から減算する必要があります。
誤りやすいポイント
- 中古書籍の更新と新品書籍の更新を混同
- 中古書籍はステータス列だけ、新品書籍は数量列だけを操作します。
- ステータスを「出荷済」にしてしまう誤り
- 「出荷時」に中古書籍は「出荷済」へ更新しますが、受注時は「引当済」が正解です。
- 受注残数のみ更新して実在庫数を忘れる誤り
- 出荷時には、実在庫数と受注残数の両方を減算します。
試験対策ポイント
- 業務フローと連動したステータス遷移を整理する
- 中古書籍:入荷待→入荷済→引当済→出荷済
- 数量管理列の役割を正確に把握する
- 実在庫数:物理在庫を管理
- 受注残数:既注文分で将来出荷予定の数量を管理
- 表2の穴埋めでは、「テーブル名」「列名」「更新内容」を順番に盛り込むことを意識する
- 解答文字数制限(30字/55字)を守りつつ、主語・述語を省略せずに正確に記述する
更新処理まとめ
設問3(1):関係 “出荷”, “出荷明細” について,(1),(2)に答えよ。
図2 中の関係 “出荷”, “出荷明細” には,出荷業務の業務内容を実現できない不具合が二つある。不具合によって実現できない二つの業務内容を、 それぞれ35字以内で述べよ。
模範解答
①:同一会員の複数回の注文を一つにまとめて出荷すること
②:同一会員の新品書籍の複数冊の注文を複数回に分割して出荷すること
解説
模範解答の論点整理
-
同一会員の複数回の注文を一つにまとめて出荷すること
→ 出荷業務(設問文):「出荷時点で同一会員から複数回の注文があった場合,一つにまとめて出荷する。」 -
同一会員の新品書籍の複数冊の注文を複数回に分割して出荷すること
→ 出荷業務(設問文):「出荷時点で出荷対象の新品書籍の在庫が不足していた場合,実在庫数分だけ出荷し,残りは入荷後に出荷する。」
これら2つの要件を満たせないのは,図2のリレーション “出荷”,“出荷明細” が持つ属性構成に不備があるためです。
論理的な解答の導出
1. 複数注文をまとめて出荷できない理由
-
出荷業務の要件
「出荷時点で同一会員から複数回の注文があった場合,一つにまとめて出荷すること」(問題文より引用) -
図2 の定義
-
問題点
- “出荷” テーブルは「注文番号」を1つしか持たず,1つの出荷レコードにつき1つの注文しか関連付けられない。
- よって,同一会員の異なる注文番号をまとめて1つの出荷レコードに登録できない。
2. 部分的に分割出荷できない理由
-
出荷業務の要件
「出荷時点で出荷対象の新品書籍の在庫が不足していた場合,実在庫数分だけ出荷し,残りは入荷後に出荷すること」(問題文より引用) -
図2 の定義
出荷明細に 注文番号 や 出荷数(数量) を持たず,単に「出荷した商品番号」を列挙するだけ -
問題点
- 出荷明細には「注文番号」「注文明細番号」「出荷数量」がないため,どの注文の何冊を部分的に出荷したか記録できない。
- したがって,一つの注文内での分割出荷や残数を管理できない。
受験者が誤りやすいポイント
試験対策として覚えておくべきポイント
-
N:M の関係を正しく設計する
- 「複数注文をまとめる」には,出荷と注文の間を中間テーブル(多対多)で設計する必要がある。
-
業務ルールに応じた属性設計
- 分割出荷や不完全出荷が必要な場合は,「出荷数量」「注文明細番号」「残数」などを必ず明細に持たせる。
-
リレーションシップだけでなく属性要件もチェック
- どのテーブルにどの業務キー(注文番号・数量など)が必要かを,要件定義から漏れなく拾い出す習慣を付ける。
-
設計演習で「部分出荷」「統合出荷」を扱う
- データモデルの授業や問題演習で,受注~出荷プロセスにおける「一括」「部分」「統合」出荷要件を必ず確認し,テーブル構造に落とし込む練習をしましょう。
設問3(2):関係 “出荷”, “出荷明細” について,(1),(2)に答えよ。
(1)の二つの不具合を解消した関係 “出荷”, “出荷明細” の関係スキーマを示せ。
なお,関係スキーマは,第 3 正規形の条件を満たし、 主キー及び外部キーを明記すること。 また, 主キーを構成する属性の属性名は、 図2中の属性名を用いること。
模範解答
出荷(出荷番号, 出荷日時)
出荷明細(出荷番号, 商品番号, 注文番号, 出荷数)
解説
主なキーワード・論点整理
-
出荷と注文の集約
問題文にあるように「同一会員から複数回の注文があった場合, 一つにまとめて出荷する。」
ため、一つの出荷(出荷番号)に対して複数の注文番号が対応し得る。 -
出荷明細に必要な属性
- 注文番号:どの注文分として出荷したかを明示
- 出荷数:電子メール送付や在庫更新などのため、各商品ごとの出荷数量を記録
-
正規化(第3正規形)
- 出荷日時は出荷単位(出荷番号)に対してのみ依存 →
出荷
リレーションへ - 値の冗長性・更新異常を防ぐため、注文番号・商品番号・出荷数は複合主キーの
出荷明細
リレーションへ分離
- 出荷日時は出荷単位(出荷番号)に対してのみ依存 →
解答に至る論理的説明
-
出荷と注文の関係
問題文:「同一会員から複数回の注文があった場合, 一つにまとめて出荷する。」
つまり、ある出荷番号に対して複数の注文番号が含まれ得る。一方で、出荷明細テーブル(元設計)には注文番号が存在せず、どの注文に対する出荷かを判別できない不具合がある。 -
出荷数量の記録
表2「出荷」処理欄では、・“出荷明細” テーブルに行を登録する。
とあるのみで、出荷数(何冊出荷したか)を記録するカラムが定義されていない。
特に新品書籍は一度に複数冊出荷される可能性があるため、出荷数が必須である。 -
第3正規形の観点
出荷日時
は出荷単位(出荷番号)に固有 →出荷
リレーション商品番号
・注文番号
・出荷数
は、出荷番号と商品を組み合わせた出荷行為 →出荷明細
リレーション- 部分関数従属や推移的関数従属がないように分離すると、第3正規形を満たす
正しい関係スキーマ
書き下し形式(属性順は一例)
出荷(〈出荷番号〉, 出荷日時)
出荷明細(〈出荷番号〉, 〈注文番号〉, 〈商品番号〉, 出荷数)
- 〈…〉は主キーを示す。
- 外部キー制約として、
- 出荷明細.出荷番号 → 出荷.出荷番号
- 出荷明細.注文番号 → 注文.注文番号
- 出荷明細.商品番号 → 販売書籍.商品番号
受験者が誤りやすいポイント
-
注文番号をどこに置くか
- 誤)出荷テーブルに「注文番号」を残す
→ 一つの出荷に複数注文がある場合、複数行に分割する必要があり冗長 - 正)出荷明細に注文番号を含め、複合キーで管理
- 誤)出荷テーブルに「注文番号」を残す
-
出荷数を忘れる
- 注文明細で「注文数」があるため「出荷数」も同様に必要
- 出荷数を出荷テーブルに置くと、複数商品の場合に分割が困難
-
正規化のレベル
- 「出荷日時」を出荷明細に入れてしまうと、同一出荷の各行で重複
- 第3正規形の観点から、繰り返しや部分従属を避ける
試験対策ポイント
-
集約(アグリゲーション)要件の読み取り
「まとめて出荷」など、実業務ルールからテーブル間の関連を設計する。 -
主キー/外部キーの役割を整理
- 主キー:行を一意に決める
- 外部キー:他テーブルの行を参照する
複合キーになる場合は、すべてのキー属性が関数従属を満たすか確認する。
-
正規化(3NF)
- 第1正規形:属性値の単純性
- 第2正規形:部分関数従属の排除
- 第3正規形:推移的関数従属の排除
関数従属を見つけたら、新たなリレーションに分割する癖をつける。
-
属性配置の判断
同じ事象(出荷、注文など)に属する属性を同じテーブルへ、異なる事象なら別テーブルへ配置。