0

我有一个 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 来自给定行的同一个卖家。那不应该被允许。

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

4

2 回答 2

0

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

于 2016-01-29T20:52:49.573 回答
0

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

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

  • 您的sellerID字段完全属于另一个表。Aproduct就是……代表一个对象的单个实体。seller另一方面,A是提供product出售的独立实体。由于 aseller可以有 manyproducts并且 aproduct可以被 many 出售sellers,因此您需要一个桥接实体(也称为复合实体)来消除这种many-to-many关系。如果您从您的产品表中拆分 SellerID 信息,您将拥有如下内容:

产品表

    serialnumber   pk
    manufacturer   pk
    productName
    productDescription

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

    sellerID       pk
    manufacturer   pk
    serialnumber   pk
    Price

卖家表

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

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

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

于 2016-01-29T21:21:14.437 回答