【问题标题】: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_CART 和 T_PRODUCT 具有 m:n 关系。因此,当您分解任何多对多关系时,它总是会创建一个关联表(或动名词)。
让我们看看为什么您的方法行不通。您只想在 T_SHOPPING_CART 表中使用复合 id
T_SHOPPING_CART_ID(ID, Product_Id, quantity)
如果您在主键中包含数量,则每次用户
改变数量,你的主键就会改变。这不是一个好
设计方法。
您可能需要的其他属性呢?你要添加它们吗
每次都作为主键?例如。您需要设计与每个购物车关联的折扣。你将如何存储它?你能与表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 个地方,这会导致更新、删除、异常。
- 如果您删除了一个产品,您将如何处理它?如果是级联删除,您将丢失所有包含该产品的购物车。如果您不级联,您将存储什么来代替已删除的项目?空,默认值?非常糟糕的设计。
我的基本论点是,如果您阅读多对多关系的基础知识,您会找到所有答案。多对多应始终与第三张表链接。
希望对你有帮助。