データベーススペシャリスト試験 2013年 午後1 問01
データベースの基礎理論に関する次の記述を読んで、設問1〜3に答えよ。
M社は,Web上のSNS, ブログなど (以下, Web サービスという)のアクセスログデータを分析するサービスを提供している。M 社では,契約している Web サービスのサービスプロバイダ(以下,プロバイダという)に登録された利用者を対象として,Web サービスのアクセスログをとり、様々な観点から分析する情報システム(以下,本システムという)を,新たに構築することになった。
本システムは,Web サービスのリソース (SNS, ブログなどのページ)にアクセスした利用者の情報を収集する。具体的には,利用者のプロフィール情報の収集,利用時の位置情報の収集などである。 M 社では,これらの機能によって、利用者の行動傾向などを時間的・空間的に分析することを目指している。 本システムを構築するに当たって,具体例を用いて検討しながら,関係スキーマを設計することにした。本システムのデータモデルで検討した関係スキーマは,図1のとおりである。
図3〜5 は,図2の関数従属性の表記法に従って,属性間の関数従属性を表したものである。図1,図3〜5の属性とその意味及び制約を,表1に示す。







〔利用者の行動傾向分析〕
利用者の行動傾向分析を行うために,関係“所属” 及び関係 “アクセスログ”に対して内自然結合演算及び射影演算を行い,関係 “利用実績” を作成した。 表 2, 3 は,関係 “所属”及び関係 “アクセスログ” の具体例である。 表4は, 表2及び表3に対する演算結果の関係 “利用実績” の具体例である。



