データベーススペシャリスト 2009年 午後1 問02
データベースの設計に関する次の記述を読んで、設問1〜3に答えよ。
J社は、完成品を組み立てる製造業者に部品を供給する部品製造業者である。 J社では、生産管理のための新システムを開発する予定である。 そこで、システム部のK部長の下にプロジェクトチームを編成し、L君がデータベースの設計を担当することになった。
〔業務概要〕
1.部品管理
部品は、一つ又は複数の部品から構成され、図1に示すような階層構造で管理されている。

図1において、各階層の上位から見た下位の部品を子部品、下位から見た上位の部品を親部品と呼ぶ。 子部品を組み立てて親部品を作る。 図1では、部品Aは部品B, C及びDの親部品であり、部品B, C及びDは部品Aの子部品である。部品Bは部品E, Dの親部品であり、逆に部品Dから見ると、部品A, Bはともに親部品である。
親部品と子部品は、ともに部品として管理する。 部品は、部品番号によって,J社内で一意に識別される。
(1) 部品の区分
部品は次の三つの観点で区分されている。
(a) 調達区分
部品には、社外から調達するものとJ社で製造するものがあり、調達区分はこの観点から分類する場合の区分である。 前者を調達品、後者を製造品と呼ぶ。調達品か製造品かは、部品ごとに決められている。 図1で、部品A, Bは製造品、部品C, D及びEは調達品である。 同じ調達品でも多くの場合、複数の調達先から仕入れている。
(b) 販売区分
部品には、販売するものと販売しないものがあり、販売区分はこの観点から分類する場合の区分である。 前者を製品と呼ぶ。 製品は、部品番号とは別に、製品番号によってJ社内で一意に識別される。 製造品だけが製品として販売され、調達品はそのまま製品として販売されることはない。
(c) 顧客仕様区分
部品には、J社が顧客の設計仕様に従って製造又は調達するものとそれ以外のものがあり、顧客仕様区分はこの観点から分類する場合の区分である。 前者を顧客仕様部品と呼ぶ。 顧客仕様部品の中で、顧客に販売するものを顧客仕様製品と呼ぶ。顧客仕様製品を構成する子部品には、顧客仕様部品以外の部品が含まれることがある。
(2) リードタイム
部品には、部品ごとにリードタイム (以下、LTという) が決められている。LTには、1階層LTと全階層LTがある。
(a) 1階層LT
製造品の場合は製造LTと呼び、子部品がすべてそろっている状態での親部品の組立期間である。 調達品の場合は調達LTと呼び、社外から調達するのに必要な期間で、調達先ごとに設定される。
(b) 全階層 LT
全階層LTはすべての子部品をそろえるための期間に親部品の組立期間を加えたものである。 部品の全階層LTを算出するときに、子部品に調達品がある場合は、同じ調達品の中で、最大の調達LTが用いられる。 全階層LTは、構成部品が変更になるたびに一括して再計算される。
図1で示した部品の調達LT, 製造LT及び全階層LTを、表1に示す。

(3) 部品使用開始日・部品使用終了日と部品販売開始日・部品販売終了日
一つの部品は、子部品として使用されたり、製品として販売されたりする。部品が、子部品として使用される日、又は製品として出荷される日を、使用日と呼ぶ。新規部品の最初の使用日を部品使用開始日、最後の使用日を部品使用終了日と呼ぶ。部品は、製造又は調達された日の翌日から使用可能になる。新規部品の注文受付を開始する日を部品販売開始日と呼び、部品の注文受付を終了する日を部品販売終了日と呼ぶ。
(4) 製品番号の付与
製品には、通常、一つの製品番号を付与するが、複数の製品番号を付与する場合もある。後者は、量産効果によってコストを抑えるため、性能の高い部品を集中製造し、性能の低い製品として転用する場合である。 このため、部品、製品に対して、それぞれ部品仕様、製品仕様を分けて定義する。
(5) 部品構成の管理
(a) 構成管理
一つの親部品を製造するときの、子部品の種類とその使用数量を表したものを部品構成表と呼ぶ。 表2に部品構成表の例を示す。 構成適用開始日、構成適用終了日は、部品構成表の各子部品に関する情報の有効期間を規定するものである。ここで、構成適用終了日の初期値には、9999-12-31が設定されている。
部品構成表は、新規の親部品の製造時に新規作成され、子部品の変更時に変更される。 表2では、部品Aについて、次の新規作成・変更が行われたことを表している。
① 2007年9月1日に、部品B, C及びDを使用して、部品Aを新規に製造開始。
② 2008年9月30日に、部品Cの使用を終了。 2008年10月1日から部品Fの使用を開始。
③ 2008年10月1日から、部品Dの使用数量を8個から4個に変更。

