如何规范化表,其中一列引用同一表中不同列的多行

时间:2019-06-06 10:36:46

标签: sql database postgresql database-design database-normalization

我正在尝试创建一个表,该表列出了不同的应用程序以及它们是否与该列表中的其他应用程序集成。

ID  SKU     NAME            Integrations
1   pdk1    hubspot crm pdk3,pdk4,pdk5
2   pdk2    sugar crm   pdk5
3   pdk3    pipedrive   pdk1
4   pdk4    quickbooks  pdk1
5   pdk5    mailchimp   pdk1,pdk2

如何规范积分列?

2 个答案:

答案 0 :(得分:1)

您的示例中SKU之间的关系为“多对多”(M:M)。在列中存储多个逗号分隔的值违反了第一个范式(1NF)。因此,您需要使用其他链接表来规范化表和模型M:M关系。

SKU表

SKU
---
ID  SKU     NAME        
1   pdk1    hubspot crm 
2   pdk2    sugar crm   
3   pdk3    pipedrive   
4   pdk4    quickbooks  
5   pdk5    mailchimp   

链接表

SKU_INTEGRATION
---------------
ID  INTEGRATED_WITH_ID
1   3
1   4
1   5
2   5
3   1
4   1
5   1
5   2

您可能会看一本书“ Programming with databases”,其中涉及标准化,不同类型的链接建模等主题。

答案 1 :(得分:0)

这是您想要的吗?

select id, sku, name,
       regexp_split_to_table(integrations) as integration
from t;

这不是完全“规范化”的,但是它消除了使用分隔字符串来表示多个值的情况。