您好我正在开发一个发票应用程序。
所以一般的想法是有两个表:
Invoice (ID, Date, CustomerAddress, CustomerState, CustomerCountry, VAT, Total);
InvoiceLine (Invoice_ID, ID, Concept, Units, PricePerUnit, Total);
正如您所看到的,这种基本设计会导致大量重复记录,其中客户端将具有相同的地址,州和国家。
所以替代方法是拥有一个地址表,然后建立一个关系地址< -Invoice。
但是我认为发票是不可变的文件,应该按照它最初制作的方式存储。有时客户会更改他们的地址或状态,如果它来自地址目录,它将更改所有以前制作的发票。
那你的经历是什么?
客户地址如何存储在发票中?在发票表中?地址表?或其他什么?
您是否可以提供指向书籍,文章或文档的指南,以便进一步详细讨论?
答案 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)
我考虑使用三个表格来完成:Customer
,Invoice
和Address
,但要构建它以便输入地址后,永远不会更新或删除它弃用。您可以在地址表中添加IsDeprecated
或IsActive
布尔字段。然后,当您创建发票时,发票会链接到CustomerID和当时正在使用的AddressID。当客户更改其地址时,您使用新的AddressID创建一个新记录,并使用布尔字段弃用旧记录。或者,如果您确实希望保留良好的记录和/或需要查找此数据,则可以使用AddressActiveStartDate
和AddressActiveEndDate
,但这会使查询更复杂一些。
通过这种方式,您仍然可以存储旧地址,并将其链接到客户以供参考,同时还允许客户拥有多个列出的地址(例如,一个用于发货,一个用于结算)。
您可以根据需要添加更多表格,例如Product
,InvoiceLine
,State
等