多对多 - 非识别关系数据模型

时间:2013-04-17 05:38:17

标签: model many-to-many

我们有一个小的 SQL SERVER 2000 数据库用于导入 - 交易商品并向其扩展新功能。我很难实现正确的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. 您如何看待数量控制?库存按计算计算 报道上的字段。
  4. 问题1和2对于我们进一步发展非常重要。非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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