データベーススペシャリスト

作成日 : 2017-03-28
最終更新日 :

1.はじめに

私はデータベーススペシャリスト試験を何回か受けたが、すべて落ちた。 大変である。もう受験する気はない。

なお、この記事に載せていた SQLite3 に関する記事は別ページに回した。

データベースシステムは、大量のデータを効率よく格納し、正確に提供することが使命である。 要素技術にはいくつかある。

用語を参照してもらいたい。

2. 午前 2 の問題

再読み込みするたびに、過去の午前 2 の問題からランダムに1題を表示する。 選択肢の順番もランダムにしている。

3. 午前 Ⅰ の問題

2015年 問1 データベースの設計

インターネット上で書籍を販売する EC サイトの開設をテーマとした出題である。 問題文を抜粋する。

〔書籍の概要〕

1. 書籍

書籍は,単行本・新書・文庫本など,様々な書籍の形態で出版されている。

  1. 書籍作品とは,書籍の形態にかかわらない作品そのものであり,書籍のタイトルなどの属性をもつ。
  2. 形態別書籍とは,書籍作品は様々な書籍の形態で出版したものであり,出版社名,ページ数などの属性をもつ。
  3. (略)
  4. 著者役割とは,著者が著作に関わった際の役割である。例えば,‘著作者’,‘共著者’,‘原著者’,‘翻訳者’,‘監修者’などである。

主な属性とその意味・制約が表 1 にある。

表 1 主な属性とその意味・制約
属性名意味・制約
著者名著者の氏名。同姓同名の著者が存在する。
タイトル書籍作品のタイトル。異なる書籍作品のタイトルが同名である場合がある。
著者役割書籍役割の名称。異なる著者役割の著者役割名が同名である場合がある。

私は抽象的に考えるのが苦手だから、具体例をあてはめないとわからない。例えば最初、同姓同名の著者が存在する場合はどういうことなのだろうか。 作家の中からだけでは思い出せない。読み方が同じでジャンルも違えてよいなら、小林秀雄(評論家/作曲家)や石川淳(作家)/いしかわじゅん(漫画家)、 柳田国男(民俗学者)/柳田邦男(ジャーナリスト)などが思い出せる。外国の例なら、マイケル・ジャクソン(歌手/ビール評論家/コンピュータ科学者)などがある。

それで、同姓同名の著者がいる例はないかとインターネットで調べてみたら、「田中宏和さん」という、田中宏和さん14人の共著の本があった。 おそろしや。

次にタイトルを考える。異なる書籍作品のタイトルが同名である場合があるというのは最初想像がつかなかったが、 考えてみれば「線形代数学」というタイトルの本は複数の著者から出ているだろう。

さて、わからなかったのが著者役割である。書籍役割の名称。異なる著者役割の著者役割名が同名である場合がある。 同語反復をしているようで意味が取れなかったのだが、いいたいことは同じ著者役割の名前でも著者役割コードが異なる場合がある、 ということなのだろう。例をむりやり作ると、同じ‘監修者’でも、著作を実際にした監修者もいれば、実際にしていない監修者もいる。 それをコードで区別することができる。しかし、このような場合は、‘監修・著’という役割で表記されているだろうから、 データベースでは‘著作者’と‘監修者’をダブらせるのが適切で、わざわざコードで区別する意味はないかもしれない。 ではなぜこのような指定をしたかというと、著者役割と著者役割コードが1対1対応をしては設問上困ってしまうからなのだろう。

4. 午後 Ⅱ の問題

2016年 問1 データベースの物理設計とデータ移行

テーブル定義表

表4の色あり枠の完成を求められている。私は次のように解答した。ちなみに、一度解答例をみたあとである。 取り消し線をつけたところが誤答である。

表4 “スケジュール”テーブルのテーブル定義表
列名\項目データ型NOT NULL格納長(バイト)索引の種類と構成列
PNU
行員番号INTEGERY41
予定日DATEY42
開始時刻TIMEY33
行番号SMALLINTY24
終了時刻TIMEY3
行動種別CHAR(1)Y1
行動内容NCHAR VARING(100)N120
支店コードCHAR(4)N51
案件番号INTEGERN52
制約FOREIGN KEY (行員番号)REFERENCES 営業員(行員番号)
FOREIGN KEY (支店コード)REFERENCES 案件(支店コード)
CHECK (行動種別 IN ('1', '2', '3', '4', '5'))
CHECK (行番号 BETWEEN(1, 999))

誤答と反省

