Factura y líneas de factura: ¿Cómo almacena la información de la dirección del cliente?

StackOverflow https://stackoverflow.com/questions/2954233

  •  23-10-2019
  •  | 
  •  

Pregunta

Hola, estoy desarrollando una aplicación de facturación.

Entonces, la idea general es tener dos tablas:

Invoice (ID, Date, CustomerAddress, CustomerState, CustomerCountry, VAT, Total);

InvoiceLine (Invoice_ID, ID, Concept, Units, PricePerUnit, Total); 

Como puede ver, este diseño básico conduce a una gran cantidad de registros de registros donde el cliente tendrá los mismos adicionales, el estado y el país.

Entonces, la alternativa es tener una tabla de direcciones y luego hacer una dirección de relación <-Voice.

Sin embargo, creo que una factura es un documento inmutable y debe almacenarse de la manera en que se realizó por primera vez. A veces, los clientes cambian sus direcciones, o estados y si provenía de un catálogo de direcciones que cambiará todas las facturas hechas anteriormente.

Entonces, ¿cuál es tu experiencia?

¿Cómo se almacena la dirección del cliente en una factura? En la tabla de facturas? una tabla de direcciones? ¿o algo mas?

¿Puede proporcionar consejos a un libro, artículo o documento donde se discute con más detalle?

¿Fue útil?

Solución

Recomendaría que no almacene cualquier detalle del cliente como ese en la factura.

En cambio, tendría una estructura como:

Tabla de clientes, con una clave principal de ID

Tabla de direcciones del cliente (ya que cada cliente puede tener diferentes direcciones a lo largo del tiempo), con la ID del cliente como clave externa

Tabla de facturas, con un campo de dirección que es una clave externa para una tabla de direcciones del cliente.

Por cierto, consideraría agregar un campo de IVA por línea. Hay países donde hay diferentes tasas de IVA para diferentes tipos de artículos.

Otros consejos

La mayoría de las bases de datos de productos/pedidos estándar tendrán

a products table (ProductId, product info fields)  
a customers table (CustomerID, customer info like address etc) 
and an orders table  (OrderNumber, CustomerID, date, etc)

Luego, los artículos de su pedido se convierten en una tabla de relación de muchas cosas entre pedidos y productos.

orderItems (OrderNumber, ProductID, quantity, purchasePrice, vat, etc)

Para obtener una factura completa, consultará la tabla de pedidos y la unirá con la tabla OrderItems. OrderItem generalmente tiene el precio de compra y tal porque el precio en la tabla de productos puede cambiar después de que se crea el pedido y esa información a menudo es útil para almacenar.

Consideraría hacerlo con tres tablas: Customer, Invoice y Address, pero construyéndolo para que una vez que se ingrese una dirección, nunca se actualice o elimine, solo se desactive. Puedes tener un IsDeprecated o IsActive campo booleano en su tabla de direcciones. Luego, cuando crea una factura, la factura se vincula al cliente y a la dirección que se usa en ese momento. Cuando el cliente cambia su dirección, crea un nuevo registro con una nueva dirección y desaproba la anterior con el campo booleano. O si realmente desea mantener buenos registros y/o alguna vez necesitará buscar estos datos, podría tener un AddressActiveStartDate y AddressActiveEndDate, pero esto hará que las consultas sean un poco más complicadas.

De esa manera, aún almacena la dirección anterior, y aún está vinculada al cliente como referencia, al tiempo que permite que el cliente tenga más de una dirección enumerada (por ejemplo, una para envío, una para facturación).

Puede agregar más tablas según sea necesario, por ejemplo Product, InvoiceLine, State, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top