(b) 登録日付のチェック
部品構成表の新規作成・変更に伴い、子部品の手配計画も変更される。構成適用開始日に当該子部品をそろえられるよう手配する日を、部品手配開始日と呼ぶ。また、当該子部品の手配を終了する日を、部品手配終了日と呼ぶ。 部品手配開始日を設定する際には、構成適用開始日と部品の各LTとを比較し、実現性をチェックする。
2.顧客管理
(1) 顧客と企業の登録
顧客とは、J社が取引を行う事業所の単位である。 複数の事業所を有するような企業では、一つの企業で複数の顧客が登録されることがある。 顧客に対しては,J社内で一意な顧客番号を付与し、顧客番号とは別に企業に対しては、J社内で一意な企業コードを付与する。 顧客単位に取引の開始・終了を管理し、一度取引が終了した顧客と取引を再開する場合は、新たな顧客番号を付与する。
(2) 顧客と営業担当者との関係
1顧客に対して、1人の営業担当者が割り当てられる。 1人の営業担当者は複数の顧客を担当することができる。 組織変更によって、営業担当者が変わることがあるが、契約内容の問合せなどに備えて、過去の営業担当者を特定する仕組みが必要である。 1人の営業担当者がある顧客の担当から外れた後、再度同じ顧客を担当することがある。
3.顧客仕様製品の新システムへの登録
顧客仕様製品を新規に受注する場合には、J社側で顧客仕様製品を新システムに登録する。 その場合、顧客から指定された顧客仕様製品名と顧客ごとに一意な顧客仕様製品コードを登録し、対応する部品番号は新システムで一意な値が自動採番される。ただし、受注したときに顧客仕様製品名と顧客仕様製品コードが未定の場合、顧客仕様製品名と顧客仕様製品コードは空値(NULL)のままで新システムに登録される。 その後、顧客仕様製品名と顧客仕様製品コードが決定した時点で、それぞれ登録する。
〔テーブル設計〕
L君はデータベースの設計に当たり、まず図2に示すテーブルを設計した。 これに対し,K部長からは次のような指摘があった。
[指摘事項]
① 主キー、外部キーが設定されていないテーブルがある。
② “顧客担当” テーブルは第3正規形にした方がよい。
③ “部品構成” テーブルの日付は、実現性の面から矛盾しない日付となるように制約を整理する必要がある。
④ “部品” テーブルは主キーの設定に誤りがあるので、再設計する必要がある。
解答に当たっては、巻頭の表記ルールに従うこと。
なお、テーブル構造の表記は、“関係データベースのテーブル (表)構造の表記ルール” を用いること。 さらに、主キー及び外部キーを明記せよ。
設問1:〔テーブル設計〕におけるK部長の指摘事項①、②について、(1)~(3)に答えよ。
問題文を見る(1)“顧客担当” テーブルは、第1正規形である。 第2正規形でない理由を、列名を用いて具体的に60字以内で述べよ。
模範解答
非キー列である顧客名が、候補キー{顧客番号、顧客担当開始日}の一部である顧客番号に部分関数従属するから
解説
解答の論理構成
- テーブル構造の確認
問題文の “顧客担当” テーブルは
(“顧客番号”、“顧客名”、“企業コード”、“企業名”、“顧客取引開始日”、“顧客取引終了日”、“顧客担当開始日”、“顧客担当終了日”、“担当社員番号”)
で構成されている。 - 候補キーの特定
業務要件「1顧客に対して、1人の営業担当者が割り当てられる」「営業担当者が変わることがある」から、顧客と担当期間を示す “顧客担当開始日” を含めて一意となるため、候補キーは “顧客番号、顧客担当開始日”。 - 部分関数従属の検出
“顧客名” は “顧客番号” が決まれば一意になる属性であり、複合キーの一部にしか依存していない。これは「部分的依存」、すなわち第2正規形違反。 - 結論
よって「非キー列である “顧客名” が、候補キー{“顧客番号”、“顧客担当開始日”}の一部 “顧客番号” に部分関数従属している」ことが第2正規形でない理由となる。
誤りやすいポイント
- 候補キーを “顧客番号” 単独と思い込み、部分依存を見落とす。
- “担当社員番号” をキーの一部と誤解し、関数従属性の判定を誤る。
- 「部分関数従属=複合キーのすべてに依存しないこと」と定義をあいまいに覚えている。
FAQ
Q: なぜ “顧客名” はキー項目に含めないのですか?
A: 業務上、顧客識別は “顧客番号” で行われ、“顧客名” は変更される可能性もあるため、識別子として適さないからです。
A: 業務上、顧客識別は “顧客番号” で行われ、“顧客名” は変更される可能性もあるため、識別子として適さないからです。
Q: 第2正規形に直すにはどうすればよいですか?
A: “顧客名”、“企業コード”、“企業名”、取引開始・終了日など “顧客番号” のみに依存する列を分離し、“顧客” テーブルを作成し、“顧客番号” を外部キーとして “顧客担当” に残します。
A: “顧客名”、“企業コード”、“企業名”、取引開始・終了日など “顧客番号” のみに依存する列を分離し、“顧客” テーブルを作成し、“顧客番号” を外部キーとして “顧客担当” に残します。
関連キーワード: 第2正規形、部分関数従属、複合キー、正規化、候補キー
設問1:〔テーブル設計〕におけるK部長の指摘事項①、②について、(1)~(3)に答えよ。
問題文を見る(2)“顧客担当” テーブルを第3正規形に分割し、分割後の “顧客担当” テーブル及び新たなテーブルの主キー及び外部キーも併せて答えよ。 ここで、新たに作成するテーブルについては、内容を表す適切なテーブル名として本文中の用語を用いること。
模範解答
顧客(顧客番号、顧客名、企業コード、顧客取引開始日、顧客取引終了日)
企業(企業コード、企業名)
顧客担当(顧客番号、顧客担当開始日、顧客担当終了日、担当社員番号)
解説
解答の論理構成
- 第3正規形の確認
第3正規形では「主キーに非依存な推移的関数従属」を排除する。 - 関数従属の抽出
問題文に「顧客とは、J社が取引を行う事業所の単位である」「企業に対しては、J社内で一意な企業コードを付与する」とある。
よって
・顧客番号 → 顧客名、企業コード、顧客取引開始日、顧客取引終了日
・企業コード → 企業名
が成立し、推移的従属「顧客番号 → 企業コード → 企業名」が発生。 - 正規化の手順
① 企業コード → 企業名 を独立させて“企業”表を作成(主キー:企業コード)。
② 残る項目のうち、取引期間属性は顧客単位で固有なので“顧客”表へ(主キー:顧客番号、外部キー:企業コード)。
③ 履歴が必要な営業担当情報は「1顧客に対して営業担当者が変わる」ため、顧客番号+顧客担当開始日を主キーにした“顧客担当”表へ分離。担当社員番号は外部キーとして“社員”表を参照。 - 主キー・外部キーの確定
• 顧客(顧客番号 PK, 企業コードFK→企業)
• 企業(企業コードPK)
• 顧客担当(顧客番号PK/FK→顧客、顧客担当開始日 PK, 担当社員番号FK→社員)
これで推移的従属が消え、第3正規形を満たす。
誤りやすいポイント
- 「企業名は入力時に毎回持っておけば検索が楽」と冗長属性を残すと推移的従属を見落とす
- 顧客担当開始日を主キーに含めず、最新行の上書き型にしてしまい履歴が欠落
- 担当社員番号を“顧客”表に残し、1:1のような誤った構造で実装してしまう
FAQ
Q: 顧客担当終了日を主キーに含めない理由は?
A: 「担当者がいない期間」もあり得るため終了日はNULL可が妥当で、一意性判定に不向きです。開始日のみで履歴の一意性を担保し、終了日は業務ロジックで更新します。
A: 「担当者がいない期間」もあり得るため終了日はNULL可が妥当で、一意性判定に不向きです。開始日のみで履歴の一意性を担保し、終了日は業務ロジックで更新します。
Q: 同じ担当者が再度同じ顧客を受け持つ場合、複合主キーは重複しませんか?
A: 再担当時は新しい顧客担当開始日が設定されるので、顧客番号+顧客担当開始日が重複しません。
A: 再担当時は新しい顧客担当開始日が設定されるので、顧客番号+顧客担当開始日が重複しません。
Q: “企業”表と“顧客”表を分けるメリットは?
A: 「一つの企業で複数の顧客が登録される」仕様どおり、企業属性を一元管理できるため更新時のインパクトを最小化できます。
A: 「一つの企業で複数の顧客が登録される」仕様どおり、企業属性を一元管理できるため更新時のインパクトを最小化できます。
関連キーワード: 第3正規形、関数従属、主キー設計、外部キー制約、履歴管理
設問1:〔テーブル設計〕におけるK部長の指摘事項①、②について、(1)~(3)に答えよ。
問題文を見る(3)“顧客仕様製品” テーブルには二つの候補キーがある。 これらの候補キーに関して、(a)、(b)に答えよ。
(a)二つの候補キーのうち、適切な主キーを答えよ。
(b)もう一方の候補キーが主キーとして不適切な理由を、候補キーを具体的に示し、60字以内で述べよ。
模範解答
(a):部品番号
(b):候補キーである顧客番号、顧客仕様製品コードのうち、顧客仕様製品コードが空値のままで登録する場合があるから
解説
解答の論理構成
- 候補キー抽出
“顧客仕様製品” テーブルには
・“部品番号”
・“顧客番号、顧客仕様製品コード”
の2組が一意性を保証できる候補キーとして存在します。 - “部品番号” の特性
【問題文】「部品番号は新システムで一意な値が自動採番される」ため
・常に一意
・NULL不可(自動採番時に値が入る)
よって主キー条件を完全に満たします。 - “顧客番号、顧客仕様製品コード” の特性
【問題文】「顧客仕様製品コードが未定の場合…空値(NULL)のままで新システムに登録」
⇒ NULLを含む状態で登録され得る。
リレーショナルモデルでは主キーにNULLは許されず、一意性も保証できません。 - 結論
以上より主キーは “部品番号” を採用し、もう一方はNULL可能であることを理由に主キーとして不適切と判断します。
誤りやすいポイント
- 「顧客ごとに一意」という表現だけで “顧客番号、顧客仕様製品コード” を主キーと決めてしまう。NULL可否を必ず確認する必要があります。
- 自動採番を「物理実装上の都合」と軽視し、業務キーを優先してしまう。主キーは論理・物理双方から検証することが重要です。
- 候補キー同士の優先順位を、単に「項目数が少ない方が良い」で決めてしまう。NULL禁止や変更可能性など総合的に判断します。
FAQ
Q: “顧客仕様製品コード” が後から必ず入力されるなら主キーにしても良い?
A: 登録時点ではNULLが入り得る以上、ERモデル上は主キーにできません。後更新で値が埋まる前に一意性維持が破綻する恐れがあります。
A: 登録時点ではNULLが入り得る以上、ERモデル上は主キーにできません。後更新で値が埋まる前に一意性維持が破綻する恐れがあります。
Q: “部品番号” が機械採番なら業務的な意味が無いのでは?
A: 主キーは「一意かつ非NULL」が最優先要件です。業務的な意味は副次的であり、サロゲートキー採用は一般的な設計手法です。
A: 主キーは「一意かつ非NULL」が最優先要件です。業務的な意味は副次的であり、サロゲートキー採用は一般的な設計手法です。
Q: NULLが許容されても UNIQUE 制約を掛ければよいのでは?
A: 主キー制約は NOT NULL + UNIQUE がセットです。UNIQUE だけではNULLを許すため、主キー要件を満たしません。
A: 主キー制約は NOT NULL + UNIQUE がセットです。UNIQUE だけではNULLを許すため、主キー要件を満たしません。
関連キーワード: 候補キー、サロゲートキー、NULL制約、一意性、主キー
設問2:〔テーブル設計〕におけるK部長の指摘事項③について、(1)、(2)に答えよ。なお、解答に当たっては、本文中の用語を用いて、具体的に述べること。
問題文を見る(1)子部品の種類が変更される場合、変更後の子部品の、部品手配開始日、構成適用開始日、全階層LTとの間に生じる制約を、50字以内で述べよ。
模範解答
変更後の子部品の構成適用開始日から部品手配開始日を引いた日数が、全階層LTよりも大きいこと
解説
解答の論理構成
- 【問題文】「子部品の手配を終了する日を、部品手配終了日と呼ぶ。部品手配開始日を設定する際には、構成適用開始日と部品の各LTとを比較し、実現性をチェックする。」
- LT中でもっとも長い全体リードタイムは【問題文】「全階層LTはすべての子部品をそろえるための期間に親部品の組立期間を加えたもの」と定義。
- したがって、手配開始から適用までに確保すべき最短日数は「全階層LT」。
- 変更後の子部品でも同じ理屈が成立するため、制約は
となり、モデル解答「構成適用開始日から部品手配開始日を引いた日数が、全階層LTよりも大きいこと」と合致します。
誤りやすいポイント
- 「製造LT」「調達LT」と混同し、最長値である「全階層LT」を使わない。
- “≧” と “>” の混乱。最短日数が「よりも大きい」ため厳密には “>”。
- 「変更前/変更後」を意識せず一般論を書くと減点される。
FAQ
Q: 「全階層LT」が更新されたら制約はどうなりますか?
A: 構成変更で全階層が変われば手配開始日も再計算し、上記不等式を再確認する必要があります。
A: 構成変更で全階層が変われば手配開始日も再計算し、上記不等式を再確認する必要があります。
Q: 調達品で複数調達先がある場合は?
A: 【問題文】「同じ調達品の中で、最大の調達LTが用いられる」とあるので、その最大値を含めた全階層LTを利用します。
A: 【問題文】「同じ調達品の中で、最大の調達LTが用いられる」とあるので、その最大値を含めた全階層LTを利用します。
Q: “≧” でも良いのでは?
A: 全階層LTは必要作業時間の合計です。実運用では同日完了ではリスクがあるため、問題は「よりも大きい」としています。
A: 全階層LTは必要作業時間の合計です。実運用では同日完了ではリスクがあるため、問題は「よりも大きい」としています。
関連キーワード: リードタイム、日付制約、部品構成表、スケジューリング、BOM
設問2:〔テーブル設計〕におけるK部長の指摘事項③について、(1)、(2)に答えよ。なお、解答に当たっては、本文中の用語を用いて、具体的に述べること。
問題文を見る(2)親部品が新規に製造される場合、新規作成された部品構成表の構成適用開始日と、親部品の、部品使用開始日と製造LTとの間に生じる制約を、60字以内で述べよ。
模範解答
親部品の部品使用開始日から製造LTを引いた日付が、新規作成された部品構成表の構成適用開始日よりも後であること
解説
解答の導き方
本文から次の事実が読み取れます。
「製造品の場合は製造LTと呼び、子部品がすべてそろっている状態での親部品の組立期間である。」→ 製造LTは組立に要する日数であり、組立は子部品がそろった時点で開始すること。
「部品は、製造又は調達された日の翌日から使用可能になる。」→ 製造が完了した日の翌日から親部品が使用できること。
「構成適用開始日、構成適用終了日は、部品構成表の各子部品に関する情報の有効期間を規定するものである。」→ 構成適用開始日はその子部品が組立に使われ始める日を示すこと。
「製造品の場合は製造LTと呼び、子部品がすべてそろっている状態での親部品の組立期間である。」→ 製造LTは組立に要する日数であり、組立は子部品がそろった時点で開始すること。
「部品は、製造又は調達された日の翌日から使用可能になる。」→ 製造が完了した日の翌日から親部品が使用できること。
「構成適用開始日、構成適用終了日は、部品構成表の各子部品に関する情報の有効期間を規定するものである。」→ 構成適用開始日はその子部品が組立に使われ始める日を示すこと。
これらを記号で整理します。部品使用開始日を 、組立開始日を とおきます。組立開始日から製造LT日を経た日 に組立が完了し、その翌日 から使用可能になります。これが部品使用開始日 に間に合うには 、すなわち 、つまり が必要です。
一方、新規作成された部品構成表は、構成適用開始日から有効になります。親部品の組立に子部品を使うには、組立開始日 の時点で部品構成表が有効でなければならないので、構成適用開始日 です。二つを合わせると、構成適用開始日 となり、「部品使用開始日 − 製造LT」は構成適用開始日よりも後の日付でなければなりません。
結論:親部品の部品使用開始日から製造LTを引いた日付が、新規作成された部品構成表の構成適用開始日よりも後であること(構成適用開始日 < 部品使用開始日 − 製造LT)。
誤りやすいポイント
- 不等式の向きを逆にしてしまう( と誤る)。また、解答例は「…よりも後であること」で、等号を含まない点にも注意する。
- 「翌日から使用可能」を無視してオフバイワン( 等)にする。本文の「翌日から」を明示的に使って代数変形すること。
- 製造品と調達品を混同する(親部品が調達品なら製造LTではなく調達LTを使う)。
- 構成適用開始日と部品手配開始日を混同する(構成適用開始日はBOM上の有効開始日、手配開始日は調達・製造を開始する日)。
FAQ
Q: 構成適用開始日と部品手配開始日の違いは何ですか?
A: 構成適用開始日は部品構成表でその子部品を使用し始める日です。部品手配開始日は「構成適用開始日に当該子部品をそろえられるよう手配する日」で、各子部品の調達LTや製造LTから逆算して決めます。
A: 構成適用開始日は部品構成表でその子部品を使用し始める日です。部品手配開始日は「構成適用開始日に当該子部品をそろえられるよう手配する日」で、各子部品の調達LTや製造LTから逆算して決めます。
Q: 親部品が調達品(外注品)の場合は同じ式でよいですか?
A: 親部品が調達品なら親部品自身の製造LTではなく調達LT(調達先ごとに設定)を用いて同様に逆算します。本文では調達LTが調達先ごとに設定されるとあります。
A: 親部品が調達品なら親部品自身の製造LTではなく調達LT(調達先ごとに設定)を用いて同様に逆算します。本文では調達LTが調達先ごとに設定されるとあります。
Q: 複数の子部品でLTが異なるときはどう扱いますか?
A: 各子部品ごとに「その子部品が組立開始日 までにそろうか」を確認し、手配開始日は子部品ごとに逆算して設定します。本文の「構成適用開始日と部品の各LTとを比較し、実現性をチェックする。」を踏まえて判断します。
A: 各子部品ごとに「その子部品が組立開始日 までにそろうか」を確認し、手配開始日は子部品ごとに逆算して設定します。本文の「構成適用開始日と部品の各LTとを比較し、実現性をチェックする。」を踏まえて判断します。
関連キーワード: リードタイム、部品構成表、構成管理、組立開始、部品手配
設問3:〔テーブル設計〕におけるK部長の指摘事項④について、(1)(2)に答えよ。
問題文を見る(1)“部品”テーブルを第3正規形に再設計し、主キー及び外部キーを正しく設定せよ。 ここで、再設計したテーブルについては、内容を表す適切なテーブル名として、本文中の用語を用いること。
模範解答
部品(部品番号、部品名、部品使用開始日、部品使用終了日、部品仕様、製造LT、全階層LT)
製品(製品番号、製品名、部品販売開始日、部品販売終了日、製品仕様、部品番号)
調達品(部品番号、調達先コード、調達LT)
解説
解答の導き方
目的は「“部品”テーブルを第3正規形に再設計し、主キー及び外部キーを正しく設定する」ことです。まず図2の現状を確認します。図2の部品には「部品番号、部品名、製品番号、製品名、調達先コード、部品使用開始日、部品使用終了日、部品販売開始日、部品販売終了日、部品仕様、製品仕様、調達LT、製造LT、全階層LT」が含まれています。これらの属性は、性格(粒度)が異なるため一つの表に混在させると第3正規形の要件を満たせません。第3正規形の要件は「すべての非主キー属性が主キーに対して完全関数従属していること、かつ非主キー属性間に推移的従属がないこと」です。以下、属性ごとにどこに置くべきかを段階的に判定します。
- 製品に関する属性の分離
- 根拠:本文には「製品には、通常、一つの製品番号を付与するが、複数の製品番号を付与する場合もある」「部品、製品に対して、それぞれ部品仕様、製品仕様を分けて定義する」とあります。
- 意味:同じ部品に対して複数の製品番号が付与され得る(部品 → 製品は1対多)ため、製品に固有の属性(製品番号、製品名、部品販売開始日、部品販売終了日、製品仕様)は部品の主キー(部品番号)だけでは一意に決まらない。したがってこれらは別表(製品)へ分離します。
- 調達に関する属性の切り出し
- 根拠:本文には「調達LTは…調達先ごとに設定される」「同じ調達品でも多くの場合、複数の調達先から仕入れている」とあります。
- 意味:調達LTは部品単独ではなく(部品番号, 調達先コード)の組合せで決まるため、調達先ごとの情報は調達単位の表(調達品)として管理します。調達品表は複合主キー(部品番号+調達先コード)を持ちます。
- 部品固有の属性の残置
- 「部品名」「部品使用開始日」「部品使用終了日」「部品仕様」「製造LT」「全階層LT」は部品単位で意味を持ちます(本文に「製造品の場合は製造LT…」「全階層LTは…親部品の組立期間を加えたもの」等の定義あり)。これらは部品の主キー(部品番号)に対して完全に従属するため、部品表に残します。
以上の分解により、第3正規形を満たすテーブル群は次のとおりです。主キー(PK)は下線、外部キー(FK)は参照先を明示しています。
部品(部品番号、部品名、部品使用開始日、部品使用終了日、部品仕様、製造LT、全階層LT)
主キー:部品番号
外部キー:なし
主キー:部品番号
外部キー:なし
製品(製品番号、製品名、部品販売開始日、部品販売終了日、製品仕様、部品番号)
主キー:製品番号
外部キー:部品番号 → 部品(部品番号)
説明:製品番号を主キーとし、製品に固有の属性はすべて製品番号で決まります。部品番号は参照(外部キー)として、どの部品をもとにした製品かを示します。
主キー:製品番号
外部キー:部品番号 → 部品(部品番号)
説明:製品番号を主キーとし、製品に固有の属性はすべて製品番号で決まります。部品番号は参照(外部キー)として、どの部品をもとにした製品かを示します。
調達品(部品番号、調達先コード、調達LT)
主キー:部品番号, 調達先コード(複合主キー)
外部キー:部品番号 → 部品(部品番号)、調達先コード → 調達先(調達先コード)
説明:調達LTは調達先ごとに異なるため、部品と調達先の組合せを主キーにします。
主キー:部品番号, 調達先コード(複合主キー)
外部キー:部品番号 → 部品(部品番号)、調達先コード → 調達先(調達先コード)
説明:調達LTは調達先ごとに異なるため、部品と調達先の組合せを主キーにします。
第3正規形の観点での確認
- 部品表:非キー属性(部品名等)はすべて主キー(部品番号)に完全関数従属し、非キー間の推移的従属はありません。
- 製品表:非キー属性は製品番号に完全従属し、部品番号は外部キーであって非キー属性間の推移的従属を生じさせません。
- 調達品表:調達LTは複合主キー(部品番号, 調達先コード)に対して意味を持ち、各非キー属性はその複合主キーに完全従属します。
以上により各表は第3正規形を満たします。
注意点(実務的補足)
- 「製造品だけが製品として販売される」という業務ルールは、製品登録時に参照整合性に加え、部品側の調達区分(製造/調達)をチェックする業務制約(チェック制約やトリガ、アプリケーション検査)で担保します。
- 顧客仕様製品などで製品番号が未定のまま登録される運用がある場合は、該当テーブル(顧客仕様製品)でNULLを許容し、製品番号が確定した時点で製品表へ登録する運用設計にすると整理しやすいです。
誤りやすいポイント
- 「第2正規形」を根拠に分割すると誤解すること。ここでの分割は「部品→製品が1対多になり得るため、製品に固有の属性は部品番号で一意に決まらない(関数従属性が成り立たない)から分離する」という関数従属の観点が正しい説明です。
- 調達LTを部品表に残すと、調達先が複数ある場合に値をどれに合わせるか不定となる(データの不整合)。
- 調達品表の主キーを単一にしてしまう(複合主キーを設定しない)と、調達LTの意味が失われる。
- 製品の属性を部品表に残すと、同じ部品で複数の製品がある場合に属性が重複・矛盾する。
- 外部キー参照先を明示しないと参照整合性が担保できない(調達先コード→調達先テーブル、部品番号→部品テーブル)。
FAQ
Q: 製品番号が未定(NULL)のときはどう扱えばよいですか?
A: 顧客仕様製品の登録要件では顧客仕様製品コードや顧客仕様製品名が未定の場合、NULLのまま登録されることが認められています。製品番号が未定の場合は製品表にはまだ行を作らず、顧客仕様製品など専用のテーブルでNULLを許容しておき、製品番号が決定した時点で製品表へ登録すると運用上わかりやすくなります。
A: 顧客仕様製品の登録要件では顧客仕様製品コードや顧客仕様製品名が未定の場合、NULLのまま登録されることが認められています。製品番号が未定の場合は製品表にはまだ行を作らず、顧客仕様製品など専用のテーブルでNULLを許容しておき、製品番号が決定した時点で製品表へ登録すると運用上わかりやすくなります。
Q: 「製品は製造品だけが販売される」ルールはスキーマでどう保証しますか?
A: 部品表に「調達区分(製造/調達)」を持たせ、製品表の挿入時に部品表の該当部品の調達区分が「製造」であることをチェックする制約(アプリケーションチェック、トリガ、あるいは参照整合性+追加チェック)で保証します。単純な外部キーだけでは業務ルールまでは担保できません。
A: 部品表に「調達区分(製造/調達)」を持たせ、製品表の挿入時に部品表の該当部品の調達区分が「製造」であることをチェックする制約(アプリケーションチェック、トリガ、あるいは参照整合性+追加チェック)で保証します。単純な外部キーだけでは業務ルールまでは担保できません。
Q: 調達LTの更新はどのテーブルで行うべきですか?
A: 調達LTは調達先ごとに設定されるので、調達品表(部品番号+調達先コード)で管理・更新します。これにより同じ部品に複数の調達先がある場合でも個別に管理できます。
A: 調達LTは調達先ごとに設定されるので、調達品表(部品番号+調達先コード)で管理・更新します。これにより同じ部品に複数の調達先がある場合でも個別に管理できます。
関連キーワード: 関数従属、第3正規形、複合主キー、外部キー参照、部品構成表
設問3:〔テーブル設計〕におけるK部長の指摘事項④について、(1)(2)に答えよ。
問題文を見る(2)“部品” テーブルの列の値が設定されるかどうかは、部品によって異なる。これを表すために、図2の “部品” テーブルに、部品区分を表す列を追加する。 そこで、部品区分とその組合せを、表3のように整理した。 表3中のY, Nの意味を、本文中の用語を用いて述べよ。 ここで、組合せ3(部品区分1〜3がそれぞれY, N, Yである部品)は顧客仕様製品を表す。


