令和6年度 春期 応用情報技術者試験 午後 問6 SaaSマルチテナント化のスキーマ設計

学習ガイド

SaaSとして提供する人事評価システムのマルチテナント化を題材に、E-R図・SQL・スキーマ設計を問うデータベースの問題です。単一データベース・単一スキーマ方式と個別スキーマ方式を比較検討する流れの中で、ビュー定義や権限の設計がどう変わるかを追います。SQLの空欄補充も、どの方式を選んだ帰結として何が必要になるのかを意識すると根拠が明確になります。方式比較の観点整理から始めましょう。

この記事で押さえる論点

  • E-R図の関連とSQL文の空欄を対応させて埋める
  • 単一スキーマと個別スキーマ方式の利点・欠点を比較する
  • ビューを使ったテナント分離設計の留意点を説明する

問題本文

人事評価システムの設計と実装に関する次の記述を読んで,設問に答えよ。

K社は,人事評価システムを中小企業に提供するSaaS事業者である。現在は,契約している会社ごとに仮想サーバを作成して,その中にデータベースを個別に作成している。現在のシステムのOSやフレームワークのサポート期限が迫ってきたのを機に,機能は変更せずにサーバリソース最適化を目的として,システムを再構築することにした。

〔人事評価システムの機能概要〕

人事評価システムの機能概要を表1に示す。

表1 人事評価システムの機能概要
図の説明テキスト

表1 人事評価システムの機能概要

機能名 概要
祝日管理 国民の祝日に加えて,創立記念日などの会社ごとの記念日を年月日で管理する。
入社 従業員が入社した際,従業員番号を割り振り,配属先の部署及び入社年月日を登録する。
評価者管理 部署の管理者を評価者として登録する。1人の従業員が複数の部署を管理する場合がある。管理者の評価者は,評価時に個別に設定する。
目標設定 年度の始めに,その年度の目標を設定する。目標は複数設定することができ,重要度や達成までの期間などを考慮して重み付けする。
実績入力 年度の終わりに,その年度の実績を入力する。実績は,年度の始めに設定した目標に対して,実績内容や目標達成度を自己評価として記入する。
評価 年度の終わりに,管理者は評価対象の従業員が設定した目標とそれに対する実績を評価して,評価内容や達成度合を記入する。
退職 従業員の退職が決まると,その退職年月日と在籍期間を登録する。さらに,部署の管理者や人事部が対象の従業員にヒアリングした退職理由を登録する。
退職分析 人事部の管理者が自社及び自社と同じ業種の退職者について,在籍期間と退職理由を分析する。

〔単一データベース・単一スキーマ方式の検討〕

データベースのリソースを最適化するために,会社ごとに個別に作成していたデータベース及びスキーマを一つにまとめることを考える。検討したE-R図を図1に示す。
なお,再構築するシステムでは,E-R図のエンティティ名を表名に,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。

図1 E-R図
図の説明テキスト

図1 E-R図
以下のエンティティが描画されている:

  • 会社(主キー:会社番号)
  • 会社記念日(主キー:会社番号、会社記念日)
  • 国民の祝日(主キー:祝日)
  • 従業員(主キー:従業員番号。外部キー:会社番号、部署番号)
  • 部署(主キー:会社番号、部署番号。管理者番号あり)
  • 退職(主キー:会社番号、従業員番号)
  • 目標(主キー:会社番号、従業員番号、目標設定年度、目標番号)
  • 実績(主キー:会社番号、従業員番号、目標設定年度、目標番号)
  • 評価(主キー:会社番号、従業員番号、目標設定年度、目標番号。外部キー:管理者番号)

各エンティティ間には、1対1、1対多、多対多の関係を示す矢印が結ばれている。従業員から部署に向かう矢印(多対多を示す直線上に片方向矢印)の横には空欄 a がある。
凡例と注記:属性名の実線の下線は主キー、破線の下線は外部キーを示す。主キーの実線が付いている属性名には、外部キーの破線を付けない。

図1を関係データベースに実装した際のSQL文を考える。

(1) 指定された会社と年度における,国民の祝日と会社記念日の一覧を日付の昇順に出力するSQL文を図2に示す。ここで “:会社番号” は指定された会社の会社番号を,“:年度開始日”,“:年度終了日” は,それぞれ指定された年度の開始日,終了日を表す埋込み変数である。

図2 国民の祝日と会社記念日の一覧を日付の昇順に出力するSQL文
図の説明テキスト

図2 国民の祝日と会社記念日の一覧を日付の昇順に出力するSQL文

