1 連絡
- 試験問題と解答例は、Teams にアップしています。
1.1 後期中間成績について
シラバス記載のように「試験45%、小テスト35%、課題20%の割合で総合して評価」します。具体的には、以下を合計して後期中間成績とします (成績票の配付は12月下旬です)。ただし、欠課時数が 10時間超 の場合は、これらに関わらず 0点 となります。
- 試験 : 後期中間試験 (100点満点) を 45点換算 (端数は四捨五入)。
- 小テスト : 小テスト①~⑥の合計点 (60満点) を 35点換算 (端数は四捨五入)。
- 課題 : 課題1 (10点満点) を 20点換算 (端数は四捨五入)。
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 で動作を確認できます。
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対多」または「多対多」の関係にある情報を別テーブルに分解していきます。
- 本を基準として考えるとき、「本」と「タイトル」のように「1対1」の関係にあるものは、別テーブルに分解する必要はありません。
慣れるまでは (=問題4が完答できなかった学生は) 丁寧に「第1正規化」から「第3正規化」まで手順を踏むこと をお勧めします。また、慣れてきたら脳内で以下のような論理ER図を描いて、一気に第3正規形のテーブルが構成できるようになります。
4.2 第1正規形
問題文で与えられている非正規形の books テーブルから 列方向の繰り返し を排除すると、次のような第1正規形 (1NF) となります。ここでは author_id カラムを新たに追加し、id と author_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 |
現状では、title と price、publisher_name、publisher_tel が、id (=複合主キーの一部) に 部分関数従属 しています。また、author は、author_id (=複合主キーの一部) に 部分関数従属 しています。
- 部分関数従属とは(第07回講義)
4.3 第2正規形
第1正規形について、複合主キーの一部に対する部分関数従属を排除 するようにテーブルを分解すると、次のような第2正規形 (2NF) となります。
- books テーブルの id を book_id に変更しています。
- authors テーブルを作成しました。
- book_authors テーブルを作成しました。
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 \(\}\) のような関係となっています。
- 推移的関数従属とは(第07回講義)
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) を実行可能な形式で配置しています。
- Teams で解答例として示した以外にも「別解」があります。正答した学生も、確認しておいてください。
/from-teacher/08/p5_init.sql で user
テーブルを初期化後、各SQLを実行して動作確認が可能です。