模範解答

解説
解答の論理構成
- 販売区分に関する記述
【問題文】には「部品には、販売するものと販売しないものがあり…前者を製品と呼ぶ」とある。したがって、部品区分1のYは「製品」、Nは「製品以外」と分かる。 - 調達区分に関する記述
「部品には、社外から調達するものとJ社で製造するものがあり…前者を調達品、後者を製造品と呼ぶ」とある。よって、部品区分2のYは「調達品」、Nは「製造品」。 - 顧客仕様区分に関する記述
「部品には…顧客の設計仕様に従って製造又は調達するもの…前者を顧客仕様部品と呼ぶ」とある。ゆえに、部品区分3のYは「顧客仕様部品」、Nは「顧客仕様部品以外」。 - 組合せ3の確認
表3の注記で「組合せ3…は顧客仕様製品」と補足されており、Y,N,Yが「製品」「製造品」「顧客仕様部品」を同時に満たすことを裏付ける。
誤りやすいポイント
- 「調達品か製造品か」と「製品か製品以外か」を同一視してしまう。調達品はそもそも製品にならない。
- 顧客仕様部品=必ず顧客仕様製品と思い込み、販売有無を無視する。
- 表3のY/Nを単に「有/無」と読んでしまい、区分ごとの意味付けを落とす。
FAQ
Q: 部品区分1がYでも部品区分2がYになることはありますか?
A: ありません。「製造品だけが製品として販売され、調達品はそのまま製品として販売されることはない」という制約があるためです。
A: ありません。「製造品だけが製品として販売され、調達品はそのまま製品として販売されることはない」という制約があるためです。
Q: 顧客仕様部品は必ず製造品ですか?
A: いいえ。顧客仕様部品は「J社が顧客の設計仕様に従って製造又は調達するもの」であり、調達するケースもあります。したがって顧客仕様部品でも調達品になり得ます。
A: いいえ。顧客仕様部品は「J社が顧客の設計仕様に従って製造又は調達するもの」であり、調達するケースもあります。したがって顧客仕様部品でも調達品になり得ます。
Q: 顧客仕様製品が「製品番号」でなく「部品番号」で管理されるのはなぜ?
A: 顧客仕様製品は「顧客仕様製品コード」で顧客側要件と紐付く一方、J社内部では通常の部品として扱われるため、部品番号を自動採番して部品管理・構成管理の仕組みに統合しています。
A: 顧客仕様製品は「顧客仕様製品コード」で顧客側要件と紐付く一方、J社内部では通常の部品として扱われるため、部品番号を自動採番して部品管理・構成管理の仕組みに統合しています。
関連キーワード: 正規化、区分属性、外部キー、制約条件、リードタイム




