Pergunta

Duplicatas possíveis:
Existe comum de banco de dados endereços de rua projetar para todos os endereços do mundo?
O que é o “melhor” maneira de armazenar endereços internacionais em um banco de dados?
Melhores práticas para o armazenamento de endereços consistente e abrangente em um banco de dados

Actualmente tenho quatro mesas, clientes, contatos, Instalações e clientes.

Cada uma destas tabelas possui os seguintes campos: AddressLine1, AddressLine2, Cidade, StateOrProvince, PostalCode.

Eu gostaria de mover os endereços para uma tabela separada e ser capaz de também designar o tipo de endereço (faturamento, transporte, principal, etc.).

A minha solução é a seguinte:

  1. Remover AddressLine1, AddressLine2, Cidade, StateOrProvince, PostalCode de clientes, contatos, Instalações e clientes.
  2. Criar tabela endereços com campos AddressID (PK), AddressLine1, AddressLine2, Cidade, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime.
  3. Crie a tabela AddressTypes com campos AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  4. Crie a tabela CustomerAddresses com campos CustomerID, AddressID, AddressTypeID, CustomerAddressActive, LastUpdateUser, LastUpdateTime
  5. Crie a tabela ClientAddresses com campos clientId, AddressID, AddressTypeID, ClientAddressActive, LastUpdateUser, LastUpdateTime
  6. Crie a tabela ContactAddresses com campos ContactID, AddressID, AddressTypeID, ContactAddressActive, LastUpdateUser, LastUpdateTime
  7. Crie a tabela FacilityAddresses com campos FacilityID, AddressID, AddressTypeID, FacilityAddressActive, LastUpdateUser, LastUpdateTime

Eu estou procurando orientação para determinar se existe uma solução melhor do que a que eu inventado. Por que todo mundo acha?

EDIT: Eu não estou preocupado com qualquer coisa fora os EUA neste momento e não se preocupa com a forma de armazenar o endereço, número da rua ie vs todo o endereço. Estou preocupado a partir de um ponto de design de banco de dados e estrutura de suporte de mesa.

Foi útil?

Solução

A DBA onde eu costumava trabalhar me disse esta jóia, e é funcionou bem para nós (os dois primeiros passos são os mesmos que em sua solução):

  1. Remover AddressLine1, AddressLine2, Cidade, StateOrProvince, PostalCode de clientes, contatos, Instalações e clientes.
  2. Crie a tabela AddressTypes com campos AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  3. Criar tabela endereços com campos AddressID (PK), AddressTypeID (FK), AddressLine1, AddressLine2, Cidade, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime, CustomerID (FK), ClientID (FK), ContactID (FK), FacilityID (FK )
  4. Na tabela de endereços, configurar uma restrição para que apenas uma das chaves estrangeiras CódigoDoCliente, ClientID, ContactID, ou FacilityID pode ser não-NULL de uma vez.

Desta forma, você tem todos os seus endereços em uma tabela, eles podem fazer referência a qualquer registro que você precisa, a sua integridade referencial está intacto, e você não tem na tabela intermediária que você tem que atravessar.

A desvantagem é que se você quiser adicionar endereços para uma nova classe de objeto (por exemplo, uma tabela Employee), você tem que adicionar uma coluna EmployeeID para a tabela de endereços, mas isso é muito fácil.

Outras dicas

Uma coisa adicional que temos em nosso banco de dados que você pode querer considerar é a bandeira havea correspondência onthe tabela de endereços com um gatilho para impor que apenas um endereço por pessoa pode apostar como correspondência. Enviamos um monte de e-mails para as pessoas em nosso banco de dados e saber qual dos três endereços para essa pessoa é o que precisa para usar quando enviar email é inestimável. Ele também faz a sua mais fácil ao consultar para pegar apenas um endereço por pessoa para evitar vários registros por pessoa para alguns relatórios.

Eu também quero acrescentar mais uma coisa, por uma questão de simplicidade, criar pontos de vista que se expande Endereço para suas tabelas ou você pode odiar a si mesmo para projetar db desta forma.

Eu consideraria um único AddressLink (nome?) Tabela com

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

A adição de um novo meio de tipo link de endereço adicionando um novo LinkTypeID / oa nova tabela [TypeID] Dirige w, há consultas precisam ser modificados, e se você estiver olhando para todos os usos de um endereço (para exclusões etc) há apenas um lugar para olhar.

Isso é muito semelhante à forma como o fazemos, de qualquer maneira.

Oh, e temos uma AddressLine3 em nossos endereços de mesa (equivalente) para algumas situações estranho outlier.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top