数据库设计,如何减少不同列的数据冗余

时间:2016-07-08 02:12:08

标签: mysql sql database database-design relational-database

我有一个现有的表,需要不同的列用于不同的记录。我需要将其拆分为多个表以减少冗余吗?

表1:

productId   typeId  commonAttr1 commonAttr2 attrA1  attrB1 attrB2
_________________________________________________________________
1           1       1Avalue1    1Avalue2    value1      
2           1       1Avalue1    1Avalue2    value2
3           2       2Bvalue1    2Bvalue2            value3  value4
4           2       2Bvalue3    2Bvalue4            value5  value6 

" attrA1"仅适用于typeId = 1," attrB1"和" attrB2"仅适用于typeId = 2," commonAttr1"," commonAttr2"适用于两者。

可能有3个选项:

1。不要换。接受数据冗余。

2。移动" attrA1"到新表2,移动" attrB1"," attrB2"新表3.它将像:

表1:

productId   typeId  commonAttr1 commonAttr2
___________________________________________
1           1       1Avalue1    1Avalue2
2           1       1Avalue1    1Avalue2 
3           2       2Bvalue1    2Bvalue2           
4           2       2Bvalue3    2Bvalue4 

表2:

productId   attrA1
__________________
1           value1
2           value2

表3:

productId   attrB1   attrB2
___________________________
3           value3   value4
4           value5   value6

3.创建一个新表以将列存储为键/值

表1:

productId   typeId  commonAttr1 commonAttr2
___________________________________________
1           1       1Avalue1    1Avalue2
2           1       1Avalue1    1Avalue2 
3           2       2Bvalue1    2Bvalue2           
4           2       2Bvalue3    2Bvalue4 

表2:

productId  typeId   key       value
____________________________________
1          1        attrA1    value1
2          1        attrA1    value2 
3          2        attrB1    value3           
3          2        attrB2    value4
4          2        attrB1    value5
4          2        attrB2    value6

哪个选项更好或有其他解决方案吗?我个人认为选项2更好。

2 个答案:

答案 0 :(得分:0)

4 一个包含productIdtypeIdcommonAttr1commonAttr2json

的表格

其中最后一列是其他键值对的JSON呈现。

EAV(实体 - 属性 - 值)架构存在问题;有时#4是一个有用的妥协。 More discussion

答案 1 :(得分:0)

当你有一个模式,其中公共属性存储在一个表中时,其他表存储在它们的从属表中,它被称为模型(基础)类型/子类型设计(或继承模型)。在此stackoverflow question中,您可以很好地正确实现它(以保持参照完整性)

希望有所帮助