戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2014年 午後1 問03


テーブルの設計及びSQLの設計に関する次の記述を読んで、設問1〜3に答えよ。

 健康食品をインターネット販売しているE社は、受注管理システムを開発することになり、Fさんがデータベースの設計を任された。   〔受注管理システムの要求仕様〕 1.商品  (1) 商品は、単品商品と詰合せセット商品 (以下、セット商品という)に区分する。商品には、一意な商品番号を付与する。  (2) セット商品には、一つの化粧箱に複数個の単品商品を詰め合わせたものと、複数種類の単品商品を詰め合わせたものがある。 単品商品は、複数種類のセット商品に含まれる。 セット商品を構成する単品商品ごとの数量 (構成数)は、決まっている。
2.注文  (1) 顧客は、1回の注文 (以下、注文単位という)で、一つ以上の単品商品と一つ以上のセット商品を組み合わせて注文できる。 注文単位には、注文全体で一意な注文番号を付与する。  (2) 顧客は、インターネットから商品一覧照会処理を呼び出し、商品番号、商品名、商品説明、写真、販売単価を商品一覧画面に表示させる。 表示される順番は、商品全体で重複がないように、商品企画担当者が決めた表示順に基づく。  (3) 顧客は、表示画面から全ての購入希望の商品を検索して商品ごとの注文数を入力した後、注文処理を呼び出す。  (4) 注文処理は、顧客が注文した商品を在庫から引き当て、注文番号、注文日、商品番号、商品名、販売単価、注文数、注文額合計及びお届け予定日の日付 ( 注文日の3日後)を確認画面に表示する。 セット商品が不足した場合、そのセット商品に必要な数の単品商品を在庫から引き当てる。 確認画面のお届け予定日には、通常のお届け予定日に単品商品を化粧箱に詰め合わせるのに必要な日数を加える。 単品商品が不足することはない。  (5) 顧客は、注文内容を確認し、商品の送付先住所、顧客名、連絡先電話番号及び支払に必要な情報を入力し、注文を確定する。   〔テーブルの設計〕   Fさんが設計した関係 “商品” 及び “在庫” の関係スキーマを、図1に示す。
データベーススペシャリスト試験(平成26年 午後1 問3 図1)
 Fさんは、関係“商品” のテーブルの設計に当たり、次の二つの案を考えた。   案1 サブタイプをスーパタイプに統合し、一つの“商品” テーブルとする。   案2 サブタイプ別に “単品商品” テーブル及び “セット商品” テーブルとする。  案1の“商品” テーブルの構造を図2に、案2の“単品商品” テーブル及び“セット商品” テーブルの構造を図3に示す。
データベーススペシャリスト試験(平成26年 午後1 問3 図2)
データベーススペシャリスト試験(平成26年 午後1 問3 図3)
 Fさんは、関係 “在庫” については、一つの“在庫” テーブルを設計した。 “在庫” テーブルと、その他の主なテーブルの構造を、図4に示す。図4のテーブルは、全て案1,2に共通とする。 また、主な列の意味を表1に示す。   データベーススペシャリスト試験(平成26年 午後1 問3 図4)
データベーススペシャリスト試験(平成26年 午後1 問3 表1)
 Fさんが案1の“商品” テーブルに定義した制約を表2に、案2の“単品商品”テーブル及び“セット商品” テーブルに定義した制約を表3に示す。  受注管理システムに採用する予定のRDBMSの UNIQUE 制約は、ユニーク索引を用いて実現される。 ユニーク索引は、一つのテーブル内でキー列の一意性を保証するものであり、ユニーク索引を複数のテーブルにまたがって作成することはできない。
 表2に示した案1での NOT NULL制約は不十分なので,Fさんは、図5に示すように案1の“商品” テーブルに検査制約を追加した。 検査制約は、次の①〜⑥のいずれかの述語を組み合わせて指定する。  ① 社内原価 IS NOT NULL  ② 社内原価 IS NULL  ③ 化粧箱番号 IS NOT NULL  ④ 化粧箱番号 IS NULL  ⑤ 詰合せ日数 IS NOT NULL  ⑥ 詰合せ日数 IS NULL
