0

あらゆる種類の顧客情報を含む既存のテーブルがあります。現在、「都市」、「地域」、および「州」も文字列として 3 列にリストされています。冗長な情報!

3 つの新しいテーブルを作成します。1 つは都市用、もう 1 つは地域用、もう 1 つは州用です。これらのテーブルには、都市などごとに 1 つのエントリが含まれます。次に、ID を既存の顧客テーブルに参照するために、 location_id。

個別の都市名を都市テーブルにエクスポートし、個別の地域を地域テーブルにエクスポートしてから、都市に region_id および state_id テーブルも参照させて、情報がすべてグループ化されるようにするにはどうすればよいでしょうか。

確かにアマチュアの質問ですが、助けていただければ幸いです。

4

1 に答える 1

0

3 つの異なるテーブルは必要ありません。citystate、 の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;

これが「標準的な通常形」ではないことを認識しています。しかし、ほとんどのアプリケーションではこれでうまくいきます。たとえば、リストから状態を選択するアプリケーションでこれを行う場合、状態にインデックスを作成すると、クエリが高速になります。

州レベルと地域レベルで個別のテーブルが必要になる場合があります。これは、それらのレベルに多数の異なる列がある場合に当てはまります。特に、これらの列の値を変更している場合。フラット化されたディメンション (ここで説明されているものなど) は、データが静的な場合 (都市の状態が頻繁に変化しない場合) に最も適しています。正規化は、さまざまなレベルで値を変更する場合に最適です。

于 2013-06-19T00:18:48.340 に答える