发票&发票行:您如何存储客户地址信息?

时间:2010-06-02 00:21:53

标签: database-design invoices

您好我正在开发一个发票应用程序。

所以一般的想法是有两个表:

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

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

正如您所看到的,这种基本设计会导致大量重复记录,其中客户端将具有相同的地址,州和国家。

所以替代方法是拥有一个地址表,然后建立一个关系地址< -Invoice。

但是我认为发票是不可变的文件,应该按照它最初制作的方式存储。有时客户会更改他们的地址或状态,如果它来自地址目录,它将更改所有以前制作的发票。

那你的经历是什么?

客户地址如何存储在发票中?在发票表中?地址表?或其他什么?

您是否可以提供指向书籍,文章或文档的指南,以便进一步详细讨论?

3 个答案:

答案 0 :(得分:8)

我强烈建议不要在发票中存储任何客户详细信息。

相反,我会有一个像:

这样的结构

客户表,主键为id

客户地址表(因为每个客户可能会有不同的地址),客户ID为外键

发票表,地址字段是客户地址表的外键。

顺便说一句,我会考虑为每个订单项添加增值税字段。有些国家/地区的不同项目类型的增值税税率不同。

答案 1 :(得分:1)

大多数标准产品/订单数据库都有

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

然后您的订单商品成为订单和商品之间的多个关系表。

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

要获得完整的发票,您需要查询订单表并将其与OrderItems表连接。 OrderItem通常具有购买价格,因为产品表中的价格可能会在创建订单后发生变化,而且该信息通常对存储有用。

答案 2 :(得分:0)

我考虑使用三个表格来完成:CustomerInvoiceAddress,但要构建它以便输入地址后,永远不会更新或删除它弃用。您可以在地址表中添加IsDeprecatedIsActive布尔字段。然后,当您创建发票时,发票会链接到CustomerID和当时正在使用的AddressID。当客户更改其地址时,您使用新的AddressID创建一个新记录,并使用布尔字段弃用旧记录。或者,如果您确实希望保留良好的记录和/或需要查找此数据,则可以使用AddressActiveStartDateAddressActiveEndDate,但这会使查询更复杂一些。

通过这种方式,您仍然可以存储旧地址,并将其链接到客户以供参考,同时还允许客户拥有多个列出的地址(例如,一个用于发货,一个用于结算)。

您可以根据需要添加更多表格,例如ProductInvoiceLineState