【问题标题】:Database ERD - Junction Table (one-to-many)数据库 ERD - 连接表(一对多)
【发布时间】:2016-11-18 16:11:57
【问题描述】:

目标

为应收帐款创建一个表格,以输入每个客户的发票/付款数据。数据将用于确定应收账款账龄指标。

方法

  1. 用相关信息创建customer
  2. 创建一个包含相关信息的invoice 表(包括customerID
  3. 创建一个将customerinvoices 联系在一起的payments

ERD 图

注意事项

  • 一张发票可以有多次付款(例如,客户在发票完成之前支付部分款项)
  • 每次付款都与单个客户相关(多个客户不会代表另一个客户付款)

问题

  1. 我的客户一对一 > 付款是否是正确的连接?客户只会支付他们自己的发票,所以我相信这是一对一的关系。但是,单个客户可以有许多付款(针对不同的发票)。
  2. 如果单个客户在一张发票上进行多次付款,我打算按“日期_已付款”(付款表)区分付款。有没有更可靠的方法来区分一位客户在一张发票上进行多次付款?

【问题讨论】:

    标签: mysql database erd


    【解决方案1】:
    1. 看起来不对。我们喜欢进行多次付款的客户。一笔付款与一位客户有关。但客户可以有零次、一次或多次付款。

    外键关系看起来是多余的,因为 Payment 只与一个 Invoice(FK 关系)相关联,而 Invoice 恰好与一个 Customer 相关联(FK 关系)。

    我们真的不需要在Payment 表上存储Cust_ID。如果我们这样做,我们就会产生一个可能的异常。没有什么可以阻止发票与客户 11 相关,并且该发票上的付款与不同的客户相关,222。


    1. 我不会使用 Date_Paid 来区分。我们不想禁止客户在同一日期进行两次(或更多)付款。 (客户想要支付 100 美元,但错误地支付了 10 美元。我们希望允许他们再支付 90 美元。

    在我看来,Payment 是一个实际的实体,而不仅仅是CustomerInvoice 实体之间的关系。因此,我会添加一个实体标识符。查看现有的命名约定,那就是Payment_ID。我会把它作为表的主键。

    【讨论】:

    • 所以澄清一下,你在 PK 时会有一个payment_ID。此外,您建议从客户 > 付款表中建立一对多关系?
    • 另外 - 我应该从 Payment 表中删除一个外键(因为 cust_IDinvoice_id 已经在 Invoice 表中定义,对吗?
    • 我将对Payment(实体)表所做的更改:1)添加Payment_ID列作为主键,2)删除Cust_ID列(以及@的外键约束987654336@实体)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多