我正在构建一个包含以下业务逻辑的发票应用程序。
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
都有自己的项目,彼此之间没有任何关系。
答案 0 :(得分:1)
嗨,我不确定这种关系是如何发生的。例如,你有'估计'指向'订单项'但我没有看到你有什么关键来加入(或查找)。另一个“订单”指向“估计”但这两个人如何加入?我没有看到这两个实体都有的任何共享属性。
我假设'id'只是使每个特定表中的行唯一,但不是对应用程序有价值的id。所以,我认为你需要将estimate.reference数字带入'订单商品'表。这只是一个粗略的评论。
另外,如果首先列出键,则为了清晰起见。因此,在“订单商品”中,您将属性“订单ID”(似乎是FK)隐藏在其他属性列表的末尾。让这很难读。
答案 1 :(得分:0)
如果我理解正确,则与订单相关联的每个文档(即estimate
,purchaseorder
和/或invoice
)可能包含不同的项目列表。
如果是这种情况,我可能会在以下行中创建一个Documents
表:
CREATE TABLE Documents (
DocumentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
OrderId INT NOT NULL,
-- you can move any fields common to all document types here
-- e.g. date created, reference #, etc.
FOREIGN KEY (OrderId) REFERENCES order (id)
);
然后,您的order_item
,estimate
,purchaseorder
和invoice
表格都会在此表中引用其相关条目:
ALTER TABLE [tablename]
ADD COLUMN DocumentId INT NOT NULL,
ADD FOREIGN KEY (DocumentId) REFERENCES Documents (DocumentId)
);
这就是你要追求的吗?