我正在构建一个发票应用程序,包含以下业务逻辑。
a)为客户下新订单。(一个订单由三个相关组件组成,即估算、发票和采购单)
b)下订单后可以生成新的估价。一个订单只有一个估价。(一个估价包括项目详细信息)
c)参照订单的估价可以生成发票。发票有资格享受价格折扣。除了项目详细信息外,发票还包括一些费用。一个订单只能包含一个发票。
d)参照订单的发票,可以生成采购单。采购单包含有关供应商采购的项目信息。一个订单可以包含多个采购订单。
这是我设计的数据库表格设计。
虽然看起来都不错,但我在决定将属于特定估价、发票或采购订单的物品清单存储在哪里时遇到了困难。
我想出了几个解决方案。
方法 A : 为每个列表(估计、发票和采购订单)创建不同的表格。
表:estimate_item、invoice_item、purchaseorder_item。(这些表包含与上面图像中order_item相似的列)。问题:这种方法的问题在于所有三个表格都包含相同的列,存储相同的信息,唯一的区别是将存储外键。
方法 B: 创建一个项目列表表order_item。表名:order_item问题:不确定在此表中存储外键,因为外键可以来自三个不同的表。我考虑了几种处理此表中外键的方法,如下所示。
1) foreignKey表引用列:类型(示例值:估价、发票、采购单)foreignKey列:type_id(包含任何三个表的外键)
问题:我正在使用列名称的命名约定,例如以tablename_id结尾的列名定义了外键。这种方法违反了规则。
2) foreignKeyColumn:order_id、estimate_id、invoice_id、purchaseorder_id。
问题:定义了不必要的外键列。
我希望知道如何在
表之间的关系如下:
a)为客户下新订单。(一个订单由三个相关组件组成,即估算、发票和采购单)
b)下订单后可以生成新的估价。一个订单只有一个估价。(一个估价包括项目详细信息)
c)参照订单的估价可以生成发票。发票有资格享受价格折扣。除了项目详细信息外,发票还包括一些费用。一个订单只能包含一个发票。
d)参照订单的发票,可以生成采购单。采购单包含有关供应商采购的项目信息。一个订单可以包含多个采购订单。
这是我设计的数据库表格设计。
虽然看起来都不错,但我在决定将属于特定估价、发票或采购订单的物品清单存储在哪里时遇到了困难。
我想出了几个解决方案。
方法 A : 为每个列表(估计、发票和采购订单)创建不同的表格。
表:estimate_item、invoice_item、purchaseorder_item。(这些表包含与上面图像中order_item相似的列)。问题:这种方法的问题在于所有三个表格都包含相同的列,存储相同的信息,唯一的区别是将存储外键。
方法 B: 创建一个项目列表表order_item。表名:order_item问题:不确定在此表中存储外键,因为外键可以来自三个不同的表。我考虑了几种处理此表中外键的方法,如下所示。
1) foreignKey表引用列:类型(示例值:估价、发票、采购单)foreignKey列:type_id(包含任何三个表的外键)
问题:我正在使用列名称的命名约定,例如以tablename_id结尾的列名定义了外键。这种方法违反了规则。
2) foreignKeyColumn:order_id、estimate_id、invoice_id、purchaseorder_id。
问题:定义了不必要的外键列。
我希望知道如何在
order_item
表中存储外键,以便它可以标识它所属的订单和估计/发票/采购订单。表之间的关系如下:
id
是所有表的主键。
table name: order relates to (contact, estimate, invoice, shipment) tables.
column name: contact_id (foreign key(referring to id column of the contact table)).
column name: estimate_id (foreign key(referring to id column of the estimate table)).
column name: invoice_id (foreign key(referring to id column of the invoice table)).
column name: shipment_id (foreign key(referring to id column of the shipment table)).
tablename: purchaseorder (this have one to many relationship with order table)
column name: order_id (foreign key(referring to id column of the order table)).
column name: contact_id (foreign key(referring to id column of the contact table)).
这个问题涉及如何在order_item表中存储外键。
谢谢。
更新1:
请注意,每个表estimate
、invoice
和purchaseorder
都将有自己的项,并且彼此之间没有关系。
order_item
引用每个order
,而每个order
又引用相应的invoice
、estimate
和/或purchaseorder
,除了ERD中的箭头之外,有什么问题吗? - eggyalorder_item
与invoice
、estimate
、purchaseorder
相关联,这些又属于一个订单。 - Ibrahim Azhar Armarorder_item
引用后面的表格,考虑到order_item
引用了一个order
,而order
又引用了那些表格”?你是在暗示同一订单中的项目可能与不同的invoice
、estimate
或purchaseorder
相关吗?我认为你试图解决一个不存在的问题。 - eggyal