〔SQL文の設計〕  Fさんが、案1と案2のそれぞれについて設計した主なSQL文を表4に示す。
データベーススペシャリスト試験(平成26年 午後1 問3 表4)
〔注文トランザクションの設計〕  Fさんは、注文トランザクションについて、次のように設計した。
(1) 注文単位を一つのトランザクションで処理し、最後に COMMIT 文を発行する。 (2) 注文に基づいて、“注文” テーブル及び “注文明細” テーブルに行を挿入する。 (3) 商品については、商品一覧画面に表示された順番に“在庫” テーブルの引当可能数を調べ、引当可能ならば注文数を減算した値で引当可能数を更新する。 (4) セット商品が在庫不足のとき、“在庫” テーブルの不足セット商品数に不足数を加算する。“セット商品構成” テーブルから、主キー順に当該セット商品を構成する単品商品の構成数を調べ、必要数を計算する。 単品商品については、“在庫” テーブルの引当可能数には必要数を減算した値で、不足セット商品用引当済数には必要数を加算した値で更新する。 (5) トランザクションのISOLATIONレベルは、READ COMMITTEDとする。

設問1:〔テーブルの設計〕について、(1)〜(4)に答えよ。

問題文を見る
(1)表2中の(a)に入れる適切な字句を答えよ。また,UNIQUE 制約を定義する目的を、要求仕様に関する本文中の字句を用いて30字以内で述べよ。

模範解答

a:表示順 目的:商品全体で重複がないように商品の表示順を決めるため、商品の表示順を商品全体で一意にするため

解説

解答の論理構成

  1. 要求仕様の確認
    【問題文】「表示される順番は、商品全体で重複がないように、商品企画担当者が決めた表示順に基づく。」
    ─ 表示順が重複しないことが業務要件。
  2. UNIQUE 制約の候補列
    ・商品番号 … 主キーで既に一意
    ・表示順 … 一意性が求められている
    ・その他の列 … 重複禁止の要件なし
    ⇒ UNIQUE を付けるべき列は 表示順。
  3. 目的文の作成
    要件文のキーワード「商品全体で重複がないように」を活用し、30字以内で
    「商品全体で重複がない表示順を保証するため」
    とまとめる。

誤りやすいポイント

  • 表示順を「ORDER BY 用」とだけ捉え、UNIQUE の必要性を見落とす。
  • 「商品名」などに UNIQUE を付けると、同一名の別商品が登録できず要件違反。
  • UNIQUE 制約はテーブル間をまたげないため、案2でも単品・セット各テーブルに個別定義が必要である点を失念しやすい。

FAQ

Q: 表示順を主キーに含めれば良いのでは?
A: 主キーは業務的に一意で変化しない列(ここでは商品番号)で構成するのが原則。表示順は変更される可能性があるため主キーには適さず、UNIQUE 制約で十分です。
Q: 案2では単品商品とセット商品で表示順が重複しそうですが?
A: UNIQUE 索引はテーブル単位なので、案2では両テーブルに同名の UNIQUE 制約を置き、アプリケーション側で重複を避ける運用にする必要があります。
Q: NOT NULLを追加すれば一意性は保証できますか?
A: いいえ。NOT NULLはNULL禁止であり重複自体を防ぐものではありません。一意性の保証には必ず UNIQUE か PRIMARY KEY が必要です。

関連キーワード: UNIQUE制約、一意性、表示順序、主キー、インデックス

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔テーブルの設計〕について、(1)〜(4)に答えよ。

問題文を見る
(2)表3中のテーブルについては、UNIQUE 制約を定義し、ユニーク索引を作成しただけでは、(a)に関する要求仕様を満たせない。その理由を、本文中の字句を用いて40字以内で述べよ。

模範解答

・ユニーク索引は一つのテーブル内でキー列の一意性を保証するため ・ユニーク索引を複数のテーブルにまたがって定義することはできないため

解説

解答の導き方

  1. 問題文に「表示される順番は、商品全体で重複がないように、商品企画担当者が決めた表示順に基づく」とあるので、ここで求められているのは「単品商品とセット商品を合わせた『商品全体』で表示順が一意であること」です。
  2. 表3(案2)では「単品商品」と「セット商品」それぞれに UNIQUE 制約を定義しているため、各テーブルにユニーク索引が作成されることになります。
  3. 問題文にも明記されているように「ユニーク索引は、一つのテーブル内でキー列の一意性を保証するものであり、ユニーク索引を複数のテーブルにまたがって作成することはできない。」つまり、別々のテーブルに同じ表示順の値が入ることを防げません。
  4. よって「UNIQUE 制約を定義し、ユニーク索引を作成しただけでは、(a)に関する要求仕様を満たせない」の理由は、ユニーク索引がテーブル単位でしか一意性を保証できないからです。
記述例(答案に書く短文の例)
「ユニーク索引を複数のテーブルにまたがって作成することはできないため」

