コマンド道場
正規化難易度 ★★★☆☆

都道府県を別の表に切り出す

kaiin_nama は主キーが kaiin_id ですが、pref_mei は pref_code で決まってしまい、同じ都道府県名が何度も入っています。これを 2 つの表に分けてください。todofuken は pref_code が整数で主キー、pref_mei が text で NULL を許さない、の 2 列。kaiin は kaiin_id が整数で主キー、kaiin_mei が text で NULL を許さない、pref_code が整数で NULL を許さず todofuken を参照する外部キー、の 3 列です。どちらも列はこの順です。kaiin_nama の中身を、重複なく両方の表へ移してください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server

  • Oracle Database では使えませんtext 型の列 / この問題のほかの構文は未確認です

未確認: IBM Db2

製品ごとの対応表(根拠つき)を見る

  • Oracle Database には text 型がありません。pref_mei は VARCHAR2 や CLOB に読み替えてください(公式のデータ型の一覧で確認)。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

8

NULL
🔑int不可
🔑int不可
text不可
numeric(10,0)不可
int不可
データを見る(先頭 5 行)
juchu_idshohin_idshohin_meitankasuryo
110pen1203
111note2002
210pen1205
212eraser801
311note2004

6

NULL
🔑int不可
text不可
int不可
text不可
データを見る(先頭 5 行)
kaiin_idkaiin_meipref_codepref_mei
1sato13tokyo
2suzuki27osaka
3takahashi13tokyo
4tanaka23aichi
5ito27osaka

解説

結論

主キー以外の列から決まる列も、別の表に切り出します。

★第 2 正規形との違い

前の問題は「主キーの一部だけで決まる列」でした。今回は主キーではない pref_code から pref_mei が決まっています。kaiin_id → pref_code → pref_mei と 2 段になっているので、推移的関数従属と呼びます。決まり方が 2 段になっていたら切り出す、と覚えてください。

★何が問題だったのか

東京の会員が 3 人いるので、'tokyo' が 3 行に書かれていました。表記を 'Tokyo' に直したいとき、3 行とも直さなければなりません。切り出した後は 1 行で済みます。

★都道府県コードのように「外の世界で決まっている値」は、切り出すと特に効きます。コード表として独立させておけば、名前が変わっても 1 か所を直すだけで全体に反映されます。

⚠️ この問題では分解後の表名と列名を指定しています。分け方そのものは何通りもあり得るので、指定が無いと採点できないためです。実際の設計では、この「どう分けるか」が判断のしどころになります。

正規化 の使い方をはじめから読む

根拠(一次情報)