我们有一个小的 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)
说明:
这些是散装产品,没有包装,只是数量。
问题:
JOIN
查询
从卡车表到合同表,然后我们得到ProductID
和SupplierID
这是一个非常长的查询。你觉得怎么样?问题1和2对于我们进一步发展非常重要。非常感谢您的帮助。
答案 0 :(得分:1)
根据您的描述,您可能需要更改发票和导入表之间的关系("使用一对多发票进行0到1导入")。您在发票表中将导入ID作为FK,但我非常确定您实际需要的是与发票和导入之间的连接表的多对多关系,以便您可以关联多个发票每次进口。
此外,如果每个合同可以有多个产品,则需要在合同和产品表之间使用连接表,以便在产品和合同之间创建多对多关系。换句话说,我假设您使用相同的产品用于多个合同,并且至少其中一些合同可能涉及多个产品?
我不会太担心一些加入。如果你到达了你加入十几个表或其他什么的地方,那么在我看看对模式进行非规范化之前,我会考虑创建一两个战略视图以简化查询。
如果您担心加入性能(不要使用这几个表),您可以使用SQL Server进行大量索引调整。您可以在数据库视图上放置索引。 SQL Server 2000还支持物化视图,它基本上指示SQL Server以视图的形状构建(并动态维护)表,以便不必为您执行的每个查询实时执行视图定义中的连接。您还可以创建可更新的视图,并且可以在视图上放置数据库触发器的子集。因此,为了数据完整性,我会坚持使用规范化的模式。我认为有很多解决方案可以解决查询复杂性和加入性能问题。
编辑:这是一个更新的示例ER图,显示合同和产品之间以及发票和导入之间的多对多关系。