【问题标题】:Many to many - non identifying relationship Data model多对多-非识别关系数据模型
【发布时间】:2013-04-09 18:16:28
【问题描述】:

我们有一个小型 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 查询 从 Truck Table 到 Contract Table 直到我们得到 ProductIDSupplierID 然后 这是一个很长的查询。你怎么看?
  3. 您如何看待数量控制?库存是用计算的 报告中的字段。

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

【问题讨论】:

  • 每个合同只能有一种产品吗?

标签: model many-to-many


【解决方案1】:

根据您的描述,您似乎需要更改发票和导入表之间的关系(“使用一对多发票,您可以进行 0 对 1 导入”)。您在发票表中将导入 ID 作为 FK,但我很确定您真正想要的是与发票和导入之间的连接表的多对多关系,以便您可以在每次导入时关联许多发票.

此外,如果每个合同可以有多个产品,则需要在合同和产品表之间建立一个连接表,以便在产品和合同之间创建多对多关系。换句话说,我假设您在多个合同中使用相同的产品,并且这些合同中至少有一些可能涉及不止一种产品?

我不会太担心几个连接。如果您要连接十几个表或其他东西,那么在我研究非规范化架构之前,我会考虑创建一个或两个战略视图以简化查询。

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

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

【讨论】:

  • 非常感谢克雷格。虽然每个合同只有一个产品(总是),但我可以轻松地删除那里的多对多。另外我应该删除supplierinvoice_import 的连接表,因为没有包含很多进口的发票。同时,我在手机上看到了您之前的回复(在您编辑之前)。我认为它更适合我的需求。不过这个已经够清楚了,所以我要选择supplierinvoiceID作为Import table的FK。
  • 我很高兴这有帮助。至于我的编辑,当我今天早上重新阅读您的问题时,它给我的印象有所不同,我认为我可能弄错了您的假设,因此将发票导入表更改为多对多。再次,我很高兴能够提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2014-02-02
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多