データベースの基礎理論に関する次の記述を読んで、設問1〜3に答えよ。
設問1:関係“名寄せ”, “利用者” 及び図 3, 4について,(1)〜(3)に答えよ。
(1)図3の関係 “名寄せ” の候補キーを全て答えよ。模範解答
{プロバイダID,利用者ID}
解説
解答の論理構成
- 【問題文】の図3は「関係“名寄せ”,“利用者”の属性間の関数従属性」と明記されている。
- 図2の凡例より,矩形A→矩形Bの矢印は “A → B” を意味する。
- 図3で中央の太枠に格納された{プロバイダID,利用者ID}から,上部の「名寄せID」へ矢印が伸びているため
が成立する。 - 名寄せID からプロバイダID・利用者ID に向かう矢印は存在しない。従って
である。 - 関係“名寄せ”(プロバイダID,利用者ID,名寄せID)で全ての属性を関数的に決定できる最小属性集合を列挙すると,{プロバイダID,利用者ID}のみが該当し,これが候補キーとなる。
誤りやすいポイント
- 「名寄せID は一意に識別するID」とあるため単独キーと決め付ける。矢印の向きを無視すると誤答になる。
- {プロバイダID,利用者ID}のどちらか片方だけでキーになると誤解する。図3では二つがセットになって初めて名寄せID を決定している。
- 関数従属性の集合全体ではなく,図3に描かれた部分のみを見て候補キーを判定すべき点を見落とす。
FAQ
Q: 名寄せID が一意なら候補キーにできないのですか?
A: 図3に「名寄せID → プロバイダID, 利用者ID」を示す矢印がないため,名寄せID 単独では他属性を決定できる保証がありません。候補キーの判定は 必ず関数従属性に基づいて 行います。
A: 図3に「名寄せID → プロバイダID, 利用者ID」を示す矢印がないため,名寄せID 単独では他属性を決定できる保証がありません。候補キーの判定は 必ず関数従属性に基づいて 行います。
Q: 図3に示されていない追加の業務規約を想定しても良いですか?
A: 試験では図・表に示された事実のみを前提とします。問題文外の想像で候補キーを追加すると誤答になります。
A: 試験では図・表に示された事実のみを前提とします。問題文外の想像で候補キーを追加すると誤答になります。
Q: 二つ以上の候補キーが存在する場合はすべて挙げる必要がありますか?
A: はい。設問に「全て答えよ」とある場合は列挙が必須です。本問は{プロバイダID,利用者ID}のみなので一つで完結します。
A: はい。設問に「全て答えよ」とある場合は列挙が必須です。本問は{プロバイダID,利用者ID}のみなので一つで完結します。
関連キーワード: 関数従属性, 候補キー, 主属性, データモデル, 正規化
設問1:関係“名寄せ”, “利用者” 及び図 3, 4について,(1)〜(3)に答えよ。
(2)図3の関係 “利用者” は, タプル挿入に関してどのような問題があるか。 その内容を, 35 字以内で具体的に述べよ。 また, 第3正規形に分解した関係スキーマを示せ。なお,分解した関係スキーマの関係名は任意とし, 主キーは実線の下線で示すこと。模範解答
内容:
・利用者ごとに,特性名,特性タイプが重複して登録される。
・特性値ごとに,生年月日,性別,郵便番号が重複して登録される。
・事前に特性 ID,特性名,特性タイプを登録しておくことができない。
関係スキーマ:
利用者(プロバイダID,利用者ID,生年月日,性別,郵便番号)
利用者特性(特性ID,特性名,特性タイプ)
利用者特性値(プロバイダID,利用者ID,特性ID,特性値)
解説
解答の論理構成
- “利用者” の候補キーを確認
- 図3より「プロバイダID」「利用者ID」「特性ID」が複合キーになっている。
- 関数従属性から異常を導出
- 「プロバイダID」「利用者ID」 → 「生年月日」「性別」「郵便番号」
- 「特性ID」 → 「特性名」「特性タイプ」
- しかし表自体は「プロバイダID」「利用者ID」「特性ID」が主キーなので、
「特性ID」が NULL の状態では行を持てず、利用者基本情報だけを先に登録できない。
- したがって挿入時の問題は
“特性ID未確定の利用者を登録できない” という挿入異常である。 - 正規化
部分従属性・推移従属性を除去し、第3正規形に分解。
利用者( ━プロバイダID━ , ━利用者ID━ , 生年月日, 性別, 郵便番号) 利用者特性( ━特性ID━ , 特性名, 特性タイプ) 利用者特性値( ━プロバイダID━ , ━利用者ID━ , ━特性ID━ , 特性値)
誤りやすいポイント
- 「特性値」ごとに「生年月日」などが重複する重複異常を“挿入異常”と混同する。
- 「特性名」「特性タイプ」まで主キーに含めてしまい、更に複雑な複合キーを作る。
- 第2正規形までの分解で止め、推移従属性(「特性ID」→「特性名」など)を残す。
FAQ
Q: 「削除異常」「更新異常」は答えなくても良いですか?
A: 設問は “タプル挿入に関して” と限定しているため、挿入異常のみを端的に述べれば十分です。
A: 設問は “タプル挿入に関して” と限定しているため、挿入異常のみを端的に述べれば十分です。
Q: 「利用者特性値」表に「生年月日」を残した方が問い合わせが楽では?
A: 正規化の目的は重複・不整合の防止です。冗長属性を残せば更新異常が再発するため、派生情報はビューや結合で取得します。
A: 正規化の目的は重複・不整合の防止です。冗長属性を残せば更新異常が再発するため、派生情報はビューや結合で取得します。
Q: 第3正規形に分解すると性能が落ちるのでは?
A: 分解は論理設計段階の話です。物理設計ではインデックスやビュー、場合によっては意図的な非正規化で性能を補えます。
A: 分解は論理設計段階の話です。物理設計ではインデックスやビュー、場合によっては意図的な非正規化で性能を補えます。
関連キーワード: 挿入異常, 第3正規形, 関数従属性, 複合主キー, 正規化
設問1:関係“名寄せ”, “利用者” 及び図 3, 4について,(1)〜(3)に答えよ。
(3)図4の関数従属性を,□ には属性名を記入し、図2中の凡例の欄に示した表記法に従って完成させよ。模範解答

