5

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

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

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

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

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

所以另一种选择是有一个地址表,然后建立一个关系地址<-发票。

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

那么你的经验是什么?

客户地址如何存储在发票中?在发票表中?地址表?或者是其他东西?

您能否提供指向对此进行了更详细讨论的书籍、文章或文档的指针?

4

3 回答 3

8

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

相反,我会有这样的结构:

客户表,主键为 id

客户地址表(因为随着时间的推移,每个客户可能有不同的地址),客户 id 作为外键

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

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

于 2010-06-02T00:23:55.797 回答
2

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

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)

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

于 2010-06-02T00:31:03.717 回答
0

我会考虑用三个表来做:和Customer,但是构造它以便一旦输入地址,它就永远不会更新或删除,只会被弃用。您的地址表中可以有一个或布尔字段。然后,当您创建发票时,发票将链接到 CustomerID 和当时使用的 AddressID。当客户更改其地址时,您使用新的 AddressID 创建一条新记录,并使用布尔字段弃用旧记录。或者,如果您真的想保持良好的记录和/或需要查找这些数据,您可以使用and ,但这会使查询更加复杂。InvoiceAddressIsDeprecatedIsActiveAddressActiveStartDateAddressActiveEndDate

这样一来,您仍然可以存储旧地址,并将其链接到客户以供参考,同时还允许客户拥有多个列出的地址(例如,一个用于运输,一个用于计费)。

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

于 2014-08-06T07:17:49.690 回答