【问题标题】:Storing invoices in a database在数据库中存储发票
【发布时间】:2012-05-06 17:04:36
【问题描述】:

我正在制作一个发票软件,我希望它保存每张发票。

用户通过选择客户来创建发票,以及向客户计费的许多项目。鉴于大多数发票都会有多个项目,将它们保存到数据库而不是令人难以置信的冗余的最佳方法是什么?如果需要,我愿意重新排列我的整个数据库。

我的表格如下所示:

客户表:

Id        / Primary key
FullName
Address
Phone

Items Table(提供的产品表):

Id        / Primary key
ItemName
Price
Description

发票表(已保存的发票):

Id        / Primary key
CustId    / Foreign key is Id in Customer table
ItemId    / Foreign key is Id in Item table
Notes

【问题讨论】:

    标签: sql database normalization


    【解决方案1】:

    您需要另一个表来存储发票(您称为 Invoices 现在实际上存储发票项目)。

    Customer
        id
        name
        etc.
    
    Item
        id
        name
        etc.
    
    Invoice
        id
        cust_id
        date
    
    InvoiceItem
        id
        inv_id
        item_id
    

    这是使用联结表(即InvoiceItem)对many to many relationship 建模的经典方法。

    【讨论】:

    • 那么,如果用户有多个发票项目,每个发票项目都会作为单独的条目存储在发票项目表中吗?并且属于发票的所有项目都具有相同的 InvoiceId?
    • @ToddBauer 正确。对于每张发票,都会有一个带有 ID 的 Invoice 记录。对于每张发票上的每个项目,您将创建一个InvoiceItem,将项目连接到发票。通常在InvoiceItem 中有一个quantity 列,以防可以将多个相同的项目添加到发票中。
    • 太棒了!我也会添加一个数量行。题外话,我想告诉你,你的解释很好,很清楚,我感谢你的时间和努力。答案:被选中。继续打好仗。
    【解决方案2】:

    看起来您实际上需要第四张桌子来加入他们。要规范您的数据,请仅在每一行保留该发票特定的内容

    发票表

    Id        / Primary key
    CustId    / Foreign key is Id in Customer table
    Notes
    

    发票项目表

    InvoiceId
    ItemId
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多