スペルミスについて話すつもりはありません。データをインポートしているため、スペルミスはステージングテーブルでより適切に処理されます。
この少し簡略化されたバージョンを見てみましょう。
create table stores
(
store_name varchar(50) primary key,
street_num varchar(10) not null,
street_name varchar(50) not null,
city varchar(50) not null,
state_code char(2) not null,
zip_code char(5) not null,
iso_country_code char(2) not null,
-- Depending on what kind of store you're talking about, you *could* have
-- two of them at the same address. If so, drop this constraint.
unique (street_num, street_name, city, state_code, zip_code, iso_country_code)
);
insert into stores values
('Dairy Queen #212', '232', 'N 1st St SE', 'Castroville', 'CA', '95012', 'US'),
('Dairy Queen #213', '177', 'Broadway Ave', 'Hartsdale', 'NY', '10530', 'US'),
('Dairy Queen #214', '7640', 'Vermillion St', 'Seneca Falls', 'NY', '13148', 'US'),
('Dairy Queen #215', '1014', 'Handy Rd', 'Olive Hill', 'KY', '41164', 'US'),
('Dairy Mart #101', '145', 'N 1st St SE', 'Castroville', 'CA', '95012', 'US'),
('Dairy Mart #121', '1042', 'Handy Rd', 'Olive Hill', 'KY', '41164', 'US');
多くの人々は、郵便番号が米国の都市と州を決定すると固く信じていますが、そうではありません。郵便番号は、地理ではなく、運送業者がルートを運転する方法に関係しています。一部の都市は州間の境界にまたがっています。単一の郵便番号ルートは州の境界線を越えることができます。 Wikipediaはこれを知っています 、ただし、それらの例は古くなっている可能性があります。 (配送ルートは常に変化します。)
したがって、2つの候補キーを持つテーブルがあります。
- {store_name}、および
- {street_num、street_name、city、state_code、zip_code、iso_country_code}
キー以外の属性はありません。このテーブルは5NFにあると思います。どう思いますか?
通りの名前のデータの整合性を高めたい場合は、次のようなものから始めることができます。
create table street_names
(
street_name varchar(50) not null,
city varchar(50) not null,
state_code char(2) not null,
iso_country_code char(2) not null,
primary key (street_name, city, state_code, iso_country_code)
);
insert into street_names
select distinct street_name, city, state_code, iso_country_code
from stores;
alter table stores
add constraint streets_from_street_names
foreign key (street_name, city, state_code, iso_country_code)
references street_names (street_name, city, state_code, iso_country_code);
-- I don't cascade updates or deletes, because in my experience
-- with addresses, that's almost never the right thing to do when a
-- street name changes.
都市名、州名(州コード)、および国名について、このプロセスを繰り返すことができます(おそらくそうすべきです)。
アプローチに関するいくつかの問題
明らかに、米国にある通りのストリートID番号と、クロアチアの国IDを入力できます。 (都市の「フルネーム」は、いわば、データの整合性を高めるために保存したい種類の事実です。これは、おそらく通りの「フルネーム」にも当てはまります。)
データのすべてのビットにID番号を使用すると、必要な結合の数が大幅に増加します。 ID番号の使用は、正規化とは何の関係もありません。自然キーに対応する一意の制約なしでID番号を使用すると、データが重複する可能性があります。