誤りやすいポイント

  • 「各テーブルに UNIQUE 制約を付ければ商品全体で重複しない」と考える誤り。テーブルを分けると同じ値が別テーブル側に入る可能性があります。
  • 「CHECK 制約でテーブル間の一意性を保証できる」と考える誤り。標準 SQL の CHECK 制約は他テーブル参照を行えず、行単位/同一テーブル内の制約しか課せません。
  • 「複合キー(同一テーブル内)で解決できる」との混同。複合キーも単一テーブル内の一意性を扱う手段であり、複数テーブル横断の一意性は保証できません。
  • 実装方法の選択肢(トリガ/アプリケーション制御/専用マスタ等)はあるが、トリガやアプリケーションに任せる場合は同時更新による競合(排他)やトランザクション分離レベルへの配慮が必要です。

FAQ

Q: 案2のまま要件を満たすにはどうすればよいですか?
A: 主な選択肢は次の通りです。 (1) 「商品」を統合して単一テーブルにして UNIQUE 制約を付ける(案1に相当)。(2) 表示順だけを管理する専用のマスタテーブルを作り、ここに一意制約を付与して単品・セットは参照する。(3) 挿入/更新トリガで他テーブルを参照して一意性をチェックする(実装上の競合対策が必須)。(4) アプリケーション側で排他制御して設定する。運用の簡潔さと整合性保証の強さから、(1)か(2)が推奨されます。
Q: CHECK 制約や複合キーでテーブル間の一意性を担保できますか?
A: いいえ。CHECK 制約は他テーブル参照ができず、複合キーも同一テーブル内の一意性確保手段です。テーブル間の一意性はトリガや専用マスタ、テーブル統合など別の手法で実現する必要があります。
Q: トリガで実現するときの注意点は?
A: トリガ内で他テーブルを参照して重複チェックを行う場合、同時実行による競合を防ぐために適切なロックや排他制御が必要です。設計で定められているトランザクション分離レベル(例:READ COMMITTED)に応じた対策を講じないと、稀に重複が発生する恐れがあります。

関連キーワード: UNIQUE制約、ユニーク索引、CHECK制約、トリガ、マスタ管理表

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔テーブルの設計〕について、(1)〜(4)に答えよ。

問題文を見る
(3)次の表に示すように外部キーを定義したとすれば、“セット商品構成” テーブルについては案1の場合に、“在庫” テーブルについては案2の場合に、不都合が起きるおそれがある。 項番2,3の (ア)、(イ)に入れる不都合の内容を、項番1に倣って、35字以内で述べよ。 データベーススペシャリスト試験(平成26年 午後1 問3 設問1-3)

模範解答

ア:・単品商品番号列にセット商品番号を設定できてしまう イ:・「在庫」テーブルに行を挿入できない。   ・異なるテーブルの主キーを同じ外部キーに入力できない。   ・単品商品番号とセット商品番号を同じ外部キーに入力できない

解説

解答の論理構成

  1. 外部キーの仕様確認
    • 【問題文】「ユニーク索引は、一つのテーブル内でキー列の一意性を保証する…ユニーク索引を複数のテーブルにまたがって作成することはできない。」
    • 外部キーも同様に “1つの参照先テーブル” を必要とする。
  2. 項番2(ア)の検討
    • 案1では“商品”テーブルが単品とセットを同居させる。
    • したがって“セット商品構成”テーブルの「単品商品番号」列に外部キーを張ると、実際はセット商品のレコードも選択肢に入る。
    • 結果として「単品商品番号列にセット商品番号を設定できてしまう。」
  3. 項番3(イ)の検討
    • 案2では商品が「単品商品」「セット商品」の2テーブルに分割される。
    • “在庫”テーブルの「商品番号」列に外部キーを設定しようとしても、どちらか一方しか参照できない。
    • 片方を参照先にすると、もう片方の商品は登録できず「『在庫』テーブルに行を挿入できない。」事態となる。
  4. したがって(ア)(イ)は上記の内容となる。

誤りやすいポイント

  • 「複数テーブルをまたぐ外部キーを定義できる」と誤解する。SQL標準では不可。
  • 案1・案2のメリット/デメリットを逆に覚える。スーパタイプ統合は参照しやすいが属性NULL管理が煩雑。
  • UNIQUE 制約がテーブル単位であるため、テーブル分割後の一意性維持手段を見落とす。

FAQ

Q: 外部キーに複数の参照先を指定できるDBもあるのでは?
A: 標準 SQL では不可です。製品固有の CHECK 制約やトリガで実現する例はありますが、本試験は標準仕様が前提です。
Q: 案2で“在庫”テーブルを二つに分ければ(イ)の問題は解決しますか?
A: 技術的には可能ですが、アプリケーション変更や JOIN が複雑化するため、要件とのトレードオフを検討する必要があります。

