规范化此数据的最佳方法

时间:2013-11-04 15:37:30

标签: mysql sql database database-design

我有两个表,'产品'和'产品包'。

一种产品可以出现在许多产品包中,产品包可以有许多产品(多对多关系)。

我还创建了一个链接表来尝试解决这种关系,但我留下了以下难题:

-------------------
|  Linking table  |
-------------------
| Prod_Id | PP_id |
|  1      |  3    |
|  1      |  4    |
|  1      |  5    |
|  1      |  6    |
|  1      |  7    |
|  2      |  5    |
|  2      |  7    |
|  2      |  8    |
|  2      |  10   |
|  2      |  4    |

这是数据库设计的常规做法吗?这可以进一步改进吗?

3 个答案:

答案 0 :(得分:2)

你有一个很好的起点。

在这里你应该考虑,使表格的两个字段成为复合的主键。这样可以防止@musical_coder注意到的重复记录。

您还可以考虑添加一个整数列,指示包中的产品数量。

最后,您可能希望添加一些元数据列,例如CreatedWhen,CreatedBy,LastUpdatedWhen和LastUpdatedBy。这些往往会不时派上用场。

答案 1 :(得分:0)

根据我的经验,我会说这种关系没有问题,但是在分析数据时你需要非常小心,但是你如何建模产品在包装中是合乎逻辑的包中包含 n 产品。所以这还不错。

答案 2 :(得分:0)

编辑:这是一个过时的答案,因为海报将他的示例数据修复为不再包含重复的元组

从数据库规范化的角度来看,这个设计有点棘手:如果在该表中有两个相同的元组应该具有含义(例如,一个计数),那么这个表有一个多集语义,它没有与关系模型很好地混合,因为你没有密钥。

使用具有主键(Prod_ID,PP_Id)的表(Prod_ID,PP_Id,Count)是更好的(第三范式)设计。

修改

所以你的桌子变成了

create table t (Prod_Id int, PP_Id int, Count int, primary key(Prod_Id,PP_Id));

insert into t values 
(1,3,2),
(1,4,1),
(1,5,1),
(1,6,1),
(1,7,1),
(2,5,1),
(2,7,1),
(2,8,1),
(2,10,1),
(2,4,1);

select * from t;

Prod_Id     PP_Id       Count
----------  ----------  ----------
1           3           2
1           4           1
1           5           1
1           6           1
1           7           1
2           5           1
2           7           1
2           8           1
2           10          1
2           4           1