3 つの異なるテーブルは必要ありません。city
、state
、 の3 つの列を持つ 1 つのテーブルが必要です region
。
その理由は、city
それ自体は存在しないからです。(米国の)イリノイ州スプリングフィールドを考えてみましょう。そしてマサチューセッツ州スプリングフィールド。またはフロリダ州マイアミとオハイオ州マイアミ。あなたが持っているのは、階層を持つデータのディメンションです。これを格納する正しい方法は、他の情報を提供する「ディメンション」テーブルを使用して、最下位レベル (この場合は都市) にあります。
元のデータが正しいと仮定すると、次のようなことができます。
create table Cities (
CityId int auto_increment not null primary key,
City varchar(255),
State varchar(255),
Region varchar(255)
);
insert into Cities(City, State, Region)
select distinct City, State, Region
from YourTable;
これが「標準的な通常形」ではないことを認識しています。しかし、ほとんどのアプリケーションではこれでうまくいきます。たとえば、リストから状態を選択するアプリケーションでこれを行う場合、状態にインデックスを作成すると、クエリが高速になります。
州レベルと地域レベルで個別のテーブルが必要になる場合があります。これは、それらのレベルに多数の異なる列がある場合に当てはまります。特に、これらの列の値を変更している場合。フラット化されたディメンション (ここで説明されているものなど) は、データが静的な場合 (都市の状態が頻繁に変化しない場合) に最も適しています。正規化は、さまざまなレベルで値を変更する場合に最適です。