関連キーワード: 外部キー、スーパタイプ/サブタイプ、一意性制約、リファレンシャルインテグリティ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔テーブルの設計〕について、(1)〜(4)に答えよ。

問題文を見る
(4)図5中の(b)〜(e)に入れる適切な述語を、①〜⑥から一つずつ選んで答えよ。(b,cは順不同、d, eは順不同)

模範解答

b:④ c:⑥ d:② e:③

解説

解答の論理構成

  1. 各列がどちらのサブタイプの列かを確認する
    • 図1では、単品商品が「社内原価」を、セット商品が「化粧箱番号」「詰合せ日数」をもっています。案1では、これらを一つの“商品”テーブルにまとめ、単品区分で単品商品(‘Y’)とセット商品(‘N’)を区別します。
    • したがって、ある行のサブタイプにない列は NULL でなければなりません。
  2. 単品区分が ‘Y’(単品商品)の場合
    • 社内原価は単品商品の列なので、値が必要です(図5に既に ① 社内原価 IS NOT NULL がある)。
    • 化粧箱番号と詰合せ日数はセット商品の列なので、単品商品では NULL です。
      ⇒ (b)・(c) は「④ 化粧箱番号 IS NULL」と「⑥ 詰合せ日数 IS NULL」(順不同)。
  3. 単品区分が ‘N’(セット商品)の場合
    • 社内原価は単品商品の列なので、セット商品では NULL です。
      ⇒「② 社内原価 IS NULL」。
    • 【表1】に「セット商品には必ず一つの化粧箱が使われ」とあるので、化粧箱番号には値が必要です。
      ⇒「③ 化粧箱番号 IS NOT NULL」。
    • 詰合せ日数は【表1】に「未定の場合、NULLが設定される」とあるので、セット商品でも NULL があり得ます。NULL かどうかの条件は付けられません。
      ⇒ (d)・(e) は「②」と「③」(順不同)。
  4. 以上より図5の検査制約は
    CHECK ( ( 単品区分 = ‘Y’ AND ① AND ④ AND ⑥ )
    OR ( 単品区分 = ‘N’ AND ② AND ③ ) )
    となります。

誤りやすいポイント

  • 「詰合せ日数」をお届け予定日の計算に使うことから、単品商品で ⑤ 詰合せ日数 IS NOT NULL としてしまう。詰合せ日数はセット商品の列で、単品商品では NULL です。
  • セット商品の詰合せ日数に ⑤ IS NOT NULL を付けてしまう。未定の場合は NULL が設定されます。
  • 「化粧箱番号 IS NULL/NOT NULL」「社内原価 IS NULL/NOT NULL」を単品・セットで逆に設定する。

FAQ

Q: お届け予定日の計算に詰合せ日数を使うのに、NULL でよいのですか?
A: 詰合せ日数を使うのはセット商品の場合です。単品商品には詰め合わせる作業がないので、詰合せ日数は NULL です。セット商品で未定の場合も NULL になり得ます。
Q: セット商品に「社内原価」を入れておくと価格分析に便利では?
A: 社内原価は単品商品の列です。セット商品にも値を持たせると、構成する単品商品の社内原価と重複し、更新時に不整合が発生するため、NULLとするのが適切です。
Q: 将来サブタイプが増えたときは検査制約をどう拡張する?
A: 単品区分に新値を追加し、対応する列のNULL/NOT NULL条件を OR 句として追加すれば良いです。

関連キーワード: CHECK制約、サブタイプ統合、NULL制御、データ整合性、スーパータイプ・サブタイプ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔SQL文の設計〕 について、(1)〜(3)に答えよ。

問題文を見る
(1)SQL2及びSQL3の実行結果をSQL1と同じにしたい。(f)、(g)に入れる適切な字句を1語又は2語で答えよ。 結果行の並び順は異なってよい。

模範解答

f:LEFT OUTER g:INNER

解説

解答の論理構成

  1. 基準となる “SQL1”
    【問題文】「SELECT M.商品番号、P.社内原価、P.化粧箱番号 … FROM 注文明細 M, 商品 P …」
    “商品” にはすべての商品が格納されているため、注文に存在する行は必ず取得できる。
  2. “SQL2” の要求
    • 【問題文】「SQL2の実行結果をSQL1と同じにしたい。」
    • 1行の “M.商品番号” は “単品商品” か “セット商品” のどちらか1テーブルにしか存在しない。
    • したがって “注文明細” を起点に、両テーブルに対して「存在すれば結合、存在しなければNULL」を返す必要がある。
    • この動作を保証する JOIN は “LEFT OUTER JOIN”。
    • 同じ動作を2回行うので (f) は2か所とも “LEFT OUTER”。
  3. “SQL3” の要求
    • 列リストを見ると、1 本目の SELECT では “化粧箱番号” を NULL、2 本目では “社内原価” を NULL に設定し、最後に “UNION ALL” で合成している。
    • したがって各 SELECT は「一致した場合のみ取得」すればよく、行の欠落は UNION 側で補完できる。
    • 通常の “INNER JOIN”(JOIN だけでも可)で十分なので (g) は “INNER”。

