0

我们有一个小型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 对我们进一步推进非常重要。感谢您的帮助。

4

1 回答 1

1

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

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

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

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

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

显示合同和产品之间以及发票和进口之间的多对多关系的模式

于 2013-04-17T06:14:52.473 回答