【问题标题】:Many-to-Many relationship with same table and with relationship constraint具有同一张表和关系约束的多对多关系
【发布时间】:2016-01-29 19:41:01
【问题描述】:

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

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

【问题讨论】:

  • “不同卖家的产品可能相同”。你这是什么意思?你是说你可以有相同的productName,productDescription 和不同的sellerID?或者您是说两种不同的产品可以具有相同的功能但它们是竞争对手?如果是前者,那么你有一个严重的规范化问题。如果是后者,那么我不确定您如何将某物识别为“相同”。
  • 对不起...我编辑了原始帖子以包含一个示例。希望它会更好地澄清。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    • 您的 sellerID 字段完全属于不同的表。 product 就是……代表一个对象的单个实体。另一方面,seller 是提供product 供销售的独立实体。由于seller 可以有多个products,而product 可以被多个sellers 出售,因此您需要bridge entity(也称为复合实体)来消除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 表的主键。

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

    【讨论】:

    • 谢谢。不幸的是,我们维护的产品没有明确的方法来识别它们,例如序列号 + 制造商。这就是为什么管理员用户需要查看为产品提供的卖家信息(例如产品名称/描述)并确定它是否与其他卖家提供的产品相同。
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 2012-08-27
    • 2020-09-09
    • 2018-06-29
    • 2015-11-12
    • 2019-10-15
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多