SQL查询 - 两个关系多对一的表(规范化问题)

时间:2012-11-06 00:52:43

标签: mysql sql normalization

我有这个示例表:

table ORDERS

client   orderno   cant1   code1   notes1   cant2   code2   notes2   cant[i]   code[i] [...]
--------------------------------------------------------------------------------------
1          1        3      AA01    Test      4      BB01    Testing
2          2        10     XX05    Test      



table PRODUCTS

code   prod    price
---------------------
AA01   Engine   100  
BB01   Wheel     50  



table CLIENTS

client   name      address     telephone
-----------------------------------------
  1     Maxwell   24 1st st    0987654321
  2     Hammer    77 main st   1234567890

我需要将它们联系起来,以获取每个产品系列的数量,产品名称和价格(它们是30 cant [i],code [i]和notes [i])和客户的信息(名称) ,地址等)

我发现了这个案例,但我不明白如何将它应用于我的:SQL query two tables with relation one-to-many

我希望它不会太复杂。

提前致谢!

修改

感谢ElectricLlama,我意识到这里的问题是存储订单的表。根据他的回答,数据库的规范化将改善我获取信息的方式。

对于对此解决方案感兴趣的任何人,我找到了这个很棒的网站:http://www.devshed.com/c/a/MySQL/An-Introduction-to-Database-Normalization/

这个SO答案清除了所有!超级清晰易懂! https://stackoverflow.com/a/1258776/888292

3 个答案:

答案 0 :(得分:2)

看看你链接中的内容 - 是的,这看起来像很多废话,但它可能是获得你想要的唯一方法。

问题是您的表未规范化。具体来说,你不应该有名为code1 code2 code3 code4 ... code30

的字段

这种设计存在许多缺陷,包括当客户有31种产品时会发生什么?

在规范化的数据库中,您将拥有一个包含一组cant,code和notes的表,并且每个产品只有一行。

但我猜你无法正常化它。

为了提出自己的答案做得非常好,现在您还可以亲身体验不规范化数据库的影响。

可能想要考虑的是创建一个视图,为您规范化。它将介绍性能问题,但它将为您提供视图介绍,并让您有机会了解解决方案对规范化表的影响。

答案 1 :(得分:0)

Ditto @ElectricLlama&这里有一些链接可以帮助你学习SQL:

答案 2 :(得分:0)

我认为你的表应该看起来像

表格订单

-------------

orderno
客户
代码

这里使orderno,client和code成为表的复合主键