郵便番号DBを第2正規形にする

PREF列とCITY列との組み合わせはLGCode列に関数従属し,PREF_kana列とCITY_kana列とはそれぞれPREF列とCITY列とに関数従属します.

 SELECT	LGCode, COUNT(ID) 
FROM KEN_ALL
GROUP BY LGCode;

SELECT PREF, CITY, COUNT(ID)
FROM KEN_ALL
GROUP BY PREF, CITY;

SELECT LGCode, PREF, CITY, COUNT(ID)
FROM KEN_ALL
GROUP BY LGCode, PREF, CITY;

(1904 行処理されました)
(1904 行処理されました)
(1904 行処理されました)

仮に同一LGCodeが異なるPREF, CITYの組み合わせに対応している場合,つまり重複が存在する場合は1904行よりも少なくなります.そこでLGCode, PREF, CITY, PREF_kana, CITY_kana列を別テーブルに分割して第2正規形にします.PREF_kana列とCITY_kana列とを分割すれば推移関数従属性が排除されて第5正規形になりますが,後に検索のためよみがなを残しておく必要からここではこれ以上正規化を進めずにおきます.

IF OBJECT_ID('MT_LocalGoverment') IS NOT NULL 
DROP TABLE MT_LocalGoverment;

CREATE TABLE MT_LocalGoverment(
LGCode nchar(5) NOT NULL CONSTRAINT PK_LocalGoverment PRIMARY KEY,
PREF nvarchar(4) NOT NULL,
CITY nvarchar(10) NOT NULL,
PREF_kana nvarchar(7) NOT NULL,
CITY_kana nvarchar(22) NOT NULL);

INSERT INTO MT_LocalGoverment
SELECT LGCode, PREF, CITY, PREF_kana, CITY_kana
FROM KEN_ALL
GROUP BY LGCode, PREF, CITY, PREF_kana, CITY_kana;

(1904 行処理されました)

ALTER TABLE KEN_ALL
DROP COLUMN PREF_kana, CITY_kana, PREF, CITY;

ALTER TABLE KEN_ALL
ADD CONSTRAINT FK_LGCODE FOREIGN KEY (LGCode)
REFERENCES MT_LocalGoverment(LGCode);

(コマンドは正常に完了しました)

ここでいうLGCodeつまり地方公共団体コードは1968年に当時の自治省が導入したコード体系です.詳細は下記リンクを参照ください.
http://www.soumu.go.jp/denshijiti/csv/071001_1.csv
http://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89
http://www.lasdec.nippon-net.ne.jp/cms/1,0,14.html