具有相同表和关系约束的多对多关系

时间:2016-01-29 19:41:01

标签: sql many-to-many self-referencing-table

我有一个SellerProduct表。表中的每一行代表卖方提供的产品信息。 SellerProduct表包含以下列:

id (serial, pk)
productName (nvarchar(50))
productDescription (ntext)
productPrice (decimal(10,2))
sellerId (int, fk to Seller table)

产品在卖家之间可能相同,但productName,productDescription和productPrice可能因卖家而异。

例如,考虑产品TI-89。卖方A可能拥有该产品的以下信息:

productName = TI-89 Graphing Calc
productDescription = A graphing calculator that...
productPrice 65.12

卖方B可能拥有该产品的以下信息:

productName = Texas Instrument's 89 Calculator
productDescription = Feature graphing capabilities...
productPrice 66.50

管理员用户需要确定各个卖家的产品是否相同。

我需要一种方法来捕获这些信息(即卖家的产品是相同的)。我可以创建另一个名为SellerProductMapper的表,如下所示:

sellerProductId1 (int, pk, fk to SellerProdcut table)
sellerProductId2 (int, pk, fk to SellerProdcut table)

这种方法的问题在于它允许sellerProductId1和sellerProductId2来自给定行的同一卖家。这不应该被允许。

如何在执行此约束时捕获这种多对多关系?

2 个答案:

答案 0 :(得分:0)

您需要一些当前没有的东西:“产品标识”表。如果我正在设计它,它将有产品ID,制造商的产品代码和制造商的描述。然后,SellerProduct中的条目将引用卖方和产品,您可以使用卖方和产品组合的唯一索引来强制执行约束。

答案 1 :(得分:0)

您遇到了问题,因为您的表格设计实际上存在更严重的数据问题。

  • 您的id字段无法唯一标识您的数据;确保每列都依赖于此字段对于normalization是至关重要的。你永远不应该处于需要一双人眼来识别实际上代表同一事物的两个不同数据的情况。如果我不得不猜测id字段可能只是一个递增的密钥......请将其作为真正唯一的标识符...例如制造商的复合密钥和制造商的序列号,这样您就知道了你不能拥有两个相同的产品

  • 您的sellerID字段完全属于另一个表。 product就是......代表一个对象的单个实体。另一方面,seller是一个单独的实体,提供product待售。由于seller可以有许多productsproduct可以被许多sellers出售,因此您需要bridge entity(也称为复合实体)来消除many-to-many关系。 serialnumber pk manufacturer pk productName productDescription 如果您从产品表中拆分SellerID信息,您将具有以下内容:

产品表

    sellerID       pk
    manufacturer   pk
    serialnumber   pk
    Price

SellerProducts表(产品与卖家之间的桥梁实体)

    sellerID     pk
    Name
    Location
    Other seller based info, etc...

卖家表

productName

此信息更加规范化,productDescriptionProduct依赖于price表的主键,而SellerProducts依赖于{{1}的主键} table。

不幸的是,清理数据很可能证明是乏味的......但除非你现在解决这个规范化问题,否则你的问题只会在数据库无法维护之前继续复杂化。