2009-09-18 19 views
9

posibles duplicados:
Is there common street addresses database design for all addresses of the world?
What is the “best” way to store international addresses in a database?
Best practices for consistent and comprehensive address storage in a database¿Cómo representar mejor las direcciones en una base de datos

actualmente tienen cuatro mesas, clientes, contactos, Instalaciones y Clientes.

Cada una de estas tablas tiene los siguientes campos: AddressLine1, AddressLine2, City, StateOrProvince, PostalCode.

Me gustaría mover las direcciones a una tabla separada y poder también designar el tipo de dirección (facturación, envío, principal, etc.).

Mi solución es la siguiente:

  1. Retire AddressLine1, AddressLine2, Ciudad, StateOrProvince, PostalCode de clientes, contactos, Instalaciones y Clientes.
  2. Crear tabla de direcciones con campos AddressID (PK), AddressLine1, AddressLine2, City, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime.
  3. crear la tabla AddressTypes con campos AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  4. crear la tabla CustomerAddresses con los campos IdCliente, AddressID, AddressTypeID, CustomerAddressActive, LastUpdateUser, LastUpdateTime
  5. Crear una tabla ClientAddresses con campos ClientID, AddressID, AddressTypeID, ClientAddressActive, LastUpdateUser, LastUpdateTime
  6. Crear una tabla con los campos ContactAddresses Contact ID, AddressID, AddressTypeID, ContactAddressActive, LastUpdateUser, LastUpdateTime
  7. Crear una tabla con el campo FacilityAddresses s FacilityID, AddressID, AddressTypeID, FacilityAddressActive, LastUpdateUser, LastUpdateTime

estoy en busca de orientación para determinar si hay una solución mejor que la que yo inventé. ¿Por qué todos piensan?

EDITAR: No me preocupa nada fuera de los EE. UU. En este momento y no me preocupa cómo almacenar la dirección de la calle, es decir, el número de calle frente a la dirección completa de la calle. Estoy preocupado desde el punto de vista de la estructura de la tabla y el diseño de la tabla.

+1

Ver: http://stackoverflow.com/questions/24481/ http://stackoverflow.com/questions/126207/ http://stackoverflow.com/questions/929684/ http://stackoverflow.com/questions/310540/etc – Welbog

+0

¿Qué hay de malo en tener más de una tabla de direcciones? – NoChance

Respuesta

6

Un DBA donde solía trabajo me dijo esta joya, y ha funcionado muy bien para nosotros (los dos primeros pasos son los mismos que en su solución):

  1. Retire AddressLine1, AddressLine2, Ciudad, StateOrProvince , PostalCode de clientes, contactos, instalaciones y clientes.
  2. Crear una tabla AddressTypes con campos AddressTypeID, AddressTypeName, AddressTypeDescription, AddressTypeActive, LastUpdateUser, LastUpdateTime
  3. Crear una tabla de direcciones con campos AddressID (PK), AddressTypeID (FK), AddressLine1, AddressLine2, Ciudad, StateOrProvince, PostalCode, LastUpdateUser, LastUpdateTime , CustomerID (FK), ClientID (FK), ContactID (FK), FacilityID (FK) 4. En la tabla de direcciones, configure una restricción para que solo una de las claves externas CustomerID, ClientID, ContactID o FacilityID puedan ser no NULL a la vez.

De esta manera tiene todas sus direcciones en una tabla, pueden hacer referencia a cualquier registro que necesite, su integridad referencial está intacta, y no tiene en la tabla intermedia que debe atravesar.

El inconveniente es que si desea agregar direcciones a una nueva clase de objeto (por ejemplo, una tabla Empleado), debe agregar una columna EmployeeID a la tabla Direcciones, pero eso es bastante fácil.

+0

¿Cuál es el punto de agregar tantas claves primarias donde el reverso puede hacer la vida más fácil y permitir relaciones personales donde los clientes (solo una muestra) pueden tener más de una dirección. –

+2

El cliente * puede * tener más de una dirección. La tabla Direcciones puede tener varias filas que hacen referencia al mismo IdCliente. Simplemente no puede tener la misma referencia de dirección tanto para un Cliente como para un Contacto. –

+0

¿Qué pasa si una dirección hace referencia a dos clientes diferentes porque viven en la misma casa? – nonsensecreativity

0

También quiero agregar una cosa más, en aras de la simplicidad, crear vistas que expandan la información de la dirección a sus tablas o puede odiarse por diseñar db de esta manera.

0

Me considero una sola tabla AddressLink (nombre?) Con

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

Adición de un nuevo tipo de enlace dirección significa la adición de un nuevo LinkTypeID w/OA nueva tabla [TypeID] direcciones, no hay consultas deben ser modificado, y si está buscando todos los usos de una dirección (para eliminar, etc.) solo hay un lugar para buscar.

Esto es muy similar a cómo lo hacemos, de todos modos.

Ah, y tenemos una AddressLine3 en nuestra tabla Direcciones (equivalente) para algunas situaciones atípicas extrañas.

+1

¿Cómo se aplica una restricción de clave externa en ID con esta estructura? ¿O no te molestas? – APC

+0

Los activadores de inserción/modificación validan que la columna de ID sea válida en relación con LinkTypeID. FK en las columnas LinkTypeID, AddressID y AddressTypeID, y "delete restricted" en su lugar en las tablas principales. Creo * que está hecho declarativamente pero también podría ser un desencadenante. (MS SQL Server 2005) – DaveE

1

Una cosa adicional que tenemos en nuestra base de datos que quizás desee considerar es tener una bandera de correspondencia en la tabla de direcciones con un activador para hacer cumplir que solo una dirección por persona puede apostar como correspondencia. Enviamos una gran cantidad de correos a personas en nuestra base de datos y saber cuál de las tres direcciones para esa persona es la que necesitamos usar cuando enviamos correos es invaluable. También hace que sea más fácil cuando consulta obtener solo una dirección por persona para evitar obtener múltiples registros por persona para algunos informes.

Cuestiones relacionadas