在MySQL中必要时存储冗余信息或连接表是否更好?

时间:2010-07-13 12:17:51

标签: php mysql database database-design e-commerce

我有一个网上商店,用户可以在这里购买带有自己产品的小商店。这些产品中的每一个都可以有与之相关的问题,并且商店的所有者有能力回答这些问题。此信息存储在3个表中,包括“问题”(QuestionID,ProductID,...)表,“产品”(ProductID,ShopID,...)表和“商店”(ShopID,OwnerID,...)表。

在“问题”表格中设置ShopID(允许店主查看他的所有问题)或加入这三个表格以获得与某个商店匹配的问题更好吗?

5 个答案:

答案 0 :(得分:10)

加入并避免冗余信息几乎总是更好。为了达到性能目标,您必须denormalize才能这样做 - 在首先尝试使用normalized表之前,您无法知道是否需要执行此操作。

请注意,非规范化有助于提高读取性能,但代价是减慢写入速度并使编码错误更容易导致数据不同步(因为您在不止一个地方存储相同的内容一定要更新所有内容。)

答案 1 :(得分:2)

通常最好避免冗余信息。这似乎应该是一个非常便宜的连接,给定适当的索引,我不会以这种方式非规范化,除非我在查询计划中看到JOIN导致问题(可能是因为表中的记录数)< / p>

您还需要考虑读取与写入的比率。非规范化将有助于读取,但会增加写入开销。

答案 2 :(得分:2)

从设计的角度来看,不需要存储冗余数据。在你的情况下它可能是。尝试进行一些测试,如果查询时间因此冗余而得到改善,那么您应该继续进行非规范化。

答案 3 :(得分:1)

问题和产品之间应该有多对多的关系:

questions_ref (question_id,question_code,问题)

product_questions (pquestion_id,question_id_fk,product_id_fk)

产品(product_id,product_name等)

如果产品可能在多个商店(确实如此),那么商店和产品之间也应该有多对多的关系。

shop_products (sproduct_id,product_id_fk,shop_id_fk,sproduct_price,other_shop_specific_param)

商店(shop_id,owner_id_fk,shop_name等)

答案 4 :(得分:1)

我认为你的设计没问题。我不会将ShopID添加到表格问题中。如有必要,您应该使用联接。

顺便说一句:您应该在产品和商店之间使用m:n关系并删除ShopID for Products。因此,您可以在不同的商店中使用相同的产品也是产品的相同问题。

问候,Lars