我正在构建一个包含以下业务逻辑的发票应用程序。
a)为客户下一个新订单。(订单是一组三个相关的组件,估价、发票和采购订单)
b)下订单后,可以生成新的估价。一个订单将只有一个估价。(估价由项目详细信息组成)
c)参考订单的估计。可以生成发票。发票有资格享受价格折扣。除了项目详细信息外,发票还包含一些费用。订单只能包含一张发票
d)参考订单的发票,可以生成PurchaseOrder。PurchaseOrder 包含有关供应商采购的项目信息。一个订单可以包含多个 PurchaseOrder。
这是我想出的数据库表设计。
虽然一切看起来都不错,但我很难决定将属于特定估计、发票或采购订单的项目列表存储在哪里。
我曾想过几个解决方案。
方法A:为每个项目列表创建不同的表。(估计,发票和采购订单)
表:estimate_item
,,,invoice_item
。purchaseorder_item
(此表包含类似于上图中的 order_item 的列)。
问题:这种方法的问题是所有三个表都由存储相同信息的相同列组成,唯一的区别是将存储的外键。方法 B:创建一个项目列表表
order_item
tablename:order_item
问题:不确定在该表中存储什么作为外键,因为外键可以来自三个不同的表。我想到了几种处理该表中外键的方法,如下所示。1)foreignKey 表参考列:类型(示例值:估计、发票、采购订单) foreignKey 列:type_id(由三个表中的任何一个的 foreignKey 组成)
问题:我正在使用列名的命名约定,例如以结尾的列名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
彼此没有关系。