Mysql 规范化此数据的最佳方法

Mysql 规范化此数据的最佳方法,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我有两张桌子,“产品”和“产品包装” 一个产品可以出现在多个产品包中,一个产品包可以有多个产品(多对多关系) 我还创建了一个链接表来尝试解决这种关系,但我遇到了以下难题: ------------------- | Linking table | ------------------- | Prod_Id | PP_id | | 1 | 3 | | 1 | 4 | | 1 | 5 | | 1 | 6 | | 1

我有两张桌子,“产品”和“产品包装”

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

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

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

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

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

你有一个很好的起点

在这里,你应该考虑把表的两个字段变成复合的初始键。正如@music_coder所指出的那样,这将防止重复记录

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


最后,您可能希望添加一些元数据列,如CreatedWhen、CreatedBy、LastUpdatedWhen和LastUpdatedBy。编辑:这是一个过时的答案,因为海报修复了他的示例数据,使其不再包含重复的元组

从数据库规范化的角度来看,这种设计有点棘手:如果该表中有两个相同的元组应该有意义(例如计数),那么该表有一个多集语义,这与关系模型不匹配,因为您没有键

具有主键(Prod_ID,PP_ID,Count)的表(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

问题是产品1的两个副本出现在第3页?请更具体地说明这个难题是什么。是的,我只是假设这种数据被反复计算为冗余数据?如果可以的话,应该被标准化到另一个层次?这是正确的方法。啊,不,你不能这样做。每种关系只应发生once@Strawberry:海报是否应该在此链接表中添加数量列,然后删除重复条目?否则,他将无法在两个ID列上放置主键,我认为这在这里是有意义的。但是prod_ID不能是主键,因为它必须在表中多次出现。键由两个属性组成,Prod_Id和PP_Id。其含义是:表中的两个不同行不能同时在两个键列中相同。在您的示例数据中,只有对(1,3)违反了该密钥-我已经在上面添加了转换后的数据。它符合CREATETABLE语句,但我仍然很难看到count列的相关性!仅当您希望一对(Prod_Id,PP_Id)被连接多次时,它才是相关的,就像您的示例的初始版本一样。我将使用count列做什么?quantity列可以用来描述包的内容。xyz包包含3个产品1和4个产品2等