2011-01-19 15 views
6

Estoy ocupado creando un sitio web de comercio electrónico básico y me gustaría saber cuál es la mejor de las dos opciones siguientes con respecto a la forma en que almaceno las direcciones de facturación y entrega. Estoy abierto a cualquier otra sugerencia.Diseño de tabla SQL: ¿Debo almacenar direcciones con pedidos o en una tabla separada?

que pueda incluirse la dirección de facturación y dirección de entrega en la tabla Order:

order 
------- 
billing_name 
billing_address 
billing_state 
shipping_name 
shipping_address 
shipping_state 

De lo contrario, puede crear otra tabla que se acaba de almacenar las direcciones de las órdenes:

order 
------- 
billing_address_id 
shipping_address_id 

order_address 
------- 
address_id 
name 
address 
state 
+1

Lo siento, debería haber agregado esto a mi pregunta original. Lo que pensé fue tener otra mesa para almacenar las direcciones de los clientes que podría actuar como una libreta de direcciones y el propósito de tener la tabla de direcciones de pedidos adicionales para que pueda almacenar permanentemente las direcciones proporcionadas para una orden, entonces el cliente debería decidir para actualizar una dirección en la tabla de direcciones del cliente, no afectará las direcciones proporcionadas para el pedido. ¿Sería esto mucho? – KSS

Respuesta

0

Depende si las direcciones son reutilizados

Si tiene una tabla de "cliente registrado", definitivamente debe ir a la opción con las tablas "delivery_adress", "billing_adress", etc., cada registro de ellos está vinculado a un cliente.

2

Editar: Basado en el nuevo comentario, donde va a copiar desde una libreta de direcciones, a una tabla order_address, puede mantener limpia la tabla de su orden para hacerlo, pero si va a duplicar los datos de todos modos, yo diría que lo copie en el registro al que pertenece también.

-

Ambos, desnormalizar el envío, y mantenerlos con la orden. El almacenamiento es barato, y es más fácil que administrar un montón de datos adicionales en la tabla de direcciones. Pero mantenga divididas las direcciones para que los clientes no tengan que volver a ingresarlas. Si se desnormaliza, no es necesario que guarde registros explícitos en la tabla de direcciones para ellos, y se preocupe por realizar eliminaciones automáticas.

No subestime la complejidad de la administración de direcciones. Si ingreso una dirección en su sistema y la asociaré a mi cuenta, y luego me doy cuenta de que una parte de ella es incorrecta, entonces debe eliminar la anterior y crear una nueva. La eliminación puede ser una eliminación suave, pero debe eliminarse. Puede tratar de decidir si estaba ingresando una nueva dirección o cambiando drásticamente la anterior. O solo puedes permitir agregar y eliminar direcciones. Pero cuando las operaciones suceden con direcciones, las órdenes anteriores deben mantener los datos que se le asignaron en primer lugar. La edición de una dirección que ya está asociada a un pedido modificaría el lugar donde dice que se envió, una vez que ya se envió. Asegúrate de pensar en estos escenarios. Hay varias formas de resolver los problemas potenciales, pero su decisión se basa realmente en cómo desea manejar estas situaciones. Si desnormaliza y copia la información de la dirección a la orden una vez que se coloca, entonces la edición de direcciones en la tabla de direcciones se convierte en un problema menor. Decidir cómo manejar estas situaciones, y su esquema de base de datos solo necesita soportar eso. Cualquiera de las dos opciones funciona.

0

Una tabla con el ID de dirección de facturación y envío servirá mejor si planea registrar usuarios en su sitio, luego puede colocar el pedido en otra tabla y usar los ID que ya tiene para correlacionar datos entre información < = > direcciones de facturación/envío

1

El segundo método tiene un par de ventajas sobre el primero. Es más fácil simplemente que las direcciones sean las mismas, como lo serán a menudo, con menos posibilidad de error. Además, si alguna vez guardas direcciones dentro de una cuenta, el segundo método te proporcionará un tiempo más fácil.Dicho esto, debe verificar que una dirección determinada pertenece realmente a la misma cuenta que el pedido, lo que podría hacer incluyendo un campo customer_id en las tablas order y order_address, que incluye customer_id en la clave principal order_address y el número extranjero clave desde order hasta order_address.

2

Guardaría las direcciones en una tabla separada y las referenciaría de las órdenes. Incluiría un atributo "CurrentAddress" para que un usuario final pueda "eliminar" esa dirección de su lista de direcciones actuales. El valor aún existiría en la tabla, por lo que los pedidos anteriores podrían hacer referencia a la dirección con fines históricos, pero ya no sería una dirección seleccionable en el momento de la orden.