SELECT 祝日 AS 日付, 祝日名 AS 日付名
FROM 国民の祝日
WHERE 祝日 [ <span id="q6_blank_b" class="blank-label">b</span> ]
UNION ALL
SELECT 会社記念日 AS 日付, 会社記念日名 AS 日付名
FROM 会社記念日
WHERE 会社番号 = :会社番号
  AND 会社記念日 [ <span id="q6_blank_b" class="blank-label">b</span> ]
[ <span id="q6_blank_c" class="blank-label">c</span> ] 日付

空欄bが2箇所、空欄cが1箇所存在する。

(2) 指定された管理者が評価する対象の従業員の一覧を部署番号,従業員番号の昇順に出力するSQL文を図3に示す。ここで“:会社番号”と“:管理者番号”は,それぞれ指定された管理者の会社番号と従業員番号を表す埋込み変数である。

図3 従業員の一覧を部署番号, 従業員番号の昇順に出力する SQL 文
図の説明テキスト

図3 従業員の一覧を部署番号, 従業員番号の昇順に出力する SQL 文

SELECT DEP.部署番号, DEP.部署名, EMP.従業員番号, EMP.従業員氏名
FROM 従業員 EMP INNER JOIN 部署 DEP
ON EMP.会社番号 = DEP.会社番号
  AND [ <span id="q6_blank_d" class="blank-label">d</span> ]
  AND EMP.会社番号 = :会社番号
  AND DEP.管理者番号 = :管理者番号
[ <span id="q6_blank_c" class="blank-label">c</span> ] DEP.部署番号, EMP.従業員番号

注記: [ c ] には,図2中の [ c ] と同じ字句が入る。

〔単一データベース・単一スキーマ方式のレビュー〕

検討した単一データベース・単一スキーマ方式のレビューを受けたところ,次の指摘とアドバイスを受けた。

・指摘

この検討案は,サーバリソース最適化を実現することができるが,SQLインジェクションの脆弱性が見つかってしまった場合,多くの情報が漏えいしてしまうおそれがある。

・アドバイス

データベースは一つのまま,システム全体で共有するデータだけを格納する共有用のスキーマと,①システム利用者の会社ごとのスキーマに分ける方式にするとよい。共有用のスキーマに作成した表は,会社ごとのスキーマに対象の表と同じ名前のビューを作成して照会できるようにすると,現在のシステムのSQL文への修正を少なくすることができる。

〔単一データベース・個別スキーマ方式の検討〕

〔単一データベース・単一スキーマ方式のレビュー〕のアドバイスを受け,複数のスキーマを作成して各スキーマに表とビューを配置する。検討したスキーマを整理した結果を表2に示す。

表2 スキーマを整理した結果
図の説明テキスト

表2 スキーマを整理した結果

スキーマ種類 スキーマ名 配置する表 配置するビュー
共有用 PUB 会社, 国民の祝日 -
個別会社用 Cxxx
(xxx は任意の英数字)
会社記念日, 従業員, 部署, 目標, 実績, 評価, 退職 会社,
国民の祝日

次に,ビューを作成するSQL文について考える。
スキーマ C001 に国民の祝日ビューを作成するSQL文を図4に示す。

図4 国民の祝日ビューを作成する SQL 文
図の説明テキスト

図4 国民の祝日ビューを作成する SQL 文

CREATE VIEW [ <span id="q6_blank_e" class="blank-label">e</span> ] (祝日, 祝日名)
AS SELECT 祝日, 祝日名
FROM [ <span id="q6_blank_f" class="blank-label">f</span> ]

〔単一データベース・個別スキーマ方式のレビュー〕

検討した単一データベース・個別スキーマ方式のレビューを受けたところ,次の指摘を受けた。
・システム利用者ごとに,利用するスキーマを指定するために,g表にh列を追加する必要がある。
・表2の表とビューの配置のままでは②利用できない機能があるので,③配置を一部見直す必要がある。

レビューで受けた指摘に全て対応することで,システムを再構築することができた。

設問と解答・解説

(1)配点 2点

図1中の 空欄a に入れる適切なエンティティ間の関連を答え,E-R図を完成させよ。
なお,エンティティ間の関連の表記は,図1の凡例に倣うこと。

模範解答

→

採点基準

正確性(内容)2点
  • 2点: 「→」と記述し、エンティティ間の関連を凡例に従って正確に示している。
  • 1点: 関連の方向や多重度は理解しているが、凡例に完全には従っていない表記となっている。
  • 0点: 不正解。関連の記述が誤っている。

解説

