2013-04-17 56 views
0

我们有一个小型的数据库,用于导入 - 交易货物并向其中扩展新功能。我有混淆实施正确的PK - FK关系。多对多 - 非识别关系数据模型

有三个表,我们有:

Contract (ContractID (PK), SupplierID (FK), ProductID(FK), Date, Quantity, Price) 

SupplierInvoice (SupplierInvoiceID (PK), ContractID (FK) , ImportID (FK) , InvoiceNo, Date,Quantity) 

Import (ImportID (PK) , Date) 

Truck (TruckID (PK), ImportID (FK), CustomerID (FK), Date, Quantity) 

说明:

这些都是散装产品,也没有包装,只是数量。

  • 所有PK的是代理(自动增量)
  • 有了一个合同,我们可以有0到许多发票和一张发票可以属于只有一个合同。 (0发票将在几天内为1)
  • 随着一对多的发票,你做0到1的进口。 (0进口将是1,并在几天内只有一个) (许多发票意味着可能有部分合同结束和开始。)
  • 数量:合同一个合同的发票数量不能超过合同数量。我们建立触发器来控制这个。导入数量与发票数量完全相同。

问题:

  1. 这是模型(PK和FK的),以正确的方式)?你怎么看?
  2. 进口后,我们将货物装载到我们已经进口的卡车上,因此我们应该输入 哪个产品是我们要从哪个供应商加载的。如果我们开始制作JOIN查询 从卡车表到合同表,直到我们得到ProductIDSupplierID然后 这是一个很长的查询。你怎么看?
  3. 您如何看待数量控制?库存是通过报告中计算的 字段来计算的。

问题1和问题2对我们进一步推进非常重要。感谢您的帮助。

+0

每个合同只能有一个产品吗? – Craig

回答

1

从您的描述看,您似乎需要更改发票和导入表格之间的关系(“使用一对多发票进行0到1的导入”)。您的发票表中有您的导入ID作为FK,但我非常确定您实际需要的是与发票和导入之间的连接表的多对多关系,以便您可以将每个导入的许多发票关联起来。另外,如果每个合同可以有多个产品,则需要在合同和产品表之间建立一个连接表,以便允许您在产品和合同之间创建多对多关系。换句话说,我认为您使用同一产品进行多个合同,并且至少其中一些合同可能涉及多个产品?

我不会过多担心一些连接。如果你到达了要加入十几张表的地方,那么在我研究非规范化模式之前,我会考虑创建一个或两个战略视图来简化查询。

如果你担心加入性能(不要,用这几个表),你可以用SQL Server做很多索引调整。你可以把索引放在数据库视图上。 SQL Server 2000还支持实体化视图,它基本上指示SQL Server以视图的形式构建(并动态维护)一个表,以便不必为执行的每个查询都实时执行视图定义中的连接。您还可以创建可更新的视图,并且可以将视图中的数据库触发器的子集。所以为了数据的完整性,我会坚持一个规范化的模式。我认为有很多解决方案可以解决查询复杂性和加入性能问题。

编辑:这是一个更新的示例ER图,显示了合同和产品之间以及发票和进口之间的多对多关系。

Schema showing many-to-many relations between contracts and products, and between invoices and imports

+0

非常感谢克雷格。虽然每个合同只有一个产品(总是),但我可以轻松地移除那里的许多对象。另外,我会删除supplierinvoice_import的连接表,因为没有多个导入的发票。与此同时,我在手机上看到了您以前的回复(在您编辑之前)。我认为它更适合我的需求。但是这一点已经足够清楚了,所以我将选择supplierinvoiceID作为导入表的FK。 – pilot001

+0

我很高兴这有帮助。至于我的编辑,当我今天早上重新阅读你的问题时,它给我带来了不同的印象,我想我可能已经错误地设想了你的假设,因此发票导入表的多对多改变。再次,我很高兴我能够帮助。 – Craig