>我有一个卖家产品表。表格中的每一行代表卖家提供的商品信息。"卖方产品"表包含以下列:
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...
此信息更规范化,productName
和productDescription
依赖于Product
表的主键,price
依赖于SellerProducts
表的主键。
不幸的是,清理数据很可能会被证明是乏味的......但是,除非您现在解决此规范化问题,否则您的问题只会不断复杂化,直到数据库无法维护。