我有一个网上商店,用户可以在这里购买带有自己产品的小商店。这些产品中的每一个都可以有与之相关的问题,并且商店的所有者有能力回答这些问题。此信息存储在3个表中,包括“问题”(QuestionID,ProductID,...)表,“产品”(ProductID,ShopID,...)表和“商店”(ShopID,OwnerID,...)表。
在“问题”表格中设置ShopID(允许店主查看他的所有问题)或加入这三个表格以获得与某个商店匹配的问题更好吗?
答案 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