Land, Stadt, Staat, Postleitzahl Tisch Design

Ich habe eine database, in der es Land, Stadt, Staaten, Postleitzahlen in einer Tabelle mit riesigen Satz von datasätzen gibt. Ich möchte die databasestruktur normalisieren, um Redundanz zu vermeiden und jede datavervielfältigung zu entfernen. Sollte ich die database aufteilen und separate Tabellen für Land, Stadt, Staat und Postleitzahl machen?

Oder merge Land, Stadt, Staat, Postleitzahl in Adresstabelle?

   

Die folgenden Tabellen könnten für Adressen in Nordamerika verwendet werden. Grafschaften (die auch Pfarreien und andere ähnliche geographische Unterabteilungen enthalten) ist US-centric.

In der addresses Tabelle erlaube ich die city_id und county_id , NULL weil, basierend auf HLGEM 's Kommentar, können Sie in einer Stadt ODER einer Grafschaft aber nicht beide im Staat von Virginia sein. Der Anwendungscode müsste die Regel durchsetzen, dass mindestens eines dieser Felder nicht NULL .

 addresses id unsigned int(P) street varchar(50) extended varchar(50) // Default NULL city_id unsigned int(F cities.id) Default NULL county_id unsigned int(F counties.id) Default NULL zip varchar(6) // Will handle all north American zips zip4 char(4) // Default NULL lat decimal(10,8) // Allows for ~1mm accuracy at equator. Default NULL lon decimal(11,8) // Allows for ~1mm accuracy at equator. Default NULL cities id unsigned int(P) state_id unsigned int(F states.id) name varchar(45) fips unsigned int // Default NULL census_code unsigned int // Default NULL census_class_code char(2) // Default NULL gsa_code unsigned int // Default NULL opm_code unsigned int // Default NULL 

city_id und county_id bilden den Primärschlüssel und sind Fremdschlüssel zu ihren jeweiligen Tabellen.

 cities_counties city_id unsigned int(F cities.id) ---\_(P) county_id unsigned int(F counties.id)--/ counties id unsigned int(P) state_id unsigned int(F states.id) name varchar(50) fips unsigned int // Default NULL 

Siehe http://de.wikipedia.org/wiki/ISO_3166-1

 countries id char(2)(P) iso3 char(3)(U) iso_num char(3)(U) name varchar(44)(U) 

Siehe FIPS-Ländercodes , FIPS-Ländercodes und ISO 3166-2 .

 states id unsigned int(P) country_id char(2)(F countries.id) code varchar(3)(I) name varchar(45) fips unsigned int // Default NULL