2025-4I データベース工学 第08回 講義資料

2025年11月28日 (木) 2時限 後期中間試験

1 連絡

1.1 後期中間成績について

シラバス記載のように「試験45%、小テスト35%、課題20%の割合で総合して評価」します。具体的には、以下を合計して後期中間成績とします (成績票の配付は12月下旬です)。ただし、欠課時数が 10時間超 の場合は、これらに関わらず 0点 となります。

2 問題1 の解説

「問題1」の解説と補足です。

2.1 (02)

代表的な DBMS (製品名) については把握しておいてください。第01回講義で紹介したように「MySQL」「Microsoft SQL Server」「SQLite」「Microsoft Access」「MariaDB」はリレーショナル型のデータベース管理システム、「MongoDB」はドキュメント指向のデータベース管理システムとなります。

一方で「Prisma」「Drizzle」は 第03回講義TypeScript用の ORM ライブラリ、「SQLAlchemy」は 知能情報実験実習 (IoT) で使用したようにPython用の ORM ライブラリの名称です。「Pandas」は Python 用のデータ分析ライブラリです。

2.2 (08)

「ページネーション」もしくは「ページング処理」が正答です。

2.3 (10)・(11)

オプショナリティ (Optionality) は「任意」、カーディナリティ (Cardinality) は「多重」と呼ばれるので注意してください。

2.4 (20)

DATE_PART('year',CURRENT_DATE) もしくは DATE_PART('year',LOCALTIMESTAMP) が正答です。次の SQL で動作を確認できます。

SELECT
  DATE_PART('year', LOCALTIMESTAMP);

SELECT
  DATE_PART('year', CURRENT_DATE);

3 問題2 の解説

「問題2」の解説と補足です。

3.1 (23)

一般に -a のような1文字のオプションを「ショートオプション」や「ショートフラグ」と呼びます。また、--all のようなオプションを「ロングオプション」や「ロングフラグ」と呼びます。

なお、-all--a といった形式は通常サポートされておらず、多くの場合エラーとなります。使用する際は、それぞれの書式が明確に区別されている点に注意してください。

3.2 (25)

Dockerコンテナのカスタマイズや、APIキー (アクセストークン) の設定・管理には、環境変数 (Environment Variables) を利用するケースが多くあります。Linux および Windows における環境変数の確認方法、設定方法 (編集方法) は、実務上の必須知識となるので、あいまいな人は、再度、学び直しておいてください。

なお、環境変数に機密情報を格納する際はログ出力や履歴 (history) に残さない運用にも注意してください。

4 問題4 の解説

「問題4」の解説と補足です。

4.1 非正規形

「問題4」では、次のような非正規形のテーブル (books) が与えられています。

books テーブル

id title author1 author2 author3 price publisher_name publisher_tel
1 Modern COBOL Alice Steve 2000 Hoge Inc. 9696
2 New Fortran Dave 3800 Piyo Inc. 0120
3 Advanced C# Ellen Carol 2500 Hoge Inc. 9696
4 Hello Pascal Bob Alice Dave 4800 Piyo Inc. 0120

この books テーブルにおいて、「本」を基準と考えて「1対多」または「多対多」の関係にある情報を別テーブルに分解していきます。

慣れるまでは (=問題4が完答できなかった学生は) 丁寧に「第1正規化」から「第3正規化」まで手順を踏むこと をお勧めします。また、慣れてきたら脳内で以下のような論理ER図を描いて、一気に第3正規形のテーブルが構成できるようになります。

img

4.2 第1正規形

問題文で与えられている非正規形の books テーブルから 列方向の繰り返し を排除すると、次のような第1正規形 (1NF) となります。ここでは author_id カラムを新たに追加し、idauthor_id複合主キー としています。

books テーブル

id title author_id author author_order price publisher_name publisher_tel
1 Modern COBOL 1 Alice 1 2000 Hoge Inc. 9696
1 Modern COBOL 2 Steve 2 2000 Hoge Inc. 9696
2 New Fortran 3 Dave 1 3800 Piyo Inc. 0120
3 Advanced C# 4 Ellen 1 2500 Hoge Inc. 9696
3 Advanced C# 5 Carol 2 2500 Hoge Inc. 9696
4 Hello Pascal 6 Bob 1 4800 Piyo Inc. 0120
4 Hello Pascal 1 Alice 2 4800 Piyo Inc. 0120
4 Hello Pascal 3 Dave 3 4800 Piyo Inc. 0120

現状では、titlepricepublisher_namepublisher_tel が、id (=複合主キーの一部) に 部分関数従属 しています。また、author は、author_id (=複合主キーの一部) に 部分関数従属 しています。

4.3 第2正規形

第1正規形について、複合主キーの一部に対する部分関数従属を排除 するようにテーブルを分解すると、次のような第2正規形 (2NF) となります。

books テーブル

book_id title price publisher_name publisher_tel
1 Modern COBOL 2000 Hoge Inc. 9696
2 New Fortran 3800 Piyo Inc. 0120
3 Advanced C# 2500 Hoge Inc. 9696
4 Hello Pascal 4800 Piyo Inc. 0120

authors テーブル

author_id name
1 Alice
2 Steve
3 Dave
4 Ellen
5 Carol
6 Bob

book_authors テーブル

book_id author_id author_order
1 1 1
1 2 2
2 3 1
3 4 1
3 5 2
4 6 1
4 1 2
4 3 3

現状では、books テーブルにおいて、publisher_tel推移的関数従属 になっています。つまり、\(\{\) book_id \(\} \rightarrow \{\) publisher_name \(\} \rightarrow \{\) publisher_tel \(\}\) のような関係となっています。

4.4 第3正規形

第2正規形について、非キー属性同士の推移的関数従属を排除 すると、次のような第3正規形 (3NF) となります。

publishers テーブル

publisher_id name tel
1 Hoge Inc. 9696
2 Piyo Inc. 0120

books テーブル

book_id title price publisher_id
1 Modern COBOL 2000 1
2 New Fortran 3800 2
3 Advanced C# 2500 1
4 Hello Pascal 4800 2

authors テーブル

author_id name
1 Alice
2 Steve
3 Dave
4 Ellen
5 Carol
6 Bob

book_authors テーブル

book_id author_id author_order
1 1 1
1 2 2
2 3 1
3 4 1
3 5 2
4 6 1
4 1 2
4 3 3

5 問題5 の解説

教材リポジトリ(SQL演習環境) の /from-teacher/08 に、「問題5」の (32) から (37) の解答例 (SQL) を実行可能な形式で配置しています。

/from-teacher/08/p5_init.sqluser テーブルを初期化後、各SQLを実行して動作確認が可能です。