3

我正在构建一个包含以下业务逻辑的发票应用程序。

a)为客户下一个新订单。(订单是一组三个相关的组件,估价、发票和采购订单)

b)下订单后,可以生成新的估价。一个订单将只有一个估价。(估价由项目详细信息组成)

c)参考订单的估计。可以生成发票。发票有资格享受价格折扣。除了项目详细信息外,发票还包含一些费用。订单只能包含一张发票

d)参考订单的发票,可以生成PurchaseOrder。PurchaseOrder 包含有关供应商采购的项目信息。一个订单可以包含多个 PurchaseOrder。

这是我想出的数据库表设计。

在此处输入图像描述

虽然一切看起来都不错,但我很难决定将属于特定估计、发票或采购订单的项目列表存储在哪里。

我曾想过几个解决方案。

方法A:为每个项目列表创建不同的表。(估计,发票和采购订单)
表: estimate_item,,,invoice_itempurchaseorder_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都有自己的物品invoicepurchaseorder彼此没有关系。

4

2 回答 2

1

嗨,我不确定这种关系是如何发生的。例如,您有 'estimate' 指向 'order item',但我看不出您必须使用什么键才能进行连接(或查找)。作为另一个“订单”指向“估计”,但是这两个是如何加入的?我没有看到这两个实体都具有的任何共享属性。

我假设'id'只是使每个特定表中的行唯一的东西,但不是对应用程序有价值的id。所以,我认为您需要将estimate.reference number 带入“order item”表中。这只是一个粗略的评论。

另外,如果首先列出键,是否会为清楚起见。因此,在“订单项”中,您将属性“订单 ID”(似乎是一个 FK)埋在其他属性列表的末尾。使这难以阅读。

于 2012-04-28T07:33:33.527 回答
0

如果我理解正确,与订单相关联的每个文档(即estimatepurchaseorder/或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_itemestimatepurchaseorderinvoice都在此表中引用它们的关联条目:

ALTER TABLE [tablename]
  ADD COLUMN DocumentId INT NOT NULL,
  ADD FOREIGN KEY (DocumentId) REFERENCES Documents (DocumentId)
);

这就是你所追求的吗?

于 2012-04-28T08:11:58.607 回答