まず、行動内容の格納長を120と誤っている。これは、行動内容の文字数の平均が全角文字で 58 文字であること、 全角文字の場合は文字列型として選べるのは NCHAR または NCHAR VARING のどちらかで、格納領域の長さが最小になるようにするので NCHAR VARING を選ぶべきであること、 NCHAR VARING の場合は 4 バイトの制御文字がつくこと、ここまでで 58 * 2 + 4 = 120 ときりのよい数字になり安心したが、もうひとつの罠があった。 それは、NOT NULL 制約を指定しないテーブルの列には、NULL かどうかを表す 1 バイトのフラグが付加されるのだが、その 1 バイトを考慮し忘れていたのだ。なんとまあ。

次に外部キー FOREIGN KEY 制約である。“支店コード”列、“案件番号”列は複合して“案件”テーブルの外部キーとなるので、正しくは (支店コード, 案件番号) REFERENCES 案件(支店コード, 案件番号) とならなければならない。これを解答した時、何か足らないなあと思ったが、 テーブルの解答で複合キーとして答えているのにここで誤ってしまうようではデータベースに対する無理解を露呈してしまったようなものだ。

CHECK で誤ってしまったほうだが、これは間違いを覚悟の上で書いたものである。というのは、設問で次のように書かれているのはわかっていたからだ。 ただし,1〜999 のような,値の上限・加減に関する製薬は,検査制約では規定しないものとする。 それでも、問題の要件からは、制約になることが読み取れなかった。ところが解答をみてびっくりした。開始時刻 < 終了時刻とある。 そして問題要件を見なおしてまたびっくり、表1 主な列とその意味・制約の開始時刻,終了時刻,行番号の意味・制約として、 終了時刻は開始時刻より後でなければならない。と書いてある。これには参った。

私は勤務先で、勤怠・工数管理システムの利用者に注意を促す機会がある。その注意とはこういうものだ。 「このシステムでは、〈退勤時刻 - 出勤時刻 < 工数時間 〉となるような入力をしても、エラーとして弾くことはないので、気をつけてください。」 これだけいっても、自分で設計しようとすると抜けてしまうのだから、参ったなあ。

データ所要量

表5の色あり枠の完成を求められている。私は次のように解答した。ちなみに、一度解答例をみたあとである。 取り消し線をつけたところが誤答である。

表5 “スケジュール”テーブルのデータ所要量
項番項目
1見積行数1,200,000 行
2ページサイズ4,000 バイト
3平均行長148バイト
41データページあたりの平均行数23
5必要データページ数173ページ
6データ所要量?百万バイト

参ったなあ。以下、答え合わせをしてみよう。 まず、平均行長は 148 。これは、表 4 で間違った答を直した上での計算をしなおした結果だ。 表 4 の格納長(バイト)をすべて合算すればよい。次に1データページあたりの平均行数である。 1 ページは 4,000 バイトだから、4,000 / 148 を切り捨てればよい、としては誤りだ。 問題文には但し書きがあり、ここで,空き領域率は 10 % とするとある。空き領域率の定義は、 〔RDBMS の仕様〕1. 表領域 (2) にある。引用すると、 表領域ごとに, ページサイズ(中略)と,空き領域率 (将来の更新に備えて,データベース内に確保しておく空き領域の割合)を指定する。 となる。 何に対しての 10 % かはわからないが、解答を見ると、実際に使えるページ数は 4,000 - (4,000) * 0.1 = 3,600 と計算されているので、 ここから逆に考えて 1 ページのバイト数が分母である、としておこう。 そうすると計算は、3,600 / 148 の実行であるが、私はこれを 23 と誤ってしまった。 148 * 2 = 296 で、3,600 - 2,960 = 640 だから なのだが、どういうわけか 148 * 4 > 640 と思い込んでいた。 ここでの計算誤りは致命的ですね。正しくは 24 行である。

さて、必要データベース数を求めるところで挽回できるだろうか。 平均行数が 24 (行 / ページ) という正しい解ならば、必要データページ数 = 1,200,000 (行) / 24 (行 / ページ) = 50,000 ページ、 データ所要量 = 50,000 (ページ) * 4,000 (バイト / ページ) = 200 M (バイト) となるはずだ。 それにしても、必要データページ数の 173 という数字はどこから出てきたのだろうか。謎だ。 何にせよ、もっと粘らないといけない。

部品表の例のテーブルは次の通りとなる。

部品・製品(部品製品番号), 名称, 部品・製品区分, …)
部品構成(上位部品製品番号, 下位部品製品番号, 構成数量)

連関エンティティ

核エンティティの主キーを組にして新たな主キーを作る。このときのエンティティを連関エンティティと呼ぶ。 実際には、n : m の関連を 1 : n の関連にするときに作るエンティティが連関エンティティである。

***構成

***構成と名がつくインスタンスは、連関エンティティである可能性が高い。

所要量展開

部品表を使って製品を組み立てるために必要な部品およびその量を求めることを所要量展開という。連関エンティティである可能性が高い。

まりんきょ学問所コンピュータの部屋システムの部屋 > データベーススペシャリスト


MARUYAMA Satosi