本問は、SaaS事業者が提供する人事評価システムの マルチテナント化 を題材としており、E-R図の基本的な理解を問う問題です。

  • 設問の要件に従い、エンティティ間の関連を凡例通りの記号で答える必要があります。
  • 関連するエンティティ同士が1対多の構造であることを理解しているかが問われます。

高得点のポイント

  • エンティティ間の 多重度 を正確に把握していること。
  • 指定された凡例(→)に正しく従っていること。
(2)配点 2点

図2中の 空欄b に入れる適切な字句を答えよ。

模範解答

BETWEEN :年度開始日 AND :年度終了日

採点基準

正確性(内容)2点
  • 2点: 「BETWEEN :年度開始日 AND :年度終了日」と正確に記述し、SQL文における期間指定を正しく理解している。
  • 1点: 期間指定の意図は読み取れるが、SQL構文として軽微な誤りがある。
  • 0点: 不正解。期間指定のSQL文として成立していない。

解説

SQL文における基本的な構文の理解を問う問題です。

  • 特定の期間内に含まれるデータを抽出するためには、境界値を含む範囲指定を行う必要があります。
  • ここでは :年度開始日 と :年度終了日 の範囲を指定するための構文が求められます。

高得点のポイント

  • 期間検索や範囲検索における BETWEEN 句の構文を正確に記述できていること。
(3)配点 2点

図2及び図3中の 空欄c に入れる適切な字句を答えよ。

模範解答

ORDER BY

採点基準

正確性(内容)2点
  • 2点: 「ORDER BY」と正確に記述し、データの並び替えを行う句を正しく理解している。
  • 1点: 意図は読み取れるが、軽微なスペルミスなどがある。
  • 0点: 不正解。並び替えの句として成立していない。

解説

SQL文における結果セットの制御に関する理解を問う問題です。

  • 取得したデータを特定の列を基準にして並び替えるためには、適切な句を使用する必要があります。

高得点のポイント

  • データのソートを行うための ORDER BY 句の役割を正確に理解していること。
(4)配点 2点

図3中の 空欄d に入れる適切な字句を答えよ。

模範解答

EMP.部署番号 = DEP.部署番号

採点基準

正確性(内容)2点
  • 2点: 「EMP.部署番号 = DEP.部署番号」と正確に記述し、適切な結合条件を提示できている。
  • 1点: 結合条件の意図は正しいが、エイリアスの指定漏れなど軽微な誤りがある。
  • 0点: 不正解。結合条件として成立していない。

解説

複数テーブルの結合(JOIN)に関するSQLの基本的な理解を問う問題です。

  • 社員表(EMPEMP)と部署表(DEPDEP)を結合する際、両者を関連付けるための正しいキーを指定する必要があります。

高得点のポイント

  • 表の結合条件となる 外部キー と 主キー の対応関係を正しく記述していること。
  • テーブルのエイリアス(EMPEMP, DEPDEP)を適切に用いて列を指定できていること。

設問2

配点 1点

本文中の 下線① の方式にする利点は何か。20字以内で答えよ。

模範解答

漏れる情報を会社単位に制限できる。

採点基準

知識・理解度(内容)1点
  • 1点: マルチテナント環境において、データベースのデータ保護の観点から情報漏えいの被害範囲を会社単位に制限できるという利点を明記している。
  • 0点: 不正解。マルチテナントにおける情報漏えい被害範囲の限定について適切に言及されていない。

解説

データベースにおけるデータ保護の役割について、マルチテナント環境の特性を踏まえた理解を問う問題です。

  • マルチテナントにおいて情報漏えいが発生した場合、その被害範囲をできるだけ狭めることがセキュリティ対策上不可欠です。
  • スキーマを会社ごとに分けることで、万が一の漏えい時にも自社データのみに留めることが可能となります。

高得点のポイント

  • データ保護 の観点から、漏えいする情報を会社単位に制限できることを明記していること。
  • 指定された字数(20字以内)で簡潔かつ論理的にまとめていること。

設問2は,正答率が低かった。データ保護は,データベースの重要な役割の一つである。特に,マルチテナントにおいて情報漏えいの被害範囲をできるだけ狭めることが,セキュリティ対策を考える上で必要である。スキーマを会社ごとに分ける方式にすることで,何を実現できるのか。もう一歩踏み込んで考えてほしい。

設問3

(1)配点 2点

図4中の 空欄e に入れる適切な字句を答えよ。

模範解答

C001.国民の祝日

採点基準

正確性(内容)2点
  • 2点: 「C001.国民の祝日」と正確に記述し、スキーマをまたいだ参照方法を正しく理解している。
  • 1点: スキーマ修飾の意図は読み取れるが、軽微な誤記がある。
  • 0点: 不正解。正しい表の参照として成立していない。