誤りやすいポイント

  • 「どちらのテーブルか分からないときは全結合(FULL OUTER)を使う」と思い込む
    → 実際には起点テーブルが決まっており LEFT だけで足りる。
  • “SQL3” でも “LEFT OUTER JOIN” と記述してしまう
    → 分割+UNION 方式では不要。結果が重複しパフォーマンスも低下する。
  • JOIN の順番を変えると NULL の位置が変わることを見落とす
    → 起点テーブルを意識して外部結合の向きを決定する。

FAQ

Q: “UNION” と “UNION ALL” のどちらを選べばよいですか?
A: 重複行を許容する場合は “UNION ALL” が高速です。本問では単品・セットで商品番号が重複しないため “UNION ALL” が適切です。
Q: “LEFT OUTER JOIN” を 2 回連続で書くと行が増える心配はありませんか?
A: “M.商品番号” は “単品商品” と “セット商品” のどちらか一方にしか存在しない設計なので、増殖はありません。両方に存在する可能性がある場合は注意が必要です。
Q: “JOIN” とだけ書いた場合のデフォルトは?
A: ANSI 準拠 SQL では “INNER JOIN” が暗黙の既定です。本問の (g) にも適用できます。

関連キーワード: 外部結合、内部結合、UNION ALL, NULL 補完、結合方向

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔SQL文の設計〕 について、(1)〜(3)に答えよ。

問題文を見る
(2)SQL4及びSQL5は、指定した注文について、注文されたセット商品を構成する単品商品の合計数を求めるSQL文である。 SQL4及びSQL5の実行結果が同じになるように、(h)に入れる適切な字句を答えよ。

模範解答

h:M.注文数*K.構成数

解説

解答の論理構成

  1. 目的の確認
    【小問説明】に「注文されたセット商品を構成する単品商品の合計数を求める」とあります。
  2. 必要な情報源
    ・セット商品が何個注文されたか → 注文明細 の 「注文数」(列名:注文数)
    ・セット商品1個に単品商品が何個入っているか → セット商品構成 の 「構成数」(列名:構成数)
  3. テーブル別の別名
    SQL4, SQL5 の FROM 句に
    • 注文明細 M
    • セット商品構成 K
      が指定されています。従って両列はM.注文数、K.構成数 で参照します。
  4. 合計値を出すための式
    1注文行で必要な単品数 = 注文数 × 構成数
    これを行単位で計算し SUM で集計する設計は実務でも典型です。
  5. 以上より (h) は
    sql M.注文数 * K.構成数

誤りやすいポイント

  • P.構成数 という列は存在しないため、Pを使うとエラーになります。
  • M.注文数 + K.構成数 と加算にしてしまうと「必要個数」ではなく「数の合計」になり要件を満たせません。
  • 両案とも結果を合わせる必要があるので、案2だけを見て別名をSとしてしまうミスに注意します。

FAQ

Q: 掛け算の列順序はK.構成数 * M.注文数 でも正しいですか?
A: 乗算は可換なので計算結果に差はありません。ただし読みやすさの観点で「注文数×構成数」と書くほうが意図を把握しやすいです。
Q: SUM を忘れてしまうと何が起きますか?
A: 単品商品番号ごとに集計できず、行ごとに結果が返り期待する「合計数」になりません。GROUP BY とセットで必須です。

関連キーワード: 集約関数、列別名、ジョイン、乗算演算、グループ化

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔SQL文の設計〕 について、(1)〜(3)に答えよ。

問題文を見る
(3)SQL4及びSQL5のアクセスパスは、次に示すネストループ結合である。  ① “注文明細” テーブルの主索引を用いて指定された注文番号の行を取り出し、商品番号を調べる。  ② ①で調べた商品番号ごとに、案1では“商品” テーブル、案2では “セット商品” テーブルの主索引を用いてアクセスする。  ③ “セット商品構成” テーブルの主索引を用いてアクセスする。   これらのアクセスパスでは、SQL4 の方が、“セット商品構成” テーブルの主索引をアクセスする頻度が多かった。 そのアクセス頻度を減らすために、SQL4 の WHERE 句に AND で追加すべき述語を一つ答えよ。