解説
解答の論理構成
- 所属関係の決定項を特定
- 【表1】所属の説明
「利用者の所属する組織及び職種は、履歴が管理される。」
「利用者が所属する組織は、同時期には一つだけ登録できる。」 - 履歴のキーは{プロバイダID, 利用者ID, 所属登録日付}
- よって
{プロバイダID, 利用者ID, 所属登録日付}→{組織ID, 職種}
- 【表1】所属の説明
- 組織関係の決定項を特定
- 【表1】組織の説明
「組織情報(組織名称、郵便番号)は、履歴が管理される。」 - 履歴のキーは{組織ID, 組織登録日付}
- よって
{組織ID, 組織登録日付}→{組織名称, 郵便番号}
- 【表1】組織の説明
- 図2の表記法に合わせる
- 決定項を太枠の大きな長方形にまとめ、矢印を被決定項へ。
- ①の被決定項は「組織ID/所属登録日付」ブロックと「職種」
- ②の被決定項は「組織名称/郵便番号」ブロック
- 図4(完成版)は模範解答と一致する。
誤りやすいポイント
- 時間属性を外してしまう
履歴管理と書かれている場合、登録日付を含めないと一意性が保てません。 - 「職種」から他属性が決まると勘違い
実際には逆で、履歴キーが「職種」を決定します。 - 「組織ID」単独で名称が決まると考える
登録日付で名称が変わる可能性があるため、必ず「組織登録日付」を合わせます。
FAQ
Q: 日付型の列が決定項に入ると正規化が壊れるのでは?
A: 壊れません。履歴を保持する設計では日付を含む複合キーで第3正規形を維持します。
A: 壊れません。履歴を保持する設計では日付を含む複合キーで第3正規形を維持します。
Q: 「同時期には一つだけ登録できる」という文章はどのように解釈すればよいですか?
A: 「同一タイムスタンプで複数行は存在しない」ことを示し、登録日付を含む複合キーが一意である裏付けになります。
A: 「同一タイムスタンプで複数行は存在しない」ことを示し、登録日付を含む複合キーが一意である裏付けになります。
Q: 「組織登録日付」が NULL になるケースは考慮しなくてよいのですか?
A: 履歴管理列は必須入力とする設計が一般的なので NULL は入らない前提で機能従属性を定義します。
A: 履歴管理列は必須入力とする設計が一般的なので NULL は入らない前提で機能従属性を定義します。
関連キーワード: 関数従属性, 履歴管理, 複合主キー, 第3正規形, データモデリング
設問2:関係 “サービス提供リソース”及び図5について,(1),(2)に答えよ。
(1)図5の関係 “サービス提供リソース” の候補キーを全て答えよ。 また, 部分関数従属性,推移的関数従属性の有無を, “あり” 又は “なし” で答えよ。“あり”の場合は,その関数従属性の具体例を、図2 中の意味の欄に示した表記法に従って示せ。模範解答
候補キー:{ プロバイダID,サービス機能ID,利用者ID }
部分関数従属性の有無:なし
推移的関数従属性の有無:あり
部分関数従属性:
推移的関数従属性:
・{プロバイダID,サービス機能ID,利用者ID} →
リソースID
・{リソース名称,リソース種別,配信スキーマ}
・{プロバイダID,サービス機能ID,利用者ID} →
URI →
{リソース名称,リソース種別,配信スキーマ}
解説
解答の論理構成
- 図5の中央長方形には
プロバイダID,サービス機能ID,利用者ID|リソースID,タイムスタンプ
という配置が示されている。上下2段で区切られているが,その中間の縦線は論理的な境界を示すだけで,各行は1レコードである。 - 【問題文】「関係 “サービス提供リソース”(プロバイダID, サービス機能ID, 利用者ID, …)」より,行を一意に識別できる最小組合せを探す。
- プロバイダID 単独では,同じプロバイダが複数機能・利用者を持つ。
- サービス機能ID 単独でも,同一機能を複数プロバイダが提供し得る。
- 利用者ID 単独はプロバイダ内でしか一意でない。
結果,3属性を合わせた {プロバイダID,サービス機能ID,利用者ID} が最小の一意識別子=候補キー。
- 部分関数従属性の判定
部分関数従属性は “候補キーの真部分集合 → 非キー属性” が存在するときに生じる。図5にその矢印は描かれていないため なし。 - 推移的関数従属性の判定
- 図5下部の矢印
{プロバイダID,サービス機能ID,利用者ID} → リソースID
リソースID → {URI,リソース種別,リソース名称,配信スキーマ}
2段階で非キー属性が別の非キー属性を決定しており,推移的関数従属性 あり。
- 図5下部の矢印
- 以上より模範解答と一致する。
誤りやすいポイント
- 「サービス名称/管理者名」→サービス機能ID の矢印を見て“部分従属性あり”と誤判定。これは候補キーの一部ではなく別集合からの従属性なので該当しない。
- リソースID を候補キーに含めて {プロバイダID,サービス機能ID,利用者ID,リソースID} としてしまう。リソースID は他の3属性によって一意に決まる(従属性側)ため冗長。
- 推移的従属性を “URI → リソースID” と逆向きに読んでしまう。図では矢印の向きが決定側→従属側である点に留意。
FAQ
Q: プロバイダID や サービス機能ID が候補キーに必ず入る根拠は何ですか?
A: 【問題文】の関係スキーマが「プロバイダID, サービス機能ID, 利用者ID, …」で開始しており,さらに図5で3属性が同一枠内に配置され,外部へ出る矢印が存在するため,この3属性が行を識別する設計意図が読み取れます。
A: 【問題文】の関係スキーマが「プロバイダID, サービス機能ID, 利用者ID, …」で開始しており,さらに図5で3属性が同一枠内に配置され,外部へ出る矢印が存在するため,この3属性が行を識別する設計意図が読み取れます。
Q: 「サービス名称」や「管理者名」は正規化でどこに置くべきでしょうか?
A: サービス名称/管理者名 → サービス機能ID という従属性から,それらはサービス機能ID を主キーとする別関係(図5中の “Webサービス”)へ分離されており,サービス提供リソース表には含まれていません。
A: サービス名称/管理者名 → サービス機能ID という従属性から,それらはサービス機能ID を主キーとする別関係(図5中の “Webサービス”)へ分離されており,サービス提供リソース表には含まれていません。
Q: 推移的関数従属性があると,第何正規形に違反していますか?
A: 候補キー以外の属性間に推移的従属性が残っている状態は,第3正規形に不適合(第2正規形には適合)となります。
A: 候補キー以外の属性間に推移的従属性が残っている状態は,第3正規形に不適合(第2正規形には適合)となります。
関連キーワード: 関数従属性, 候補キー, 正規化, 推移的従属性, 第3正規形
設問2:関係 “サービス提供リソース”及び図5について,(1),(2)に答えよ。
(2)図5の関係 “サービス提供リソース”は,第1正規形,第2正規形, 第3正規形のうち、どこまで正規化されているかを答えよ。 また, 第3 正規形でない場合は,第3正規形に分解した関係スキーマを示せ。 なお,分解した関係スキーマの関係名は任意とし、主キーは実線の下線で示すこと。模範解答
正規形:第2正規形
サービス提供(プロバイダID,サービス機能ID,利用者ID,リソースID,利用者登録日付)
関係スキーマ:リソース(リソースID,リソース名称,URI,リソース種別,配信スキーマ)
解説
解答の論理構成
-
候補キーの決定
図5では “プロバイダID”,“サービス機能ID”,“利用者ID” をまとめた箱から “リソースID”, “利用者登録日付” へ矢印があります。よって
{プロバイダID, サービス機能ID, 利用者ID} → リソースID, 利用者登録日付
が成り立ち、この3項目が候補キーになります。 -
第1正規形確認
いずれも単一値属性なので第1正規形は満たします。 -
第2正規形確認
部分従属を調べると、キーの真部分集合(例:プロバイダIDだけ 等)が非キー属性を決定する矢印は存在しません。したがって第2正規形を満たします。 -
第3正規形違反の検出
リソースID → URI, リソース種別, リソース名称, 配信スキーマ
が存在し、リソースIDは候補キーではありません。これは推移従属性に該当し第3正規形違反です。 -
分解
① キーに従属する属性を残した
サービス提供(プロバイダID, サービス機能ID, 利用者ID, リソースID, 利用者登録日付)
② 推移従属性を受け止める新関係
リソース(リソースID, リソース名称, URI, リソース種別, 配信スキーマ)
分解後は
・情報損失なし(自然結合で元に復元可能)
・関数従属性保存(②の従属を新関係に残存)
・各関係ともキー以外の属性がキーに完全従属し、推移従属がない
ため第3正規形が成立します。
誤りやすいポイント
- 「リソースIDを候補キーの一部」と思い込み、第1正規形どまりと判断してしまう。
- “利用者登録日付” を “リソースID” で決まると誤解し、分解を誤る。
- “プロバイダID” と “サービス機能ID” の組でリソースが一意と誤認し、候補キーを縮小してしまう。
FAQ
Q: “リソースID” を候補キーに入れてはいけないのですか?
A: 図5の矢印が “リソースID” へ向かっているため、 “リソースID” は決定項ではなく被決定項です。したがって候補キーに含めると「キーが自分自身を決定する」矛盾が生じます。
A: 図5の矢印が “リソースID” へ向かっているため、 “リソースID” は決定項ではなく被決定項です。したがって候補キーに含めると「キーが自分自身を決定する」矛盾が生じます。
Q: 第3正規形に分解すると検索性能が落ちませんか?
A: 正規化は更新時の異常排除が主目的です。検索頻度が高い場合はビューや冗長列を追加する「物理設計」で対応し、論理設計段階ではまず正規化に従うのが定石です。
A: 正規化は更新時の異常排除が主目的です。検索頻度が高い場合はビューや冗長列を追加する「物理設計」で対応し、論理設計段階ではまず正規化に従うのが定石です。
関連キーワード: 正規化, 関数従属性, 第2正規形, 第3正規形, 推移従属性
設問3:表2〜4 について(1)〜(3)に答えよ。
(1)表 4 の関係 “利用実績”には,アクセスした時点の利用者の所属を前提にした場合に現れてはならないタプルがある。 そのタプルの番号を全て答えよ。模範解答
②
解説
解答の論理構成
-
前提
- 関係“所属”は履歴管理されるため、同一キーで複数レコードが保持される(表2)。
- 「アクセスした時点の利用者の所属を前提」とは、
タイムスタンプ
時点で有効な 1 件に限定することを意味する。
-
内自然結合の結果(表4)
- 内自然結合は キー属性「プロバイダID」「利用者ID」で単純に結合するため、有効・無効を区別せずタプルを生成する。
- 取得後に「アクセス時点の有効性」フィルタを掛けなければならない。
-
各タプルの検証
-
結論
有効性を満たさないのはタプル ② のみ。
誤りやすいポイント
所属登録日付
とタイムスタンプ
の大小関係を見落とし、「最新=最大日付」と短絡してしまう。- 履歴管理の有効判定を忘れ、内自然結合だけで正答だと判断する。
- 複数の“所属”レコードがある利用者(A,1)を例外なく評価対象とする必要に気付かない。
FAQ
Q: 「所属登録日付が同じ利用者に複数存在する」場合はどう扱いますか?
A: 問題文に追加条件が無い限り、
A: 問題文に追加条件が無い限り、
タイムスタンプ
以前で最も新しい(=最大の)所属登録日付
を採用し、同日付で複数あればすべてが候補になります。Q: 自然結合ではなく外部結合を使うと結果は変わりますか?
A: 今回は「内自然結合」と明示されているため、アクセスログに該当する所属が存在しない利用者はそもそも除外されます。外部結合なら NULL 行が残る可能性がありますが、本設問の判定基準とは異なります。
A: 今回は「内自然結合」と明示されているため、アクセスログに該当する所属が存在しない利用者はそもそも除外されます。外部結合なら NULL 行が残る可能性がありますが、本設問の判定基準とは異なります。
Q: 履歴管理を正確に表現する SQL 例は?
A: 代表的にはウィンドウ関数
A: 代表的にはウィンドウ関数
ROW_NUMBER()
を用いて「タイムスタンプ以前で最新」の行を 1 件に絞り込む方法が知られています。関連キーワード: 内部結合, 履歴管理, 時系列データ, 主キー, データ整合性
設問3:表2〜4 について(1)〜(3)に答えよ。
(2)表4の関係 “利用実績” のタプルに現れない利用者がある。 どのような条件に当てはまる利用者か。 25字以内で述べよ。模範解答
・関係“アクセスログ”にタプルがない利用者
・まだアクセスしていない利用者
解説
解答の論理構成
- 問題文は次の通り述べています。
――【問題文】「関係“所属” 及び関係 “アクセスログ”に対して内自然結合演算及び射影演算を行い,関係 “利用実績” を作成した。」 - 内自然結合は,指定された属性値が両関係で一致する行だけを残し,片方にしかない行は削除します。
- したがって,
・“所属”には行があるが,“アクセスログ”に行が無い利用者
は結合条件を満たさず“利用実績”に現れません。 - 具体例
表2にある「プロバイダID=B・利用者ID=2」は表3に無く,表4にも現れません。 - よって「“アクセスログ”にタプルが無い=まだアクセスしていない」利用者が条件となります。
誤りやすいポイント
- 「自然結合=外部結合」と誤解して,片方に無い行も残ると思い込む。
- “所属”側に無い利用者が落ちると考え,“アクセスログ”側だけを見落とす。
- 表4の欠損を単なる抜粋だと誤認し,結合演算の性質を見逃す。
FAQ
Q: なぜ外部結合を使わなかったのですか?
A: 問題文に明示的に「内自然結合演算」と書かれているため,外部結合の結果を考慮する設計ではありません。
A: 問題文に明示的に「内自然結合演算」と書かれているため,外部結合の結果を考慮する設計ではありません。
Q: “アクセスログ”に一度でも行があれば必ず“利用実績”に出ますか?
A: はい。同一の「プロバイダID」「利用者ID」が“所属”にも存在すれば,自然結合で対応行が生成されます。
A: はい。同一の「プロバイダID」「利用者ID」が“所属”にも存在すれば,自然結合で対応行が生成されます。
関連キーワード: 自然結合, 内結合, タプル欠落, アクセスログ, 関係演算
設問3:表2〜4 について(1)〜(3)に答えよ。
(3)(2)の現れない利用者も表 4 の関係 “利用実績” のタプルに現れるようにするためには,内自然結合演算をどのような演算に変更すればよいか。 30 字以内で述べよ。模範解答
・関係“所属”を左とする左外自然結合演算
・関係“所属”のタプルを全て出力する外自然結合演算
解説
解答の論理構成
-
現状の演算
①【問題文】「関係“所属” 及び関係 “アクセスログ” に対して内自然結合演算 … を行い,関係 “利用実績” を作成」とある。
② その結果,表4では“所属”に存在する(プロバイダID=A, 利用者ID=1, 職種=営業, 所属登録日付=2013-04-15)
などは写っているが,「表3に行が無い利用者」は出力されない。 -
要件の確認
【小問説明】「現れない利用者も…タプルに現れるように」とある。つまり“所属”の行は全て残す必要がある。 -
外部結合の性質
- 左外自然結合演算:左関係の全組を保持し,右に対応する組が無ければ
NULL
を付与する。 - 右外・完全外では左側の残り方が要件を満たさない/冗長。
- 左外自然結合演算:左関係の全組を保持し,右に対応する組が無ければ
-
結論
よって「内自然結合演算」を「関係“所属”を左とする左外自然結合演算(または“所属”のタプルを全て出力する外自然結合演算)」に変更する。
誤りやすいポイント
- 単に「外部結合」と書いて左右を示さない
⇒ 右外結合にすると目的を達成できない。 - 「完全外結合」を選択
⇒ 余計に“アクセスログ”のみの行まで加わり,設問の趣旨とずれる。 - SQL 用語の
LEFT JOIN
だけを書く
⇒ リレーショナル代数の記号論である「左外自然結合演算」を明示すべき。
FAQ
Q: 「左外自然結合演算」と「外自然結合演算」は同じ意味ですか?
A: 設問の文脈では、「左外自然結合演算」と「“所属”のタプルを全て出力する外自然結合演算」は同義です。要は“所属”が必ず残る外部結合であれば評価対象となります。
A: 設問の文脈では、「左外自然結合演算」と「“所属”のタプルを全て出力する外自然結合演算」は同義です。要は“所属”が必ず残る外部結合であれば評価対象となります。
Q: “アクセスログ”を左側に置いた場合はどうなりますか?
A: “アクセスログ”に無い利用者が依然として落ちるため要件を満たしません。常に“所属”を左側に置く必要があります。
A: “アクセスログ”に無い利用者が依然として落ちるため要件を満たしません。常に“所属”を左側に置く必要があります。
関連キーワード: 左外結合, 外部結合, 自然結合, NULL, 射影