sql >> データベース >  >> RDS >> Mysql

正規化により、複数のテーブル間の結合が困難になります

    スペルミスについて話すつもりはありません。データをインポートしているため、スペルミスはステージングテーブルでより適切に処理されます。

    この少し簡略化されたバージョンを見てみましょう。

    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番号を使用すると、データが重複する可能性があります。




    1. sql with-recursiveステートメントはどのように解釈されますか?

    2. 他の列がnullの場合は、列を選択します

    3. MySQLdは、5.6から5.7へのbrewアップグレード後に起動しません

    4. MySQLで先頭と末尾の文字を削除する方法