データベーススペシャリスト 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が複数の属性から構成される場合は、{}でくくること。模範解答
候補キー:{書籍作品ID, 著者ID}
部分関数従属性の有無:あり
部分関数従:
・書籍作品ID → タイトル
・著者ID → 著者名
推移的関数従属性の有無:あり
推移的関数従:
{書籍作品ID, 著者ID } → 著者役割コード → 著者役割名
解説
解答の論理構成
- 属性列挙と意味の確認
「図2」の“書籍作品”は
書籍作品ID / タイトル / 著者ID / 著者名 / 著者役割コード / 著者役割名
で構成される。 - 業務規約による一意性の読み取り
【問題文】「書籍作品には1人又は複数の著者が存在し、著者ごとに、主要な著者役割が一つ定められている。」
→ 作品と著者の組が一意であり、著者役割はその結果として決まる。 - 候補キーの決定
作品単体では著者が一意にならず、著者単体でも作品が一意にならない。よって {書籍作品ID, 著者ID} が候補キー。 - 部分関数従属性の判定
- 書籍作品ID → タイトル(作品固有)
- 著者ID → 著者名(著者固有)
どちらもキーの一部だけで決まるため“あり”。
- 推移的関数従属性の判定
- {書籍作品ID, 著者ID} → 著者役割コード(キー全体で決定)
- 著者役割コード → 著者役割名(コードに依存)
したがって {書籍作品ID, 著者ID} → 著者役割コード → 著者役割名 が推移的関数従。“あり”。
誤りやすいポイント
- 「著者役割コードも候補キーに含める」と誤解する
→ 規約で“著者ごとに主要な役割は一つ”と明示。 - 著者名やタイトルの同名問題の読み落とし
→ 【表1】「異なる書籍作品のタイトルが同名である場合がある。」などにより、識別子は ID属性 である点を再確認。 - 部分関数従と推移的関数従を混同する
→ キーの“部分”か“非キー経由”かを整理してメモすると防げる。
FAQ
Q: 著者役割コードを候補キーに入れてはいけない決定的な根拠は?
A: 業務規約に「著者ごとに、主要な著者役割が一つ」とあるため、役割コードはキーに依存する属性であり、キーそのものではありません。
A: 業務規約に「著者ごとに、主要な著者役割が一つ」とあるため、役割コードはキーに依存する属性であり、キーそのものではありません。
Q: 著者ID → 著者役割コード の従属性は存在しないのか?
A: 複数作品で同じ著者が異なる役割を持つ場合があるため、著者ID単独では役割コードを一意に決定できません。したがって従属性は成立しません。
A: 複数作品で同じ著者が異なる役割を持つ場合があるため、著者ID単独では役割コードを一意に決定できません。したがって従属性は成立しません。
Q: 第三正規形にするにはどう分割すべき?
A: “書籍作品”を
A: “書籍作品”を
- 作品‐著者(書籍作品ID, 著者ID, 著者役割コード)
- 作品(書籍作品ID, タイトル)
- 著者(著者ID, 著者名)
- 著者役割(著者役割コード、著者役割名)
に正規化すれば、部分・推移的従属性とも排除できます。
関連キーワード: 関数従属性、正規化、候補キー、部分関数従、推移的関数従
(2)関係 “書籍作品” は、第1正規形、第2正規形、第3正規形のうち、どこまで正規化されているか答えよ。 また、第3正規形でない場合は、第3正規形に分解し、主キー及び外部キーを明記した関係スキーマを示せ。
模範解答
正規形:第1正規形
関係スキーマ:
著者(著者ID、著者名)
著者役割(著者役割コード、著者役割名)
書籍作品(書籍作品ID、タイトル)
書籍作品著者(著者ID、書籍作品ID、著者役割コード)
解説
解答の導き方
結論:図2の関係「書籍作品」は第1正規形です。以下はその理由と第3正規形への分解手順を段階的に示します。
-
属性と図2の確認
図2の関係スキーマを見ると、関係「書籍作品」の属性は「書籍作品ID、タイトル、著者ID、著者名、著者役割コード、著者役割名」となっています。これを出発点に考えます。 -
候補キー(主キー)の決定根拠
- 問題文に「書籍作品には1人又は複数の著者が存在し、著者ごとに、 主要な著者役割が一つ定められている。」とあるため、同じ書籍作品IDに対して著者IDが複数存在する可能性があります。したがって、書籍作品IDだけでは行(一意のタプル)を識別できません。
- また、表中の説明に「タイトル 書籍作品のタイトル。異なる書籍作品のタイトルが同名である場合がある。」とあるので、タイトルだけでも一意になりません。さらに「著者名 著者の氏名。同姓同名の著者が存在する。」ともあるため、著者名単独でも一意になりません。
以上より、行を一意に識別するには書籍作品IDと 著者IDの組合せが必要であり、候補キー(主キー)は (書籍作品ID, 著者ID) となります。
- 関数従属性(FD: functional dependencies)の導出
図2と本文の記述から導かれる主要な従属性を明示します(簡潔化のため「→」で表記します)。
- 書籍作品ID → タイトル
(書籍作品IDがその作品のタイトルを決めます) - 著者ID → 著者名
(著者IDが著者名を決めます) - 著者役割コード → 著者役割名
(コードが役割名を決めます) - (書籍作品ID, 著者ID) → 著者役割コード
(各作品の各著者に対して主要な著者役割が一つ定まるため)
- 正規形の判定手順
- 第1正規形(1NF): 属性は原子的であり、図2の定義は行と列の表形式で表現されているため1NFは満たします。
- 第2正規形(2NF)の判定: 2NFは「主キーが複合キーの場合、非キー属性がキーの一部にのみ依存してはならない」という条件です。ここで主キーは (書籍作品ID, 著者ID) ですから、非キー属性がキーの一部にのみ依存しているかを調べます。
- タイトル は 書籍作品IDのみで決まる(書籍作品ID → タイトル)ので、キーの一部(書籍作品ID)への部分従属です。
- 著者名 は 著者IDのみで決まる(著者ID → 著者名)なので、キーの一部(著者ID)への部分従属です。
これらにより部分従属が存在するため、2NFを満たしません。従って3NFを判定する前に2NFを満たしていないため、現状は第1正規形にとどまります。
- 第3正規形(3NF)の観点でも問題があります。例えば (書籍作品ID, 著者ID) → 著者役割コード と 著者役割コード → 著者役割名 の連鎖により、(書籍作品ID, 著者ID) → 著者役割名 という推移的従属が生じます。これにより3NFの条件(非キー属性が他の非キー属性を介して主キーに従属してはならない)も満たしません。
以上より、関係「書籍作品」は第1正規形です。
- 第3正規形への分解(主キー・外部キーを明記) 第3正規形に分解する標準的な方法として、部分従属と推移的従属を除去するために属性を分割します。妥当な分解例は以下のとおりです(主キーはPK、外部キーはFKと明記します)。
-
著者(主キー: 著者ID)
属性: 著者ID(PK)、著者名
説明: 著者ID → 著者名 を満たします。 -
著者役割(主キー: 著者役割コード)
属性: 著者役割コード(PK)、著者役割名
説明: 著者役割コード → 著者役割名 を保持します。 -
書籍作品(主キー: 書籍作品ID)
属性: 書籍作品ID(PK)、タイトル
説明: 書籍作品ID → タイトル を保持します。 -
書籍作品著者(主キー: 書籍作品ID, 著者ID)
属性: 書籍作品ID(PKの一部, FK → 書籍作品.書籍作品ID)、著者ID(PKの一部, FK → 著者.著者ID)、著者役割コード(FK → 著者役割.著者役割コード)
説明: 各作品と著者の組合せごとに一行を持ち、著者の役割コードはこの組合せで一意に定まるためここに保持します。
この分解により、部分従属(タイトル や 著者名 がキーの一部にのみ依存する)はそれぞれ別の関係に移され、推移的従属(著者役割名 が 著者役割コード を介して依存する)も解消されます。各関係は非キー属性がその関係の主キーに対して完全関数従属しており、また非キー属性同士の推移的従属は存在しないため、第3正規形にあります。
誤りやすいポイント
-
主キーに「著者役割コード」を含めてしまう誤り
→ 「(書籍作品ID, 著者ID)」が既にタプルを一意に識別するため、著者役割コードはその結果で決まる非キー属性です。著者に対して1つの役割しか定まらないという前提があるため、役割コードを主キーに含める必要はありません。 -
「複数著者だから1NF違反」と考える誤り
→ 複数著者は行が複数存在することで表現されるため、必ずしも複数値属性や非原子的属性を意味しません。正しくは複合主キーや別の関連テーブルで扱います。 -
タイトルや著者名を主キー扱いする誤り
→ 問題文に「異なる書籍作品のタイトルが同名である場合がある」「同姓同名の著者が存在する」とあるため、これらは一意性で主キーにできません。ID属性を使う必要があります。 -
分解後に外部キーを明示しない誤り
→ 正規化の目的は冗長の排除だけでなく、整合性を保つためにFKを明確にすることも重要です。設計時にFKを明示してください。
FAQ
Q: 「著者役割コード」を書籍作品著者の主キーに入れてしまうと何が悪いですか?
A: 入れると重複が増える可能性や設計上の冗長が生じます。問題文は「著者ごとに、主要な著者役割が一つ定められている」と明記しており、著者役割コードは (書籍作品ID, 著者ID) によって一意に決まる非キー属性です。主キーに含めなくても一意性は保てるため、含める必要はありません。
A: 入れると重複が増える可能性や設計上の冗長が生じます。問題文は「著者ごとに、主要な著者役割が一つ定められている」と明記しており、著者役割コードは (書籍作品ID, 著者ID) によって一意に決まる非キー属性です。主キーに含めなくても一意性は保てるため、含める必要はありません。
Q: どうして「複数の著者」があっても第1正規形として扱えるのですか?
A: 第1正規形は属性値が原子的(スカラー)であることを要求します。複数著者は同一書籍に対して複数行(別レコード)で表現すればよく、各セルは単一の著者IDを持つため原子的であり1NFを満たします。
A: 第1正規形は属性値が原子的(スカラー)であることを要求します。複数著者は同一書籍に対して複数行(別レコード)で表現すればよく、各セルは単一の著者IDを持つため原子的であり1NFを満たします。
Q: この分解はさらにBCNFにすべきですか?
A: 分解後の各関係がすべての関数従属性で左辺が超キーになっていればBCNFになります。提示した分解は通常の教科書的な3NFを満たし、業務要件や追加の従属性がなければ実用的です。もし追加の従属性が存在するならさらにBCNFを検討します。
A: 分解後の各関係がすべての関数従属性で左辺が超キーになっていればBCNFになります。提示した分解は通常の教科書的な3NFを満たし、業務要件や追加の従属性がなければ実用的です。もし追加の従属性が存在するならさらにBCNFを検討します。
関連キーワード: 関数従属性、部分従属、推移的従属、合成主キー、第3正規形
(1)図2中の(a)〜(d)に入れる適切な属性名を答えよ。また、主キー又は外部キーを構成する属性の場合、主キーを表す実線の下線、又は外部キーを表す破線の下線を付けること。
模範解答
a:会員ID
b:上位カテゴリコード
c:販売価格
d:出品会員会員ID
解説
解答の論理構成
- 出品会員評価
【問題文】「会員は…出品会員を評価…会員ごと出品会員ごとに最新の評価だけを記録」。
⇒ 主キーは(評価する側、評価される側)。表中で後者は既に “出品会員会員ID” が存在。残る (a) は評価者の 会員ID。 - カテゴリ
【問題文】「カテゴリは階層構造…'データベース' の上位カテゴリが ‘情報技術’」。
⇒ 同一テーブル内で親カテゴリを指す外部キーが必要。図2の (b) 部分はその役割なので 上位カテゴリコード。 - 販売書籍
【問題文】新品・中古いずれも「販売価格」を持つ。図2 “販売書籍” は両者の共通項を格納するスーパタイプ。
⇒ 共通属性として最も重要な金額項目 (c) は 販売価格。 - 中古書籍
【問題文】「出品会員が…中古書籍を出品…」ゆえに誰が出品したかを保存する必要がある。
図2 “中古書籍” には商品番号PKがあり、出品者を示す (d) が欠けている。
⇒ 出品会員会員ID(“出品会員” のPKを参照)が最適。
誤りやすいポイント
- カテゴリ階層を別テーブルで実装すると誤解し、(b) を “カテゴリ階層ID” などと書く。
- “販売書籍” に実在庫数や品質ランクを書いてしまい、共通属性という設計意図を見落とす。
- “中古書籍” に出品者を示すカラムが要ることは気付くが、名称を “会員ID” としてしまい出品者と購入者を混同。
- 主キー・外部キーの下線種別を逆に付ける。
FAQ
Q: “カテゴリ” の主キーは「カテゴリコード」だけで良いのですか?
A: はい。【表1】で「カテゴリを一意に識別するコード」と明示されているので単一キーです。自己参照用の 上位カテゴリコード は外部キー扱いとなります。
A: はい。【表1】で「カテゴリを一意に識別するコード」と明示されているので単一キーです。自己参照用の 上位カテゴリコード は外部キー扱いとなります。
Q: “出品会員評価” に評価日時が無くても最新だけ保持できるの?
A: 最新のみを保持する方針なので履歴は残さず、行の上書きで運用します。キーが (評価者、出品者) であれば時系列情報を別属性に持たなくても常に最新状態です。
A: 最新のみを保持する方針なので履歴は残さず、行の上書きで運用します。キーが (評価者、出品者) であれば時系列情報を別属性に持たなくても常に最新状態です。
Q: “販売書籍” と “新品書籍/中古書籍” の分割は必須?
A: スーパタイプ/サブタイプの正規化で共通属性と個別属性を整理する典型設計です。将来、電子書籍等を拡張する際にも柔軟です。
A: スーパタイプ/サブタイプの正規化で共通属性と個別属性を整理する典型設計です。将来、電子書籍等を拡張する際にも柔軟です。
関連キーワード: 自己参照、スーパタイプ、サブタイプ、主キー、外部キー
(2)図1のエンティティタイプ間のリレーションシップを全て記入せよ。 ただし、エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。
なお、識別可能なサブタイプが存在する場合、他のエンティティタイプとのリレーションシップは、カーディナリティの違いを含めてスーパタイプ又はサブタイプのいずれか適切な方との間に記述せよ。 また、図に表示されていないエンティティタイプは考慮しなくてよい。
模範解答

