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

嗨,我正在开发一个发票应用程序。 所以一般的想法是有两个表:
Invoice (ID, Date, CustomerAddress, CustomerState, CustomerCountry, VAT, Total);

InvoiceLine (Invoice_ID, ID, Concept, Units, PricePerUnit, Total); 
正如您所看到的,这种基本设计会导致大量重复记录,其中客户端将具有相同的地址,状态和国家/地区。 所以另一种方法是拥有一个地址表,然后建立一个地址< -Invoice。 但是我认为发票是不可变的文件,应该按照它最初制作的方式存储。有时,客户会更改其地址或状态,如果它来自地址目录,该目录将更改以前制作的所有发票。 那你的经历是什么? 客户地址如何存储在发票中?在发票表中?地址表?或者是其他东西? 您能否提供指向书籍,文章或文档的指南,以便进一步详细讨论?     
已邀请:
我强烈建议不要在发票中存储任何客户详细信息。 相反,我会有一个像这样的结构: 客户表,主键为id 客户地址表(因为每个客户可能随时间具有不同的地址),客户ID为外键 发票表,其地址字段是客户地址表的外键。 顺便说一句,我会考虑为每个订单项添加增值税字段。有些国家/地区的不同项目类型的增值税税率不同。     
大多数标准产品/订单数据库都有
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通常具有购买价格,因为产品表中的价格可能会在创建订单后发生变化,并且该信息通常对存储有用。     
我考虑使用三个表:
Customer
Invoice
Address
,但是构造它以便一旦输入地址,它就永远不会被更新或删除,只是弃用。您的地址表中可以包含
IsDeprecated
IsActive
布尔字段。然后,当您创建发票时,发票会链接到CustomerID和当时正在使用的AddressID。当客户更改其地址时,您使用新的AddressID创建一个新记录,并使用布尔字段弃用旧记录。或者如果你真的想要保持良好的记录和/或需要查找这些数据,你可以得到一个
AddressActiveStartDate
AddressActiveEndDate
,但这会使查询更复杂一些。 这样你仍然存储旧地址,它仍然链接到客户以供参考,同时还允许客户拥有多个列出的地址(例如一个用于发货,一个用于计费)。 您可以根据需要添加更多表格,例如
Product
InvoiceLine
State
等     

要回复问题请先登录注册