我已经安装了PostgreSQL15,目前我没有使用其他第一方/第三方插件或工具.

这里有一个简单的例子,说明了我想要实现的目标.

我有一个表"Category",填充如下:

id(PK) Description
C1 Category 1
C2 Category 2
C3 Category 3
C4 Category 4

我需要填充一个新的表"Product Count",其中每个类别都绑定到给定年份的销售产品计数.不幸的是,对于某些类别,我只有这些类别的总和.

数据排列在如下所示的Excel文件中:

year category count
2020 C1 150
2020 C2, C3 100
2020 C4 400
2021 C1 200
2021 C2, C3, C4 350

我需要的是一种方便地将这些数据存储在主键为(Year,ategory_id(S))的表中的方法.但我并不确切知道如何设计解决方案.

实际问题是,因为计数值是聚合的,所以我需要聚合类别,我希望成为我的主键的一部分.

到目前为止,我的 idea 是有一个中间表(可以称为"Category Group")来考虑类别聚合:

group_id category_id
G1 C1
G2 C2
G2 C3
G3 C4
G4 C2
G4 C3
G4 C4

这样,产品计数表就可以利用类别组来解决这个问题. 但在我看来,这似乎有点混乱,而且我失go 了类别和产品数量之间的直接联系.

有没有更聪明的方法来设计它?你能帮帮我吗? 非常感谢!

推荐答案

不,没有比这更聪明的方法了.在关系代数和关系数据库中,为了存储多对多链接而创建单独的表是一种成熟的做法.因此,粗略地说,您有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的所有记录(请参阅有关更新的困难)
  2. 如果两个引用都存储在两个表的记录中,则可能会浪费空间

Postgresql相关问答推荐

复合索引列的顺序导致不同的计划

PostgreSQL\d命令:有办法只 Select 一列吗?

Postgres:这是对OVERLAPS谓词的等效重写吗?

无法将 json 范围读取为 pgtype.Int4range

AGE Graph 实际上存储为 postgreSQL 表,对吧?如何检索该表(不是图表)?

无法使用golang在postgresql中使用自定义类型插入/更新数据

GORM 不会创建 many2many 关联

postgreSQL 将列数据类型更改为没有时区的时间戳

Postgis 中 2 点之间的距离,单位为 4326 米

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

如何从 CSV 为 PostgreSQL 副本生成模式

带有偏移限制的 Select 查询太慢了

如何在 redshift 中对字段进行 GROUP BY 和 CONCATENATE

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

pg_restore 会覆盖现有的表吗?

在子类的 Hibernate 中 for each 表指定不同的序列

在 postgres 中导出为 CSV 并使用 GZIP 压缩

Ecto Postgres 安装错误密码验证失败

提高查询速度:simple SELECT in big postgres table

PostgreSQL 的EXPLAIN解释中的 width字段是什么意思?