Domanda

  

Possibili duplicati:
   Esiste un database di indirizzi stradali comune design per tutti gli indirizzi del mondo?
   Che cos'è & # 8220; best & # 8221; modo di memorizzare gli indirizzi internazionali in un database?
   Best practice per l'archiviazione di indirizzi coerente e completa in un database

Al momento ho quattro tabelle, clienti, contatti, strutture e clienti.

Ognuna di queste tabelle ha i seguenti campi: AddressLine1, AddressLine2, City, StateOrProvince, PostalCode.

Vorrei spostare gli indirizzi in una tabella separata ed essere in grado di designare anche il tipo di indirizzo (fatturazione, spedizione, principale, ecc.).

La mia soluzione è la seguente:

  1. Rimuovi AddressLine1, AddressLine2, City, StateOrProvince, PostalCode da clienti, contatti, strutture e clienti.
  2. Crea tabella Indirizzi con campi AddressID (PK), AddressLine1, AddressLine2, City, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime.
  3. Crea tabella AddressTypes con campi AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  4. Crea tabella CustomerAddresses con campi CustomerID, AddressID, AddressTypeID, CustomerAddressActive, LastUpdateUser, LastUpdateTime
  5. Crea tabella ClientAddresses con campi ClientID, AddressID, AddressTypeID, ClientAddressActive, LastUpdateUser, LastUpdateTime
  6. Crea tabella ContactAddresses con campi ContactID, AddressID, AddressTypeID, ContactAddressActive, LastUpdateUser, LastUpdateTime
  7. Crea tabella FacilityAddresses con campi FacilityID, AddressID, AddressTypeID, FacilityAddressActive, LastUpdateUser, LastUpdateTime

Sto cercando una guida per determinare se esiste una soluzione migliore di quella che ho ideato. Perché tutti pensano?

EDIT: a questo punto non mi preoccupo di nulla al di fuori degli Stati Uniti e non mi occupo di come memorizzare l'indirizzo, cioè il numero civico rispetto all'intero indirizzo. Sono preoccupato dal punto di vista del design del database e della struttura della tabella.

È stato utile?

Soluzione

Un DBA in cui lavoravo mi ha detto questo gioiello, e per noi ha funzionato alla grande (i primi due passaggi sono gli stessi della tua soluzione):

  1. Rimuovi AddressLine1, AddressLine2, City, StateOrProvince, PostalCode da Clienti, Contatti, Servizi e Clienti.
  2. Crea tabella AddressTypes con campi AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  3. Crea tabella Indirizzi con campi AddressID (PK), AddressTypeID (FK), AddressLine1, AddressLine2, City, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime, CustomerID (FK), ClientID (FK), ContactID (FK), FacilityID (FK )
  4. Nella tabella degli indirizzi, imposta un vincolo in modo che solo una delle chiavi esterne CustomerID, ClientID, ContactID o FacilityID alla volta possa essere diversa da NULL.

In questo modo hai tutti i tuoi indirizzi in una tabella, possono fare riferimento a qualsiasi record di cui hai bisogno, la tua integrità referenziale è intatta e non hai nella tabella intermedia che devi attraversare.

Il rovescio della medaglia è che se si desidera aggiungere indirizzi a una nuova classe di oggetti (ad esempio una tabella Employee), è necessario aggiungere una colonna EmployeeID alla tabella Addresses, ma è abbastanza semplice.

Altri suggerimenti

Un'altra cosa che abbiamo nel nostro database che potresti prendere in considerazione è di avere un flag di corrispondenza sulla tabella degli indirizzi con un trigger per far rispettare che solo un indirizzo per persona può scommettere come corrispondenza. Inviamo molta posta alle persone nel nostro database e sapendo quale dei tre indirizzi per quella persona è quello che dobbiamo usare quando si invia la posta è inestimabile. Inoltre semplifica le query per ottenere un solo indirizzo a persona per evitare di ottenere più record a persona per alcuni report.

Voglio anche aggiungere un'altra cosa, per semplicità, creare viste che espandano le informazioni dell'indirizzo sui tuoi tavoli o potresti odiare te stesso per aver progettato db in questo modo.

Considererei una singola tabella AddressLink (nome?) con

LinkTypeID (Customer,Client,Contact,Facility) -- needs additional TypeID table
ID (CustomerID,ClientID...)
AddressID
AddressTypeID
AddressActive
LastUpdateUser
LastUpdateTime

Aggiungere un nuovo tipo di collegamento indirizzo significa aggiungere un nuovo LinkTypeID w / o una nuova tabella degli indirizzi [TypeID], non è necessario modificare alcuna query e se stai cercando tutti gli usi di un indirizzo (per le eliminazioni, ecc.) c'è solo un posto dove guardare.

Questo è abbastanza simile a come lo facciamo, comunque.

Oh, e abbiamo una AddressLine3 nella nostra tabella degli Indirizzi (equivalente) per alcune strane situazioni anomale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top