模範解答

P.単品区分=‘N’

解説

解答の論理構成

  1. 【問題文】にはネストループ結合の手順が示されている。
    ① 注文明細 → ②(案1の場合)商品 → ③ セット商品構成 の順で主索引をたどる。
  2. セット商品構成 は「セット商品番号」を主キーに持ち、セット商品のみが登録される構造である。
  3. ところが案1の 商品 表には単品・セット両方が格納されるため、②の時点で単品行も取得してしまう。
  4. 単品行に対して③を実行しても対応行は見つからず、「主索引を探したがヒットしない」無駄アクセスが発生する。
  5. 表1の説明――
    「単品区分…区分値は、単品商品では ‘Y’、セット商品では ‘N’ が設定される。」
    これを利用し、WHERE 句に P.単品区分 = 'N' を追加すれば②で単品行を除外できる。
  6. したがってアクセス頻度低減のための追加述語は P.単品区分 = 'N' となる。

誤りやすいポイント

  • セット商品構成 表を「単品も含む」と誤解し、区分条件が不要と判断してしまう。
  • 案2の構造と混同し、単品商品 / セット商品 個別表だから問題ないと考えてしまう。
  • 述語を 単品区分 <> 'Y' などと書き換え、原文の値 ‘N’ を改変してしまう(採点対象外になる)。

FAQ

Q: なぜ案2では同じ追加述語が不要なのですか?
A: 案2では 注文明細 からまず セット商品 表(単独)へ結合しており、構造上単品商品が選択肢に入らないため区分条件を追加しなくても無駄アクセスが発生しません。
Q: 単品区分 に索引を張らなくても効果はありますか?
A: 本問の主目的はループ対象の行数削減です。索引がなくとも行数が減れば③の回数が減るため効果があります。追加で索引を作成すれば更に効率化できますが、設問の範囲外です。
Q: IN 句や副問い合わせで書き換えても良いですか?
A: 可能ですが、求められているのは「AND で追加する単一述語」です。最小限で目的を達成するP.単品区分 = 'N' が最適解です。

関連キーワード: ネストループ結合、主索引、検査制約、テーブル設計、チューニング

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問3:〔注文トランザクションの設計〕 について(1)、(2)に答えよ。

問題文を見る
(1)次のTR1〜TR4のうち、いずれか二つの組合せのトランザクションを同時に実行したとき、デッドロックが起きるおそれがある。 次の表中の (ウ)〜(カ) に、デッドロックが起きない組合せには○を、起きるおそれがある組合せには×を記入せよ。  TR1:単品商品2個を注文する。  TR2:単品商品1個とセット商品1個を注文する。  TR3:セット商品1個を注文する。 TR4:セット商品2個を注文する。 データベーススペシャリスト試験(平成26年 午後1 問3 設問3-1)

模範解答

ウ:× エ:× オ:〇 カ:×

解説

解答の導き方

まず問題文からデッドロック解析に必要な事実を取り出します(短い引用を含めます)。
  • 「注文単位を一つのトランザクションで処理し、最後に COMMIT 文を発行する。」→ 各トランザクションは最後までロックを保持する(コミットまで解放されない)。
  • 「商品一覧画面に表示された順番に…‘在庫’テーブルの引当可能数を調べ、…更新する。」→ 注文処理は、顧客が見た「表示順」に従って各商品の在庫行を順に参照・更新する(=表示順がロック取得の順序になる)。
  • 「‘セット商品構成’テーブルから、主キー順に当該セット商品を構成する単品商品の構成数を調べ」→ セット商品を処理する際、当該セットの構成単品は「主キー順」(=単品の商品番号等の昇順と想定)で調べ、順に在庫行を更新(=その順でロックを取得)する。
  • ISOLATIONレベルはREAD COMMITTED → 更新のための排他ロックはコミットまで保持される。
これらからトランザクションが行うロック取得順は次のようにモデル化できます(擬似手順を平文で示します)。
  • 全商品の処理は「表示順」に従う。
  • 各商品pに対して
    • pが単品なら、在庫行 在庫[p] を取得(更新ロック)する。
    • pがセットなら、在庫行 在庫[セットp] を取得し(セット行の更新)、不足なら「セット商品構成」を主キー順に読み、その主キー順で各構成単品の在庫行 在庫[c] を順に取得する。
