| English | 意味 |
|---|---|
| relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ | リレーショナルデータベース |
| tables/ˈteɪblz/ | テーブル |
| entities/ˈentɪtiz/ | エンティティ |
| primary key/ˈpraɪməri kiː/ | 主鍵 |
| foreign key/ˈfɒrən kiː/ | 外部鍵 |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | 正規化 |
1つの改名されたコースに2つのタイトルがある
- 学校はコースタイトルを登録行のすべてにコピーします。一部のコピーを改名すると、同じコースに対して2つの矛盾するタイトルが存在することになります。
- リレーショナルデータベースは、テーブルにエンティティ(学生やコースなど)およびそれらの間の関係性を特定してから、行を格納します。
識別子を可変的なラベルから分離する
- プライマリキーは行を一意に識別し、nullにすることはできません。安定した学生IDを使用することで、名前が変わっても学生の識別自体は変わりません。
- 一意性と安定性が保証されている場合、ネイチャーキーも機能します。ただし、名前は異なる学生が共有できるため、ここでは適切なキーではありません。また、メールアドレスも変更される可能性があります。
学生は名前を共有でき、メールアドレスを変更できる。この設計における最適なキーはどれか? ⟦number⟧
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
繰り返したり変更されたりするラベルではなく、安定したアイデンティティを選択せよ。
マニ・トゥ・マニの関係を表す
- 一人の学生が複数の科目を受講できますし、一つの科目には多くの学生がいることがあります。各学生-科目ペアに対して1行ずつ格納する enrolments テーブルを使用します。
- 外部キーは、各登録を有効な学生または科目のキーに結びつけます。複合主キー
(student_id, course_id)は、同じペアが重複して表示されるのを防ぎます。
どの設計が、多くの科目を受講する学生と、多くの学生を有する科目を表しているか。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
各登録は1人の学生と科目のペアを記録する。
どのようなキーが登録を既存のコースキーと結びつけるか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
外部キーは、強制機能启用時にこの参照を表し制約する。
同じ学生-科目ペアが重複して表示されるのを防ぐ制約は何か?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
複合主キーがそのペアを識別する。
科目に関する事実を科目と共に格納する
- 正規化は、依存関係を用いてテーブルを整理し、不整合な反復を減らすものです。この設計では、科目IDが科目名を決定するため、科目名は courses に格納します。
- 外部キー値の反復は予想されます:多くの登録が一つの科目を参照する可能性があります。「いかなる値も絶対に反復させない」というのは、有益なデータベース設計のルールではありません。
複数の登録行に同じコースIDを繰り返すことは、常に正規化エラーである。 ⟦number⟧
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
重複参照は期待される。コースタイトルを各関係行にコピーすることは、ここでは更新問題を生む。
制約を有効にしてテストする
- SQLite では、作業を開始する前に各接続に対して
PRAGMA foreign_keys = ONを用いて外部キーの強制を有効にします。関係性を宣言するだけでは不十分です。 - 有効な登録、重複したペア、存在しない科目を参照する登録をテストします。制約は後二者を拒否すべきですが、どの呼び出し元が権限を持っているかを判定するものではありません。
PRAGMA foreign_keys = ON;
CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (
student_id INTEGER REFERENCES students(id),
course_id INTEGER REFERENCES courses(id),
PRIMARY KEY (student_id, course_id),
CHECK (student_id IS NOT NULL AND course_id IS NOT NULL)
);
SQLiteの外キーを宣言することは、有効化せずにすべての接続で外キーが強制されることを意味します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
各接続でPRAGMA foreign_keys = ONを有効にし、動作を確認してください。
新しいケースに対する設計を確認する
- 図書館の貸出において、書籍タイトルは必ずしも唯一の物理的なコピーを表すものではありません。キーを選択する前に、借り手、コピー、および貸出イベントを特定してください。
- 反復イベントが許可されるかどうかを判断します。ここでは学生-科目ペアで一つの登録を識別できますが、借り手-コピーペアでは異なる日付での反復する貸出を区別できません。
必要なアイデンティティのためのキーを選びます。エンティティの事実と関係性の行を分離し、具体的なケースを用いて一意性と参照制約を検証します。
借り手が同一の物理的コピーを複数回借りられる図書館のためのエンティティとキーを提案せよ。
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
借り手ID、コピーID、必要なイベント詳細を持つ独立したローンイベントIDを使用する。
なぜ借受人–コピーの組み合わせだけでは、重複する貸出の鍵として不十分なのか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
鍵は、記録したい実際のイベントを区別する必要があります。