第2正規形 (ダイニセイキケイ) とは | 意味や読み方など丁寧でわかりやすい用語解説
第2正規形 (ダイニセイキケイ) の読み方
日本語表記
第2正規形 (ダイニセイキケイ)
英語表記
Second Normal Form (セカンドノーマルフォーム)
第2正規形 (ダイニセイキケイ) の意味や用語解説
「第2正規形」は、リレーショナルデータベースの設計において、データの整合性を高め、冗長性を排除するための「正規化」と呼ばれるプロセスの一段階である。正規化は、データを効率的に格納し、更新・挿入・削除の際に発生する異常(更新異常、挿入異常、削除異常)を防ぐことを目的とする。第1正規形、第2正規形、第3正規形が基本的な正規化のステップとして知られており、第2正規形はこのうちの2番目の段階に位置する。第2正規形を適用することで、「部分関数従属」という特定の種類のデータ依存関係を解消し、より健全なデータベース構造を実現する。 リレーショナルデータベースの設計において、第2正規形を理解するためには、まず「主キー」と「関数従属」という概念を把握する必要がある。主キーとは、テーブル内のレコードを一意に識別するための1つまたは複数の列(属性)の組み合わせである。例えば、従業員テーブルで従業員番号が主キーであれば、その番号によって特定の従業員のレコードを特定できる。複数の列を組み合わせて主キーを構成する場合、それを「複合主キー」と呼ぶ。次に、関数従属とは、ある属性(または属性の集合)の値が決まると、他の属性の値も一意に決まる関係を指す。例えば、「従業員番号が決まれば従業員の氏名が決まる」場合、氏名は従業員番号に関数従属していると言う。 第2正規形の定義は、「第1正規形であり、かつ、主キーでない属性が、候補キーのいかなる真部分集合にも関数従属しないこと」である。ここでいう「候補キー」とは、テーブル内でレコードを一意に識別できる最小の属性集合であり、そのうちの1つが主キーとして選択される。そして、「真部分集合」とは、元の集合から少なくとも1つの要素を除いた部分集合のことである。この定義はやや抽象的だが、要するに、複合主キーを持つテーブルにおいて、主キーの一部だけで決まってしまう属性が存在する場合、それを分離しなさい、という意味である。この状態を「部分関数従属」と呼ぶ。 具体例を挙げて考える。ある大学の「受講履歴」テーブルを設計する場合を想定する。このテーブルには、学生がどの科目をいつ受講したかという情報を格納したい。 テーブル名:受講履歴 列: * 学生ID (例: 1001) * 科目ID (例: DB001) * 受講日 (例: 2023-04-10) * 科目名 (例: データベース論) * 担当教員名 (例: 山田太郎) このテーブルにおいて、学生IDと科目IDの組み合わせを複合主キーとする。 * 主キー:(学生ID, 科目ID) このテーブルを第1正規形であると仮定する(すべての属性が単一値で、繰り返しグループがない状態)。 ここで、それぞれの属性が何に関数従属しているかを考える。 * 受講日は (学生ID, 科目ID) に関数従属する。特定の学生が特定の科目をいつ受講したかは、この組み合わせによって決まる。 * 科目名は 科目ID にのみ関数従属する。特定の科目IDが決まれば、その科目名は一意に決まる。学生IDは関係ない。 * 担当教員名も 科目ID にのみ関数従属する。特定の科目IDが決まれば、その科目の担当教員名は一意に決まる。学生IDは関係ない。 ここで問題となるのが、科目名と担当教員名である。これらは主キーの全体(学生ID, 科目ID)ではなく、主キーの一部である科目IDにのみ関数従属している。これが「部分関数従属」の状態である。 このような部分関数従属があると、以下のような問題が発生する。 1. **冗長性**: 例えば、「データベース論」という科目を100人の学生が受講した場合、その科目名「データベース論」と担当教員名「山田太郎」が受講履歴テーブルの100のレコードに繰り返し格納される。これはデータの重複であり、無駄な記憶領域を消費する。 2. **更新異常**: もし「データベース論」の担当教員が変更になった場合、受講履歴テーブル内のすべての該当するレコードを更新しなければならない。もし一つでも更新し忘れると、データに不整合が生じる可能性がある。 3. **挿入異常**: 新しい科目を登録したいが、まだ誰も受講していない場合、学生IDが存在しないため、受講履歴テーブルにその科目情報を登録できない。これは、科目情報が学生の受講という行為に依存してしまうことを意味する。 4. **削除異常**: ある学生が特定の科目の受講を取りやめ、そのレコードを削除した場合、もしそのレコードがその科目の最後の受講記録であったとすると、その科目に関する情報(科目名、担当教員名)も同時に失われてしまう可能性がある。 これらの問題を解決するために、第2正規形への変換を行う。変換の基本的な考え方は、部分関数従属している属性とその従属元の主キーの一部を、新しい別のテーブルとして分離することである。 「受講履歴」テーブルの例では、科目名と担当教員名が科目IDに部分関数従属していたため、これらの属性を分離する。 1. 元のテーブルから、部分関数従属している属性(科目名、担当教員名)と、その従属元である主キーの真部分集合(科目ID)を抽出する。 2. これらの属性で構成される新しいテーブルを作成する。科目IDをこの新しいテーブルの主キーとする。 新しいテーブル:科目 列: * 科目ID (主キー) * 科目名 * 担当教員名 3. 元の「受講履歴」テーブルからは、分離した属性(科目名、担当教員名)を削除する。ただし、元のテーブルで必要となる結合キー(科目ID)は残す。この残された科目IDは、新しい「科目」テーブルへの「外部キー」となる。 修正後のテーブル:受講履歴 列: * 学生ID (複合主キーの一部) * 科目ID (複合主キーの一部、かつ「科目」テーブルへの外部キー) * 受講日 これで、「受講履歴」テーブルの主キー (学生ID, 科目ID) に対して、残る受講日という属性は主キーの全体に関数従属する(部分関数従属ではない)。 また、「科目」テーブルは、主キーが単一属性(科目ID)であるため、自動的に第2正規形を満たす(単一属性の主キーの場合、それ自身の真部分集合は存在しないため、部分関数従属は起こりえない)。 この変換によって、冗長性が解消され、データの整合性が向上する。 * 科目名は「科目」テーブルに一度だけ格納される。 * 担当教員名の変更は、「科目」テーブルの1レコードを更新するだけで済む。 * 新しい科目は、「科目」テーブルに独立して登録できる。 * 受講記録が削除されても、科目の情報が失われることはない。 このように、第2正規形は、複合主キーを持つテーブルにおいて、主キーの一部に依存する属性を特定し、それらを別のテーブルに分離することで、データの冗長性と更新異常を排除し、データベースの構造を健全にする重要なステップである。単一属性を主キーとするテーブルは、主キーの真部分集合が存在しないため、第2正規形の条件を常に満たしていることに留意する必要がある。正規化は、データの正確性と整合性を保つ上で不可欠なプロセスであるが、テーブル分割による結合処理の増加など、パフォーマンスとのトレードオフも考慮しながら適用されるべき概念である。