【问题标题】:M : N relation ship and tableM : N 关系和表
【发布时间】:2014-11-08 04:58:19
【问题描述】:

我已经为购物车创建了一个简单的数据库模型,现在让我们只考虑订单、产品和购物车

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

【问题讨论】:

    标签: database database-design data-modeling cardinality


    【解决方案1】:

    我认为答案在于基本面。您已经说过 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 表中,则会导致更严重的缺陷,冗余。数据冗余会导致各种异常。

    T_SHOPPING_CART

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

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

    1. 如果您删除了一个产品,您将如何处理它?如果是级联删除,您将丢失所有包含该产品的购物车。如果您不级联,您将存储什么来代替已删除的项目?空,默认值?非常糟糕的设计。

    我的基本论点是,如果您阅读多对多关系的基础知识,您会找到所有答案。多对多应始终与第三张表链接。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2011-07-26
      • 2018-08-18
      • 2018-05-02
      • 2019-10-05
      相关资源
      最近更新 更多