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



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

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

产品在各个卖家之间可能相同,但产品名称、产品描述和产品价格可能因卖家而异。

例如,考虑产品 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 来自给定行的同一卖家。这是不允许的。

如何在强制实施此约束的同时捕获此多对多关系?

您需要一些

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

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

  • 您的id字段不能唯一标识您的数据;确保每一列都依赖于此字段对于正确的规范化至关重要。你永远不应该处于需要一双人类眼睛来识别两个不同数据的情况,这两个数据实际上代表同一个东西。如果我不得不猜测id字段可能只是一个递增的键......放弃这个以获得真正唯一的标识符......例如制造商的复合密钥和制造商的序列号,因此您知道您不能拥有两个相同的产品

  • 您的sellerID字段完全属于不同的表。product就是这样...表示对象的单个实体。另一方面,seller是一个单独的实体,提供待售product。由于一个seller可以有许多products,而一个product可以由许多sellers出售,因此您需要一个桥接实体(也称为复合实体(来消除many-to-many关系。如果您从产品表中拆分卖家ID信息,您将获得如下所示的内容:

产品表

    serialnumber   pk
    manufacturer   pk
    productName
    productDescription
卖方

产品表(产品和卖方之间的桥梁实体(

    sellerID       pk
    manufacturer   pk
    serialnumber   pk
    Price

卖家表

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

此信息更规范化,productNameproductDescription依赖于Product表的主键,price依赖于SellerProducts表的主键。

不幸的是,清理数据很可能会被证明是乏味的......但是,除非您现在解决此规范化问题,否则您的问题只会不断复杂化,直到数据库无法维护。

最新更新