解説
解答の論理構成
-
スーパタイプ/サブタイプの抽出
- 「販売書籍は、新品書籍、 中古書籍に分類される。」
⇒「販売書籍」をスーパタイプ、「新品書籍」「中古書籍」をサブタイプとして汎化―特化を設定。 - 「出品会員とは、 A社のECサイト上で中古書籍を販売できる会員である。」
⇒「会員」をスーパタイプ、「出品会員」をサブタイプとする汎化を設定。
- 「販売書籍は、新品書籍、 中古書籍に分類される。」
-
形態別書籍との関連
- 「新品書籍は、 形態別書籍ごとに…」
- 「中古書籍は、 1冊ごとに…」
⇒両サブタイプとも必ず一つの「形態別書籍」に属するので
形態別書籍 - 新品書籍
形態別書籍 - 中古書籍
の2本のリレーションシップを記述。
-
出品会員と中古書籍の関連
- 「出品会員が、 ECサイト上で中古書籍を出品するには…」
⇒中古書籍は必ず一人の出品会員が出品するため
出品会員 - 中古書籍 のリレーションシップを設定。
- 「出品会員が、 ECサイト上で中古書籍を出品するには…」
-
会員による評価
- 「会員は… 出品会員を評価できる。 会員による評価は、 会員ごと出品会員ごとに最新の評価だけを記録する。」
⇒評価は「会員」と「出品会員」の組で一意なので
会員 - 出品会員評価
出品会員 - 出品会員評価
の2本のリレーションシップが必要。
- 「会員は… 出品会員を評価できる。 会員による評価は、 会員ごと出品会員ごとに最新の評価だけを記録する。」
-
以上をまとめると、解答に入れるべきリレーションシップは次のとおり。
- 汎化1:会員 ⟶ 出品会員
- 汎化2:販売書籍 ⟶ 新品書籍
- 汎化3:販売書籍 ⟶ 中古書籍
- 通常リレーションシップ
・会員 - 出品会員評価
・出品会員 - 出品会員評価
・出品会員 - 中古書籍
・形態別書籍 - 新品書籍
・形態別書籍 - 中古書籍
誤りやすいポイント
- 「会員」と「出品会員」の関係を単なる1対1関係と誤認し、汎化を落とす。
- 「販売書籍」を介さずに「新品書籍」「中古書籍」を直接扱い、スーパタイプを設定し忘れる。
- 会員評価を「出品会員評価」単独エンティティと捉え、「会員」側のリレーションを欠落させる。
- 形態別書籍との関連を「販売書籍」スーパタイプにつなげ、サブタイプとのカーディナリティを誤って二重表現してしまう。
FAQ
Q: 「会員」と「出品会員」は1対1ですか、それとも1対多ですか?
A: 「出品会員とは…会員である」と明記されているため、出品会員は会員の部分集合です。1対1ではなく“サブタイプ”で表すのが正解です。
A: 「出品会員とは…会員である」と明記されているため、出品会員は会員の部分集合です。1対1ではなく“サブタイプ”で表すのが正解です。
Q: 「出品会員評価」は三者関係にした方が良いですか?
A: 本問は評価そのものを独立エンティティとし、評価者「会員」と被評価者「出品会員」の2本のリレーションで表現します。三者関係は不要です。
A: 本問は評価そのものを独立エンティティとし、評価者「会員」と被評価者「出品会員」の2本のリレーションで表現します。三者関係は不要です。
Q: 「形態別書籍」と「販売書籍」の直接リレーションを置かない理由は?
A: 「販売書籍」はサブタイプで具体化されるため、実体としては「新品書籍」「中古書籍」を介して形態別書籍と結び付ける方が構造が明確になります。
A: 「販売書籍」はサブタイプで具体化されるため、実体としては「新品書籍」「中古書籍」を介して形態別書籍と結び付ける方が構造が明確になります。
関連キーワード: サブタイプ, スーパタイプ, 汎化特化, カーディナリティ, エンティティ間リレーション
(3)表2中の(ア)、(イ)に入れる適切な更新処理の内容を、列名及び具体的な更新内容を含め、(ア)は30字以内、(イ)は55字以内で述べよ。
模範解答
ア:ステータス列の値を、'引当済'に更新する。
イ:・実在庫数列及び受注残数列の値を、出荷した数量を減算した値にそれぞれ更新する。
・実在庫数列の値を、出荷した数量を減算した値に更新し、受注残数列の値を、出荷した数量を減算した値に更新する。
解説
解答の論理構成
-
中古書籍のステータス遷移
- 【表1】「ステータス…中古書籍の登録時に『入荷待』、入荷時に『入荷済』、受注時に『引当済』、出荷時に『出荷済』」
- よって受注時(ア)は「'入荷済' → '引当済'」の更新が必要。
-
新品書籍の在庫と受注残
- 新品書籍には【表1】「実在庫数」「受注残数」が存在。
- 【表2】出荷業務で「出荷した販売書籍に該当する、“新品書籍” テーブルの行の(イ)」と指示。
- 出荷が完了した数量は物理在庫・受注残の両方から差し引く必要がある。
- したがって(イ)は「実在庫数列及び受注残数列を出荷数分だけ減算」になる。
誤りやすいポイント
- 「受注時に在庫は減らさない」ことを忘れ、(ア)で在庫列を更新してしまう。
- 新品書籍の「受注残数」を出荷時に減算し忘れる。
- ステータスに存在しない値(例:発送準備中)を勝手に考案して記述する。
FAQ
Q: 受注時に新品書籍の実在庫数を減らさないのはなぜですか?
A: 受注時点ではまだ物理的な出荷が確定しておらず、欠品補充やキャンセルが発生する可能性があるため、実在庫は出荷確定時に調整します。その代わり「受注残数」で引当てを管理します。
A: 受注時点ではまだ物理的な出荷が確定しておらず、欠品補充やキャンセルが発生する可能性があるため、実在庫は出荷確定時に調整します。その代わり「受注残数」で引当てを管理します。
Q: 中古書籍は常に数量1なのに受注残数を持たないのですか?
A: はい。【表1】で「中古書籍の数量は常に1」と定義されており、個別在庫管理なので残数列を持つ必要がありません。ステータスで管理します。
A: はい。【表1】で「中古書籍の数量は常に1」と定義されており、個別在庫管理なので残数列を持つ必要がありません。ステータスで管理します。
Q: 『受注制限フラグ』は出荷時の更新対象ですか?
A: いいえ。『受注制限フラグ』は出版社事情などにより受注可否を制御するためのもので、出荷処理では更新しません。
A: いいえ。『受注制限フラグ』は出版社事情などにより受注可否を制御するためのもので、出荷処理では更新しません。
関連キーワード: 在庫管理、ステータス遷移、受注残、引当、トランザクション
設問3:関係 “出荷”、“出荷明細” について、(1)、(2)に答えよ。
問題文を見る(1)図2中の関係 “出荷”、“出荷明細” には、出荷業務の業務内容を実現できない不具合が二つある。不具合によって実現できない二つの業務内容を、それぞれ35字以内で述べよ。
模範解答
①:同一会員の複数回の注文を一つにまとめて出荷すること
②:同一会員の新品書籍の複数冊の注文を複数回に分割して出荷すること
解説
解答の論理構成
- 要求の確認
出荷業務には次の2要求があります。
・“出荷時点で同一会員から複数回の注文があった場合、一つにまとめて出荷する。”(〔業務の概要〕4.(2))
・“出荷時点で出荷対象の新品書籍の在庫が不足していた場合、実在庫数分だけ出荷し、残りは入荷後に出荷する。”(〔業務の概要〕4.(3)) - 現行スキーマの制約
“出荷” の主キーは “出荷番号”、外部キーとして “注文番号” を保持しており
出荷(出荷番号、注文番号、出荷日時)
となっています。これでは「出荷1件=注文1件」となり、複数注文の統合が不可能です。
さらに “出荷明細” は
出荷明細(出荷番号、商品番号)
であり、数量を保持しないため、同じ “商品番号” を複数行にしても何冊出荷したのか、残数はいくつかを表現できません。 - 不具合との対応付け
・複数注文統合不可 ⇒ 要求4.(2)を満たせない。
・数量分割不可 ⇒ 要求4.(3)を満たせない。
したがって模範解答の2項目に至ります。
誤りやすいポイント
- 「注文番号を持たせればどの注文か分かるから統合できる」と早合点する。実際は1対1制約が生じる点を見落としやすいです。
- 出荷明細に数量列がないことを「中古書籍は必ず1冊」の仕様だけで納得し、新品書籍の複数冊注文を失念する。
- “在庫不足で分割出荷” 要求を「出荷テーブルを複数行にすれば良い」と思い込み、出荷明細と注文明細の整合性を検討しない。
FAQ
Q: 出荷テーブルを注文番号なしにすれば統合出荷は可能ですか?
A: 可能ですが、どの注文をどの出荷で処理したか追跡できなくなるため、多対多連関用の橋渡しテーブル(出荷–注文対応表)が必要です。
A: 可能ですが、どの注文をどの出荷で処理したか追跡できなくなるため、多対多連関用の橋渡しテーブル(出荷–注文対応表)が必要です。
Q: 数量列を追加するだけで分割出荷は実現できますか?
A: 分割出荷では「何冊出荷済みか/残り何冊か」を管理するため、数量列に加え、出荷明細と注文明細の対応関係(注文明細番号など)を保持すると実装が容易になります。
A: 分割出荷では「何冊出荷済みか/残り何冊か」を管理するため、数量列に加え、出荷明細と注文明細の対応関係(注文明細番号など)を保持すると実装が容易になります。
関連キーワード: 正規化、多対多関係、外部キー制約、在庫管理、明細テーブル
設問3:関係 “出荷”、“出荷明細” について、(1)、(2)に答えよ。
問題文を見る(2)(1)の二つの不具合を解消した関係 “出荷”、“出荷明細” の関係スキーマを示せ。
なお、関係スキーマは、第3正規形の条件を満たし、主キー及び外部キーを明記すること。 また、主キーを構成する属性の属性名は、図2中の属性名を用いること。
模範解答
出荷(出荷番号、出荷日時)
出荷明細(出荷番号、商品番号、注文番号、出荷数)
解説
解答の導き方
まず図2を確認すると、出荷は「出荷(出荷番号、注文番号、出荷日時)」、出荷明細は「出荷明細(出荷番号、商品番号)」となっています。一方、業務要件から次の点が読み取れます。
- 「出荷業務 (2)」に「出荷時点で同一会員から複数回の注文があった場合、一つにまとめて出荷する」とあるため、1つの出荷が複数の注文を含む可能性があります。
- 「出荷業務 (3)」に「出荷対象の新品書籍の在庫が不足していた場合、実在庫数分だけ出荷し、残りは入荷後に出荷する」とあるため、1つの注文が複数回に分けて出荷される(1つの注文が複数の出荷に分割される)可能性があります。
これらから、出荷と注文の関係は「多対多(出荷 ⇔ 注文)」であると判断できます。つまり、設計上は出荷と注文の間に中間(関連)を表す構造が必要です。
図2のままでは次の2点の不具合が生じます。
- 出荷に「注文番号」を持たせていると、出荷は1つの注文しか参照できず、業務要件の「複数注文をまとめて出荷する」や「注文を分割出荷する」を表現できません。
- 出荷明細に「注文番号」がないと、出荷した各商品がどの注文のどの注文明細に対応するかを識別できません。特に「同一会員からの複数回の注文に、同じ新品書籍が含まれる場合がある」ため、出荷内で同じ商品番号が複数の注文に対応することがあり得ます。出荷明細の主キーが (出荷番号, 商品番号) のままだと、同一出荷・同一商品が複数注文分あっても区別できず、情報欠落や整合性破壊が生じます。
以上を踏まえ、不具合を解消するために取る設計方針は次のとおりです。
- 出荷テーブルから「注文番号」を取り除き、出荷は出荷単位(出荷番号)と出荷日時だけを持つようにする。これにより1つの出荷が複数の注文と紐づけられるようにする。
- 出荷明細は「出荷番号」「注文番号」「商品番号」をキー化し、さらに「出荷数」を保持して、どの出荷でどの注文のどの商品を何個出荷したかを記録できるようにする。こうすると部分出荷(注文の一部を先に出荷し、残りを後で出荷)や、複数注文のまとめ出荷を正しく表現できます。
- 出荷明細は行レベルで注文明細と整合を取る必要があるため、(注文番号, 商品番号) を注文明細(注文の行)への外部キーとして設定する。
これらを明確にすると、求める関係スキーマは次のようになります(属性名は図2と同一):
出荷(出荷番号、出荷日時)
主キー:出荷番号
主キー:出荷番号
出荷明細(出荷番号、注文番号、商品番号、出荷数)
主キー:出荷番号、注文番号、商品番号
外部キー:出荷番号 → 出荷(出荷番号)
(注文番号、商品番号) → 注文明細(注文番号、商品番号)
主キー:出荷番号、注文番号、商品番号
外部キー:出荷番号 → 出荷(出荷番号)
(注文番号、商品番号) → 注文明細(注文番号、商品番号)
正規化の観点では、上記で各関係が第3正規形を満たすことを確認します。第2正規形の要点は「複合主キーが存在する場合に非キー属性が主キーの一部にのみ依存していないこと」であり、第3正規形は「非キー属性が主キーに対して推移的従属していないこと」です。今回、
- 出荷:主キーは出荷番号で、非キー属性出荷日時は出荷番号に直接従属しており、推移的依存はありません。
- 出荷明細:主キーは(出荷番号、注文番号、商品番号)で、非キー属性出荷数はその全体に対して意味を持ち(どの出荷でどの注文のどの商品を何個出荷したか)、主キーの一部にのみ依存するような不適切な設計にはしていないため第2NFも満たします。非キー属性間の推移的依存も存在しないため第3NFを満たします。
以上が、図2の二つの不具合を解消して第3正規形を満たすスキーマ設計の導き方です。
誤りやすいポイント
- 出荷に「注文番号」を残したままにする(これだと1出荷=1注文しか表現できず、まとめ出荷・分割出荷を表現できません)。
- 出荷明細に「注文番号」を入れずに主キーを (出荷番号, 商品番号) にする(同一出荷内で同一商品が複数注文分ある場合に区別できません)。
- 出荷明細の外部キーを注文明細ではなく注文(注文番号 のみ)にだけ参照させる(行レベルの整合性が保てません)。行単位の整合性を取るには注文明細(注文番号、商品番号)を参照する必要があります。
- 正規化の用語を混同すること:「非キー属性が主キーに対して完全関数従属する」は第2正規形の要件、「非キー属性が主キーに対して推移的従属していない」は第3正規形の要件である点を誤って説明すると減点につながります。
FAQ
Q: 出荷明細の主キーは必ず「出荷番号、注文番号、商品番号」の三属性でなければなりませんか?
A: 図2中の属性名を使うという制約がある設問の下では、この三属性からなる複合主キーが自然です。実務的には出荷明細に行ID(サロゲートキー)を付け、別に出荷番号と注文明細を外部キーで持たせる設計も可能ですが、設問の制約に合わせるなら複合主キーで表すのが妥当です。
A: 図2中の属性名を使うという制約がある設問の下では、この三属性からなる複合主キーが自然です。実務的には出荷明細に行ID(サロゲートキー)を付け、別に出荷番号と注文明細を外部キーで持たせる設計も可能ですが、設問の制約に合わせるなら複合主キーで表すのが妥当です。
Q: 出荷と注文の対応を別テーブルで明示したほうがよいですか?
A: 設計的には「出荷注文(出荷番号、注文番号)」のような中間テーブルで出荷と注文を多対多で表し、出荷明細は出荷番号+商品情報で持つ構成も可能です。ただし行レベル(注文明細)との整合を保証するためには、出荷明細が注文明細(注文番号、商品番号)を参照する仕組みが必要になります。まとめて出荷する/分割出荷するという要件を満たす点を考慮して選択してください。
A: 設計的には「出荷注文(出荷番号、注文番号)」のような中間テーブルで出荷と注文を多対多で表し、出荷明細は出荷番号+商品情報で持つ構成も可能です。ただし行レベル(注文明細)との整合を保証するためには、出荷明細が注文明細(注文番号、商品番号)を参照する仕組みが必要になります。まとめて出荷する/分割出荷するという要件を満たす点を考慮して選択してください。
Q: 出荷数と注文明細の注文数の整合性はどのように保てばよいですか?
A: 出荷明細の合計出荷数が対応する注文明細の注文数を超えないようにアプリケーション側またはデータベーストリガ等でチェックします。スキーマだけでは制約表現が難しい場合があるため、業務ロジックで部分出荷や残数管理を実装します。
A: 出荷明細の合計出荷数が対応する注文明細の注文数を超えないようにアプリケーション側またはデータベーストリガ等でチェックします。スキーマだけでは制約表現が難しい場合があるため、業務ロジックで部分出荷や残数管理を実装します。
関連キーワード: 正規化、第2正規形、第3正規形、多対多関係、複合主キー、外部キー参照






