规范化一对CSV表中的数据

时间:2016-09-28 17:01:14

标签: mysql database-normalization

我试图规范化某些数据,似乎无法提出解决方案。我所拥有的是这样一张桌子:

weight  position1   position2   position3
1       10          20          30
2       25          35          45
3       17          05          22

和这样的一个:

location    position
6           1   
7           1   
8           2   
9           2   
10          2   
11          3   
12          3   

如何规范上述内容以便给定位置和权重,我可以找到给定位置的值?

我可以使用Perl,Python,Excel,MySQL或几乎任何块上的工具来进行数据的实际重组;我遇到问题的地方在于提出合理的架构。

这里想要的结果是

if location == 11 -> position is 3

因此,

if weight == 2 -> the value is 45

1 个答案:

答案 0 :(得分:1)

唯一要做的是" unpivot"你的第一个表格:

weight  position     value
   1        1          10
   1        2          20
   1        3          30
   2        1          25
   2        2          35
   2        3          45
   3        1          17
   3        2          05
   3        3          22

前两列应包含唯一的值对。如果您有其他信息仅取决于体重,那么您需要另一张桌子。职位相同。

转换为新模型

如果您已有表,则可以使用以下语句创建第一个表(t1):

create table t1_new
select weight, 1 as position, position1 as value
from   t1
union all
select weight, 2 as position, position2 as value
from   t1
union all
select weight, 3 as position, position3 as value
from   t1

然后,在验证结果后,删除t1,并将t1_new重命名为t1。

从新模型中查询

要从这些表中查询给定位置和重量的值,您应该使用连接:

select     value
from       t1
inner join t2 on t2.weight = t1.weight
where      t2.location = 11
and        t1.position = 3