【问题标题】:Database Design with regard to my business logic关于我的业务逻辑的数据库设计
【发布时间】:2012-04-28 07:24:43
【问题描述】:

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

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

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

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

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

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

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

我想到了几个解决方案。

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

方法 B: 创建一项列表表 order_item
表名: order_item
问题:不确定在这个表中存储什么作为外键,因为外键可以来自三个不同的表。我想到了几个 该表中外键的处理方式如下。

1)foreignKey 表参考列: 类型(示例值:估价、发票、采购订单) foreignKey 列:type_id(consist 三个表中任意一个的 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:

请注意,每个表 estimateinvoicepurchaseorder 都有自己的项目并且彼此没有关系。

【问题讨论】:

  • 肯定order_item 引用了关联的order,而后者又引用了关联的invoiceestimate 和/或purchaseorder?为什么需要从每个order_item 中引用后面的表?
  • @eggyal 对不起,我上传了错误的图片。这只是我正在进行的思考过程。并使用所有字段更新列。现在更新了我的图片
  • 但我的观点仍然存在...您有多个 order_item 引用每个 order,而这些 invoiceestimate 和/或 purchaseorder 又相应地引用关联,不是吗?有什么问题(ERD 中的箭头除外)?
  • 是的,每个订单由多个项目组成,因此包含多个 order_item,我必须将 order_iteminvoiceestimatepurchaseorder 相关联,而这又属于一个订单。跨度>
  • 我觉得我们在绕圈子。我的第一个问题是“为什么需要从每个 order_item 中引用后面的表 [假设 order_item 引用了 order,而 order 又引用了这些表]”?您是否建议 same 顺序中的项目可能与 different invoiceestimatepurchaseorder 相关?我认为您正在尝试解决一个不存在的问题。

标签: mysql database-design relational-database


【解决方案1】:

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

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

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

【讨论】:

  • 更新了图片,因为我之前上传了错误的图片。我一直在使用明映射工具。我会用每个表与另一个表的关系来更新问题。
  • 哦,好的,知道了。谢谢,这将帮助我仔细研究。
【解决方案2】:

如果我的理解正确,与订单相关的每个文档(即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)
);

这就是你所追求的吗?

【讨论】:

  • 如果表中的键名相同就好了。例如他说:estimate_id(外键(指估算表的 id 列))。因此,如果 id 在估算表中被命名为“estimate_id”,而不是“id”(如果是这样的话),它会更清楚。有很多表,很难理解“id”的含义。
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2011-10-23
  • 2013-02-18
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2017-01-02
  • 2019-10-10
相关资源
最近更新 更多