0

我有两个表,“产品”和“产品包”。

一个产品可以出现在多个产品包中,一个产品包可以包含多个产品(多对多关系)。

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

-------------------
|  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    |

这是数据库设计的正常做法吗?这可以进一步完善吗?

4

3 回答 3

2

你有一个很好的起点。

在这里您应该考虑将表的两个字段变成复合主键。这将防止@musical_coder 指出的重复记录。

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

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

于 2013-11-04T15:53:47.323 回答
0

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

于 2013-11-04T15:44:02.490 回答
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
于 2013-11-04T16:09:56.753 回答