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

Model 多对多-非识别关系数据模型,model,many-to-many,Model,Many To Many,我们有一个小型的SQLServer2000数据库,用于导入交易商品并向其扩展新功能。我对实现正确的PK-FK关系感到困惑 我们有三个表格: Contract (ContractID (PK), SupplierID (FK), ProductID(FK), Date, Quantity, Price ) SupplierInvoice ( SupplierInvoiceID (PK), ContractID (FK) , ImportID (FK) , InvoiceNo, Date,Quan

我们有一个小型的SQLServer2000数据库,用于导入交易商品并向其扩展新功能。我对实现正确的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)是否正确?你觉得怎么样
  • 进口后,我们把进口的货物装到卡车上,所以我们应该进货 我们要从哪个供应商处装载哪个产品。如果我们开始进行
    JOIN
    查询 从卡车表到合同表,直到我们得到
    ProductID
    SupplierID
    ,然后 这是一个很长的问题。你觉得怎么样
  • 你认为数量控制怎么样?存货以计算出的价格计算 现场报告

  • 问题1和2对我们进一步行动非常重要。谢谢你的帮助

    根据您的描述,听起来您需要更改发票和导入表之间的关系(“对于一对多发票,您进行0对1导入”)。在发票表中,您有一个作为FK的导入id,但我很确定,您实际上想要的是发票和导入之间的连接表的多对多关系,以便每次导入都可以关联多个发票

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

    我不会太担心一些加入。如果您要连接十几个表或其他什么,那么在我考虑对模式进行非规范化之前,我将考虑创建一两个策略视图以简化查询

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

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


    每份合同只能提供一种产品吗?非常感谢Craig。虽然每个合同只有一个产品(总是),但我可以很容易地删除那里的多对多产品。我还应该删除supplierinvoice\u导入的联接表,因为没有包含许多导入的发票。同时,我在我的手机上看到了你之前的回复(在你编辑之前)。我认为它更适合我的需要。但这一点很清楚,所以我将选择supplierinvoiceID作为导入表的FK。我很高兴这有帮助。至于我的编辑,当我今天早上重新阅读你的问题时,我的感觉不同了,我认为我可能误解了你的假设,因此将发票导入表更改为多对多。再一次,我很高兴我能帮上忙。