关于我的业务逻辑的数据库设计

时间:2012-04-28 07:24:44

标签: mysql database-design relational-database

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

  

a)为客户下新订单。 (订单是三人一组   相关组件,估计,发票和购买订单)

     

b)下订单后,可以生成新的估算值。订单   将只有一个估计。(估计包括项目详细信息)

     

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

     

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

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

enter image description here

虽然看起来都不错,但我很难决定在哪里存储属于订单的特定估算,发票或购买订单的商品清单。

我曾想过几个解决方案。

  

方法A:为每个项目列表创建不同的表格。 (估计,发票和采购订单)
  表格 estimate_iteminvoice_itempurchaseorder_item。(此表包含类似于   上图中的order_item)   问题:这种方法的问题是所有三个表都由相同的列组成,只存储相同的信息   差异是将要存储的外键。

     

方法B:创建一个项目列表order_item
   tablename: order_item
  问题:不确定在此表中存储什么外键,因为外键可以来自三个不同的表。我想的很少   在此表中处理外键的方法如下。

     

1)foreignKey表引用列:类型(示例值:估计,发票,购买订单)foreignKey列:type_id(包含)   三个表中任何一个的foreignKey)问题:我正在使用命名   列名的约定,例如以tablename_id结尾的列名,定义了外键。这种方法违反了规则。

     

2)foreignKeyColumn: order_idestimate_idinvoice_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:

请注意,每个表estimateinvoicepurchaseorder都有自己的项目,彼此之间没有任何关系。

2 个答案:

答案 0 :(得分:1)

嗨,我不确定这种关系是如何发生的。例如,你有'估计'指向'订单项'但我没有看到你有什么关键来加入(或查找)。另一个“订单”指向“估计”但这两个人如何加入?我没有看到这两个实体都有的任何共享属性。

我假设'id'只是使每个特定表中的行唯一,但不是对应用程序有价值的id。所以,我认为你需要将estimate.reference数字带入'订单商品'表。这只是一个粗略的评论。

另外,如果首先列出键,则为了清晰起见。因此,在“订单商品”中,您将属性“订单ID”(似乎是FK)隐藏在其他属性列表的末尾。让这很难读。

答案 1 :(得分: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)
);

这就是你要追求的吗?