デッドロックは「循環待ち」が発生するときに起きます。したがって、2つのトランザクションが同じ在庫行群に対して逆順でロックを取得し得るとき、デッドロックの恐れがあります。重要なのは「表示順による順序」と「セット構成の主キー順による順序」は独立であり、矛盾(逆順)が生じ得ることです。以下、各組合せについて「デッドロックが起きる具体的な実例(存在を示す)」または「どのようにして常に起きないか(不在の証明)」を示します。実例では説明を簡潔にするため、単品をA,B,C、セットをS1,S2と名付けます(問題文の条件に反しない任意の選択として扱います)。
  1. TR1(単品2個) vs TR2(単品1個+セット1個) → (ウ)×
    • 構成例(可能な表示順とセット内容を一例として選ぶ):
      • 表示順(画面の並び): S1 → B → A → …
      • セットS1の構成単品(主キー順): A, B(つまりセット処理はA → Bの順で在庫行を触る)
    • 並列の取り得る実行順(相互作用の一例):
      • TR1(単品注文A,B) は表示順に従ってBを先に処理 → 在庫[B] をロックし次にAに進む。
      • TR2(単品BとセットS1)は表示順に従ってS1を先に処理 → 在庫[S1](セット行)をロックし、主キー順で構成単品Aをロックし次にBをロックしようとする。
    • 相互作用(デッドロック発生の流れ):
      • TR1が在庫[B] をロックする。
      • TR2が在庫[S1] をロックし、在庫[A] をロックする。
      • TR1が在庫[A] を要求するがTR2が保持しているため待ち。
      • TR2が在庫[B] を要求するがTR1が保持しているため待ち。
      • よってTR1 →(Aを待つ)→ TR2 →(Bを待つ)→ TR1となり循環待ち(デッドロック)。
    • 結論:条件に合う表示順やセット構成があり得るため、デッドロックが起きるおそれがある(×)。
  2. TR1(単品2個) vs TR3(セット1個) → (エ)×
    • 構成例:表示順: B → A → …、セットS1の構成単品はA, B(主キー順A→B)とする。
    • 相互作用(代表的なタイミング):
      • TR1は表示順でBを先に処理して在庫[B] をロックする。次にAを処理しようとする。
      • 同時にTR3はセットS1を処理し、在庫[S1] をロックしてから主キー順で在庫[A] をロックする。
      • 結果、TR1は在庫[A] のロック要求で待ち(TR3が保持)、TR3は在庫[B] のロック要求で待ち(TR1が保持)。
      • 循環待ちが発生するためデッドロック。
    • 結論:よってデッドロックが起きるおそれがある(×)。
  3. TR3(セット1個) vs TR3(セット1個) → (オ)○
    • 理由(一般的な不発生の証明):
      • あるセットsを処理する際のロック取得順は「表示順でのそのセットの位置」→「そのセットの構成単品を主キー順(=単品番号昇順)で順に取得」です。
      • したがって「(セットの表示位置)を一次キー、(構成単品の商品番号)を二次キーとする辞書順」で表される全てのロック取得キーが定まります。
      • どのトランザクションもセット群を表示順で巡り、各セットの構成を主キー順で処理するため、任意の2つのセット専用トランザクションは同じ全体順序に従ってロックを取得します。
      • 同一の(全体)単調順序に従ってロックを取る場合、逆順で取得することがないため循環待ちは発生しません。
    • 結論:よって、セットのみのトランザクション同士ではデッドロックは起きない(○)。
  4. TR3(セット1個) vs TR4(セット2個) → (カ)×
    • 構成例(存在証明用): 単品A,B,C、セットS1 = {A,B}(主キー順A→B)、S2 = {B,C}(主キー順B→C)。表示順はS2 → S1 → … とする。
    • TR3はS1の処理(在庫[S1] をロック→Aをロック→Bをロック)。
    • TR4は表示順に従ってS2を先に処理し、在庫[S2] → B → Cとロックし、その後S1を処理してA → Bとロックしようとする。
    • 相互作用(代表的なタイミング):
      • TR4がまず在庫[B](S2の構成)をロックする。
      • TR3が在庫[A] をロックする。
      • TR3が次に在庫[B] を要求するがTR4が保持しているので待ち。
      • TR4がその後S1の処理で在庫[A] を要求するがTR3が保持しているので待ち。
      • TR3とTR4の間でAとBを巡る循環待ちが発生するためデッドロック。
    • 結論:よってデッドロックが起きるおそれがある(×)。
