在PostgreSQL中,如何在同一行中存储多个id(与单个值相关)?

2izufjch  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(198)

我已经安装了PostgreSQL 15,目前我没有使用其他第一/第三方插件或工具。
这里有一个简单的例子,说明我想实现的目标。
我有一个表“Category”,填充如下:
| id(PK)|说明|
| - -----|- -----|
| C1|类别1|
| C2|第二类|
| C3|第三类|
| C4|第四类|
我需要填充一个新的表“产品计数”,其中每个类别都绑定到给定年份销售产品的计数。不幸的是,对于某些类别,我只有这些类别的总和。
数据以如下形状排列在Excel文件中:
| 年|类别|计数|
| - -----|- -----|- -----|
| 二〇二〇年|C1|一百五十|
| 二〇二〇年|C2、C3|一百|
| 二〇二〇年|C4|四百|
| 二〇二一|C1|两百|
| 二〇二一|C2、C3、C4|三百五十|
我需要的是一种将这些数据方便地存储在PK为(year,category_id(s))的表中的方法。但我不知道如何设计解决方案。
实际的问题是,由于count值是聚合的,我需要聚合类别,我想成为主键的一部分。
到目前为止,我认为有一个中间表(可以称为“类别组”),它考虑到类别聚合:
| 组id|类别id|
| - -----|- -----|
| G1| C1|
| | |
| G2| C2|
| G2| C3|
| | |
| G3| C4|
| | |
| G4| C2|
| G4| C3|
| G4| C4|
以便ProductCount表可以利用类别组来解决问题。但这样看来在我看来有点乱,而且我失去了类别和产品数量之间的直接联系。
有没有更聪明的方法来设计它?你能帮我吗?谢谢你!

dluptydi

dluptydi1#

不,没有更聪明的方法。在关系代数和关系数据库中,创建一个单独的表来存储多对多的链接是一种行之有效的做法。所以,你有a(a_id,...),B(b_id,...),a_b(a_b_id,a_id,b_id,...)表来粗略地表达它。
这种方式乍一看似乎很混乱,但随着你获得更多的经验,它会变得非常清楚,这种分离是极其重要的。一些原因:
1.如果在一个字段中有多个相同类型的值,则违反了1NF(参见https://en.wikipedia.org/wiki/First_normal_form),您将遇到很多困难

  • 当你想搜索一个有id的记录时(你的id被混淆在一个字段中)
  • 当你更新字段时(你总是需要解析、修改和解析回值)
  • 当您删除在此复合字段中引用的一个id时

1.您可以通过将多个值混合到单个字段中来解决不一致和冗余问题。当该ID由于某种原因发生更改时,您将始终需要更新引用该ID的所有记录(请参阅有关更新的困难)
1.如果两个引用都存储在两个表的记录中,可能会浪费空间

相关问题