Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Normalisasi membuat penggabungan di beberapa tabel menjadi sulit

Saya tidak akan berbicara tentang kesalahan ejaan. Karena Anda mengimpor data, kesalahan ejaan lebih baik ditangani dalam tabel tahapan.

Mari kita lihat versi yang sedikit disederhanakan ini.

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');

Meskipun banyak orang sangat percaya bahwa kode ZIP menentukan kota dan negara bagian di AS, bukan itu masalahnya. Kode ZIP berkaitan dengan bagaimana operator mengarahkan rute mereka, bukan dengan geografi. Beberapa kota mengangkangi perbatasan antar negara bagian; rute kode ZIP tunggal dapat melintasi garis negara. Bahkan Wikipedia mengetahui hal ini , meskipun contoh mereka mungkin sudah ketinggalan zaman. (Rute pengiriman terus berubah.)

Jadi kami memiliki tabel yang memiliki dua kunci kandidat,

  • {store_name}, dan
  • {nomor_jalan, nama_jalan, kota, kode_negara bagian, kode_pos, kode_negara_iso}

Itu tidak memiliki atribut non-kunci. Saya pikir tabel ini dalam 5NF. Bagaimana menurutmu?

Jika saya ingin meningkatkan integritas data untuk nama jalan, saya mungkin mulai dengan sesuatu seperti ini.

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.

Anda dapat (dan mungkin harus) mengulangi proses ini untuk nama kota, nama negara bagian (kode negara bagian), dan nama negara.

Beberapa masalah dengan pendekatan Anda

Anda tampaknya dapat memasukkan nomor id jalan untuk jalan yang ada di AS, bersama dengan id negara untuk Kroasia. ("Nama lengkap" sebuah kota, bisa dikatakan, adalah jenis fakta yang mungkin ingin Anda simpan untuk meningkatkan integritas data. Itu mungkin juga berlaku untuk "nama lengkap" sebuah jalan.)

Menggunakan nomor id untuk setiap bit data sangat meningkatkan jumlah gabungan yang diperlukan. Menggunakan nomor id tidak ada hubungannya dengan normalisasi. Menggunakan nomor id tanpa batasan unik yang sesuai pada kunci alami--kesalahan yang sangat umum--memungkinkan duplikat data.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemrograman PHP OOP MySQL

  2. Skrip Google Apps untuk Mengekspor Spreadsheet ke mySQL dijalankan di banyak file

  3. ASP.NET MVC 4, beberapa model dalam satu tampilan?

  4. Entri SQL yang kedaluwarsa setelah 24 jam

  5. Mengapa prosedur tersimpan masih tidak didukung di Rails (3+)?