以上の個別検討により、空欄の正しい判定は次のとおりです。
ウ:×
エ:×
オ:○
カ:×
(補足)行ないの順序や「表示順」・「主キー順」の取りうる組合せが鍵で、問題は「存在可能性」を問う形式です。上の具体例はいずれも問題文の仕様に矛盾しない(表示順は商品企画担当者が決める、一意である、セット構成は主キー順で読む、等)ため、該当組合せでデッドロックがおきるおそれがあることの実在的な根拠になります。

誤りやすいポイント

  • 「同じ種類のトランザクションなら安全」と安易に決めつける誤り。トランザクションの種類が同じでも、注文する具体的な商品(どの単品・どのセット)や表示順の差でデッドロックが発生する場合がある。
  • セット処理で「セット行だけロックする」と誤認する誤り。セットが不足する場合は構成単品の在庫行も順にロックする点を見落とすと説明が破綻する。
  • ロック順序の基準を混同する誤り。単品は「表示順」で、セットの構成は「主キー順」でロックする、という二つの独立した順序がある点を明確にする。
  • 「READ COMMITTEDならデッドロックは起きない」との誤解。隔離レベルは読み取りの可視性に関わるが、更新ロックの保持(コミットまで)はあり得るため循環待ちが発生する。

FAQ

Q: TR3(セットのみ)同士はなぜ必ず安全なのですか?
A: 各トランザクションは「セットの表示順」→「そのセットの構成単品を主キー順」という決まった辞書順でロックを取得します。全トランザクションが同一の全体順序に従うため、逆順で取得することがなく循環待ちが発生しません。
Q: 表示順を工夫すればデッドロックを防げますか?
A: 可能性はあります。全てのトランザクションが従う一意の「全体的なロック順(例:表示順→主キー順の辞書順)」を設計・運用で保証すればデッドロックを抑制できます。ただし実運用では表示順をユーザ要件で固定することが多く、全てのケースで保証するのは難しいため、待ち検出やタイムアウト、アプリ側でのロック順制御などの対策も検討します。
Q: READ COMMITTEDのままで防ぐ簡単な対策はありますか?
A: アプリケーション側でロック取得の順序を揃える(たとえばセットを処理する前に、必要となる単品の在庫行を表示順ではなく主キー順で先にロックするなど)か、短期のリトライ(デッドロック検出時に再試行)を実装することが現実的です。

関連キーワード: デッドロック、ロック順序、トランザクション分離レベル、行レベルロック、主キー順

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問3:〔注文トランザクションの設計〕 について(1)、(2)に答えよ。

問題文を見る
(2)(1)で起きるおそれがあるとしたデッドロックを防ぐためには、一つのトランザクションの中で“在庫” テーブルの行をどの列の順番で更新すればよいか。 列名を答えよ。

模範解答

商品番号

解説

解答の論理構成

  1. トランザクション仕様
    「(3) 商品については、商品一覧画面に表示された順番に…更新する」「(5) ISOLATIONレベルは,READ COMMITTED」とある。
    → 更新時点で行ロックを取得する。
  2. デッドロックの発生パターン
    • 取引A:表示順が〔200→300〕
    • 取引B:表示順が〔300→200〕
      Aが商品番号200をロック→Bが300をロック→Aが300待ち→Bが200待ち で循環待ち。
  3. 防止策
    全トランザクションで同一順序でロック取得すれば循環は起きない。主キー「商品番号」は「PRIMARY KEY」として表2・表3に定義され、全商品で一意。
  4. よって更新は「商品番号」の順で行う。

誤りやすいポイント

  • 「表示順」が指定されているのでそれを使うと思い込む。表示順は顧客操作や商品追加で変化し、統一順にならない。
  • 行ロックよりテーブルロックを想定し、「ロックは一つだからデッドロックしない」と誤解。READ COMMITTEDでは行単位ロックが基本。
  • 注文明細番号や登録順を使うと、一部商品だけを更新する別トランザクションとの間で順序不一致が起き得る。

FAQ

Q: 表示順を昇順にそろえてもデッドロックは防げますか?
A: 顧客ごとに表示される商品が異なるため、同じ昇順にしても最初に取得する行が違う商品になる場合があります。全トランザクションが必ず保持する列で順序を合わせる必要があり、主キー「商品番号」が最適です。
Q: READ COMMITTEDでなくSERIALIZABLEにすれば解決しますか?
A: SERIALIZABLEでもロックは行単位で取得され、取得順が異なればデッドロックは発生します。順序統一は不可欠です。
Q: トランザクション全体を商品種別(単品/セット)で分けても良いですか?
A: 種別ごとにロックを分けても、同じ種別内の複数行を異順序で取得するケースが残るので根本解決にはなりません。

関連キーワード: デッドロック、行ロック、主キー、ロック順序、READ COMMITTED

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリストを
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について