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

标签 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”移动到新的 table2,将“attrB1”、“attrB2”移动到新的 table3。它会像:

表 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 更好。

最佳答案

如果您有一个架构,其中公共(public)属性存储在一个表中,而其他属性存储在它们的从属表中,则称为模型(基本)类型/子类型设计(或继承模型)。在这个计算器中 question你会很好地如何正确地实现它(为了保持参照完整性)

希望对你有帮助

关于mysql - 数据库设计,如何减少不同列的数据冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38257966/

相关文章:

php - 创建 SQL 语句时出错

sql - 链接服务器 "Microsoft.ACE.OLEDB.12.0"的 OLE DB 提供程序 "(null)"

php - PHP/SQL 最大数组大小问题的替代解决方案

ruby-on-rails - 如何在 Rails 中创建用户可自定义的数据库(如 Zoho creator)?

Mysql - 仅对所选的不同行求和

php - 使用 JOIN 的 SELECT 命令的 MySQL 列信息

mysql - 按 : Can't merge two column conditions `order` and id DESC 订购

MySQL:mm 表的结果作为逗号分隔列

sql - 数据访问层的单元测试 - 测试更新方法?

c++ - 将 C++ 对象保存到数据库的库