我正在构建一个包含以下业务逻辑的发票应用程序。
a)为客户下新订单。(命令是三人一组)
相关组件、估算、发票和采购订单)
b)下订单后,可以生成新的估算。命令
将只有一个估计。(由项目详细信息组成的估计)
c)关于订单估算。发票可以是
生成。发票符合价格折扣的条件。除了
项目详细信息,发票包含一些费用。订单可以包含
只有一张发票
d)根据订单的发票,采购订单可以
生成。采购订单包含有关供应商的物料信息
购买。一个订单可以包含多个PurchaseOrder。
这是我设计的数据库表。
虽然看起来都不错,但我很难决定将属于订单的特定估价单、发票或采购订单的项目列表存储在何处。
我想到了几种解决办法。
方法A:为每个项目列表创建不同的表。(估价、发票和采购订单)
表:estimate_item
,invoice_item
,purchaseorder_item
(此表包含类似于
订购上图中的物品)。
问题:这种方法的问题是所有三个表都由存储相同信息的相同列组成,只有
区别在于将要存储的外键。
方法B:创建一个项目列表order_item
表名:order_item
问题:由于外键可以来自三个不同的表,因此不确定在该表中作为外键存储什么。我很少想到
处理此表中外键的方法如下。
1)ForeignKey表引用列:类型(示例值:Estimate、Invoice、PurchaseOrder)ForeignKey列:类型ID(组
问题:我正在使用命名
列名的约定(例如以tablename_id
结尾的列名)定义外键。这种方法违反了规则。
2)外键列: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”的“estimate”,但我不知道您必须使用什么键进行连接(或查找)。另一个“顺序”指向“估计”,但这两个是如何连接的?我看不到这两个实体有任何共同的属性。
我假设'id'只是使每个特定表中的行唯一的东西,但不是对应用程序有价值的id。所以,我认为您需要将Estimate.reference number放入“Order item”表中。这只是一个粗略的评论。
此外,如果首先列出关键点,是否会更清楚。所以在“order item”中,属性“order id”(看起来是fk)隐藏在其他属性列表的末尾。使这很难阅读。