我有两个表,'产品'和'产品包'。
一种产品可以出现在许多产品包中,产品包可以有许多产品(多对多关系)。
我还创建了一个链接表来尝试解决这种关系,但我留下了以下难题:
-------------------
| 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 |
这是数据库设计的常规做法吗?这可以进一步改进吗?
答案 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