M:N关系和表

时间:2014-09-14 15:35:56

标签: database database-design data-modeling cardinality

我为购物车创建了一个简单的数据库模型,现在就考虑订单,产品和购物车

我的问题是购物车与产品有M:N关系吗?如果是,则需要创建第三个表。 我创造了第三张桌子,但对我来说没有意义。我很可能 T_SHOPPING_CART表并将id,product_id,quantity作为复合主键,并将产品值存储在其中,而不是创建另一个表来存储这些详细信息。哪一个更好地接近第三个表或复合主键。

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为答案在于基本面。您已经说T_SHOPPING_CARTT_PRODUCT有m:n的关系。因此,当您分解任意多对多关系时,始终会创建关联表(或动名词)。

让我们看看为什么你的方法不起作用。您只想在T_SHOPPING_CART表中使用复合ID

T_SHOPPING_CART_ID(ID, Product_Id, quantity)
  1. 如果您在每次用户时都在主键中包含数量 更改数量,您的主键将更改。那不是一件好事 设计方法。

  2. 您可能需要的其他属性如何?你打算加他们吗? 每次都是主键吗?例如。您需要设计与每个购物车相关联的折扣。你将如何储存它?你能和表Discount建立简单的m:1关系吗?由于您有一个复合键,因此效率非常低。 或者,如果将折扣作为属性存储在T_SHOPPING_CART表中,则会导致严重的缺陷,冗余。数据冗余会导致各种异常。

  3. T_SHOPPING_CART

    ID   PRODUCT_ID    QUANTITY         DISCOUNT
    
    1        101           33             2.3
    
    1        102           20             2.3
    

    此处,id = 1的购物车折扣为2.3。它是多余的,即出现在2个地方,这会导致更新,删除,异常。

    1. 如果删除产品,您将如何处理?如果是Cascade删除,您将丢失所有具有该产品的购物车。如果您没有级联,您将存储什么来代替已删除的项目?空,默认值?非常糟糕的设计。
    2. 我的基本论点是,如果您阅读了多对多关系的基本原理,您将找到所有答案。许多人应该总是与第三个表联系起来。

      希望它有所帮助。