解説

複数スキーマを用いた設計における、他スキーマのオブジェクト参照に関する理解を問う問題です。

  • マルチテナント設計において、各社個別のスキーマから共有データへアクセスするための正しい記述が求められます。

高得点のポイント

  • 個別スキーマ名と対象となる表名を正しく組み合わせて指定できていること。
(2)配点 2点

図4中の 空欄f に入れる適切な字句を答えよ。

模範解答

PUB.国民の祝日

採点基準

正確性(内容)2点
  • 2点: 「PUB.国民の祝日」と正確に記述し、共有用スキーマの参照方法を正しく理解している。
  • 1点: 共有スキーマ参照の意図は読み取れるが、軽微な誤記がある。
  • 0点: 不正解。共有スキーマの正しい参照として成立していない。

解説

共有用スキーマを用いたデータアクセス方法についての理解を問う問題です。

  • すべてのテナントから共通して利用されるデータは、共有用スキーマ(ここでは PUB)に配置され、そこを参照する必要があります。

高得点のポイント

  • 共有用スキーマの名称と表名を正しく繋いで指定できていること。
(1)配点 2点

本文中の 空欄g に入れる適切な字句を答えよ。

模範解答

会社

採点基準

正確性(内容)2点
  • 2点: 「会社」と正確に抽出し、分離単位を正しく示している。
  • 1点: 意図は通じるが、本文と厳密に一致しない表現を使用している。
  • 0点: 不正解。適切な字句が抽出されていない。

解説

単一データベース・個別スキーマ方式のレビューにおいて、データの論理的分離単位を問う問題です。

  • マルチテナントアーキテクチャでは、どの単位でデータを識別して分離するかが設計の要となります。

高得点のポイント

  • データを識別・管理する基本単位が 会社 であることを正しく理解していること。
(2)配点 2点

本文中の 空欄h に入れる適切な字句を答えよ。

模範解答

スキーマ名

採点基準

正確性(内容)2点
  • 2点: 「スキーマ名」と正確に抽出し、アクセス制御の要素を正しく示している。
  • 1点: 意図は通じるが、本文と厳密に一致しない表現を使用している。
  • 0点: 不正解。適切な字句が抽出されていない。

解説

マルチテナント環境におけるデータアクセスの仕組みを問う問題です。

  • ユーザーからの要求に応じて、どのテナントのデータにアクセスするかを決定するための情報が何かを把握する必要があります。

高得点のポイント

  • 接続先を振り分ける要素として スキーマ名 が用いられることを正しく理解していること。
(3)配点 2点

本文中の 下線② の機能を,表1の機能名から答えよ。

模範解答

退職分析

採点基準

正確性(内容)2点
  • 2点: 「退職分析」と正確に機能名を抜き出している。
  • 1点: 意図は通じるが、表の機能名と厳密に一致しない表現を使用している。
  • 0点: 不正解。要件に合致する機能を選択できていない。

解説

システムの機能一覧から、要件に合致する機能を特定する問題です。

  • 他社のデータを含めて照会・分析を行う機能がどれに該当するか、システムの全体像から読み解く必要があります。

高得点のポイント

  • 各機能の役割を理解し、他社データの照会を必要とする機能が 退職分析 であることを正しく紐付けられていること。
(4)配点 1点

本文中の 下線③ の見直した内容を,20字以内で答えよ。

模範解答

退職表を共有用スキーマに配置する。

採点基準

知識・理解度(内容)1点
  • 1点: 他社のデータも照会できるようにするために、各スキーマの役割を理解し、退職表を共有用スキーマに配置することを見直し内容として明記している。
  • 0点: 不正解。共有スキーマの役割に基づく適切な表の配置について言及されていない。

解説

単一データベース・個別スキーマ方式において、データ共有の要件を満たすための設計変更に関する理解を問う問題です。

  • 他社のデータも含めた照会(退職分析など)を行うためには、該当するデータが各社の個別スキーマに分断されていては非効率です。
  • したがって、全体で共有するデータは個別スキーマではなく、共通でアクセス可能な場所に移動する必要があります。

高得点のポイント

  • データ共有の要件を満たすための 表の配置見直し を具体的に記述していること。
  • 共有用スキーマ の役割を正しく理解し、退職表をそこに配置することを明記していること。

設問4(3)は,正答率がやや低かった。単一データベース・個別スキーマ方式において,他社のデータも照会できるようにするためには各表の配置をどうするべきか,各スキーマの役割を理解した上で解答してほしい。

Spineチーム