2

Arrastrar las direcciones en tablas separadas es más normalizado, pero tenga cuidado. Si permite que las direcciones se actualicen, puede perder el control de dónde se tenía originalmente previsto facturar o enviar el pedido.

8

Normalmente elegiría el segundo. Esto le permitirá tener muchas direcciones diferentes para un cliente de diferentes tipos. Pero normalmente abordaría esto en el nivel del cliente primero, luego abordaría los pedidos y las facturas.

Sin embargo, es posible que tenga que abordar la naturaleza del flujo de trabajo de su pedido/reglas comerciales.

Una vez que se completa un pedido, ¿se trata de un documento (como una factura)? De ser así, la dirección debe estar bloqueada en ese momento y no puede modificarse; de ​​lo contrario, no podrá volver a presentar el documento original.

Cuando un cliente cambia su dirección de facturación, ¿la dirección de facturación de una orden anterior ya es importante? En este caso, la dirección de facturación ni siquiera necesita vincularse desde el pedido, solo desde el cliente. Si tuviera que volver a presentar las órdenes de pago, las presentará a su dirección de facturación actual.

+2

+1: Mis sentimientos exactamente, ojalá pudiera volver a votar nuevamente. Si bien la normalización es lo que buscamos, depende primero de las reglas comerciales, porque en una configuración normalizada, la actualización de una dirección afectaría los registros históricos. –

+0

@OMG Ponies Y al actualizar una dirección a la que se enlazan varias cosas, se debe tomar una decisión de diseño ya sea para cambiar en el lugar o dividir la dirección, y si se divide, qué filas apuntar a la dirección cambiada. Y estas opciones aún pueden necesitar hacerse incluso si todos los cambios se registran en las tablas de auditoría o lo que sea. –

+1

Entendí que el usuario tenía un diseño un poco más complejo en mente, en el que se almacenarían varias direcciones para cada cliente y una nueva se agregaría solo cuando el cliente deseara enviar una orden a una dirección alternativa o nueva. El historial de pedidos indicará varios registros en la tabla de direcciones, dependiendo de cuál haya especificado el usuario en ese momento u ordene. –

4

Personalmente, no me gusta ninguna de sus soluciones aunque la segunda solución es "más adecuada" en términos de teoría de base de datos. Si tiene direcciones repetitivas, debe almacenarlas una vez.

El problema viene en la implementación. Cuando se realiza un pedido, tendrá que tomar una decisión sobre si desea utilizar una dirección existente, actualizar una dirección existente (por ejemplo, con un número de apartamento recién agregado) o crear una nueva dirección (el cliente se ha mudado). , tiene una nueva dirección de verano, lo que sea).

Para hacer esto, alguien (un empleado para ventas directas o por teléfono, el cliente o el programa para ventas en línea) tendrá que tomar una decisión sobre si está realizando una actualización de dirección o una dirección adicional operación. Es muy difícil lograr que los usuarios tomen este tipo de decisiones con precisión. Si se realiza una actualización cuando realmente se necesita una adición, ha corrompido su historial de pedidos (los pedidos anteriores apuntan a la nueva dirección). Si se realiza una adición cuando una actualización fue la elección correcta, ha eliminado el valor de la estructura normalizada.

En situaciones como esta he llegado, no del todo feliz, a la conclusión de que la mejor opción es almacenar una o más direcciones para el cliente y luego copiar la información de la dirección en los campos de la dirección en el orden mismo.

Si elige su segunda opción, debe planear escribir una muy buena interfaz de usuario en el sistema de direcciones para evitar el tipo de problemas que mencioné anteriormente. Y recuerde que no solo usted, sino que cada programador que trabaje en el proyecto en el futuro deberá comprender y acordar la gestión de esa tabla de direcciones.

+1

Exactamente, este escenario específico es más grande que "normalizar o no normalizar". Buena respuesta. – NerdFury

+0

Larry lo clavó. Mot del tiempo que desea que la orden sea inmutable después de haber sido procesada. Una manera fácil de manejar esto es tener la misma clase de dirección que se puede usar en todo momento, pero solo para serializarla en los dos campos de orden (dirección_de_cargos, dirección_despacho). Puede reutilizar el mismo código para las direcciones de sus clientes que están almacenadas en una tabla de direcciones real (con un campo de tipo de dirección). De esta forma, los clientes pueden tener tantas direcciones como deseen (enviar regalos directamente al destinatario), modificar estas direcciones y luego elegir lo que usan para un pedido (que se serializan). –

+0

@Larry lo tienes hermano. bien dicho. – greaterKing

Cuestiones relacionadas