Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database M:N关系与表 我创建了一个简单的购物车DB模型,让我们考虑一下订购、产品和购物车。_Database_Database Design_Data Modeling_Cardinality - Fatal编程技术网

Database M:N关系与表 我创建了一个简单的购物车DB模型,让我们考虑一下订购、产品和购物车。

Database M:N关系与表 我创建了一个简单的购物车DB模型,让我们考虑一下订购、产品和购物车。,database,database-design,data-modeling,cardinality,Database,Database Design,Data Modeling,Cardinality,我的问题是购物车和产品有M:N关系吗?如果是,则需要创建第三个表。 我已经创造了第三张桌子,但这对我来说没有意义。我可以很好地做到 T_SHOPPING_CART表,并将id、product_id、quantity作为复合主键,并将产品的值存储在其中,而不是创建另一个表来存储这些详细信息。哪一个更接近第三个表或复合主键 我认为答案在于基本面。你已经说过T_购物车和T_产品有m:n关系。因此,当您分解任何多对多关系时,它总是创建一个关联表或动名词 让我们看看为什么你的方法行不通。您只需要在T_SH

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


我认为答案在于基本面。你已经说过T_购物车和T_产品有m:n关系。因此,当您分解任何多对多关系时,它总是创建一个关联表或动名词

让我们看看为什么你的方法行不通。您只需要在T_SHOPPING_CART表中使用一个复合id

T_SHOPPING_CART_ID(ID, Product_Id, quantity)
如果在主键中包含数量,则每次用户 更改数量时,您的主键将更改。这不是一个好主意 设计的方式

您可能需要的其他属性呢?你要添加它们吗 每次都是主键吗?您需要设计与每个购物车相关联的折扣。你将如何储存它?你能有一个简单的m:1关系和表折扣吗?因为您有一个复合密钥,所以效率很低。 或者,如果您将折扣作为属性存储在T_SHOPPING_CART表中,它将导致甚至严重的缺陷,即冗余。数据冗余会导致各种异常

购物车

ID   PRODUCT_ID    QUANTITY         DISCOUNT

1        101           33             2.3

1        102           20             2.3
在这里,id=1的购物车的折扣为2.3。它是冗余的,即存在于2个位置,这会导致更新、删除和异常

如果你删除一个产品,你将如何处理?如果是级联删除,您将丢失所有拥有该产品的购物车。如果您不级联,您将存储什么来代替已删除的项?空值,默认值?非常糟糕的设计。 我的基本论点是,如果你阅读多对多关系的基本原理,你会找到所有答案。多对多应始终与第三个表链接

希望能有帮助