PostgreSQL 中的规范化 - 跨表共享主键?

Normalization in PostgreSQL - share a primary key across tables?

提问人:Virgilio Gonzenbach 提问时间:6/27/2023 最后编辑:philipxyVirgilio Gonzenbach 更新时间:8/4/2023 访问量:65

问:

我正在设计一个包含三个表的 PostgreSQL 数据库:、 和 。在每个 和 表中,我都有一个唯一的标识符列。buyssellstransaction_pairsbuyssellsid

数据库架构

在表中,我有 和 列,它们分别充当 和 表字段的外键。表格:pairsbuy_idsell_ididbuyssellstransaction_pairs

编号 filing_year buy_id sell_id
1 2020 1 1
2 2020 2 2
3 2020 3 3
4 2020 4 4

表中的值与 和 表中的相同值相对应。因此,我正在考虑是否可以通过在所有三个表之间共享主键来消除冗余。idpairsidbuyssells

(这些数字匹配的原因是我将原始交易拆分为买入与卖出配对。因此,与表和三个表的一对多关系,并且具有相同的行数。raw_transactionsbuyssellstransaction_pairs

如果可能的话,我尽量避免将所有信息合并到一个表中,但我也希望避免重复信息。

以这种方式在多个表之间共享主键是否是一种好的做法,如果是这样,我应该如何在 PostgreSQL 中实现这一点?

我也对如何在DBML中记录这种关系感兴趣。

为了减少冗余,我尝试在表中创建一个复合键:transaction_pairs

CREATE TABLE "transaction_pairs" (
  "buy_id" INT,
  "sell_id" INT,
  "filing_year" INT,
  PRIMARY KEY ("buy_id", "sell_id")
);

但是,该buy_id中存在剩余的冗余,sell_id将始终具有相同的值。

我们可以进一步减少它吗?

SQL PostgreSQL 设计 数据库 规范化 DBML

评论

1赞 Adrian Klaver 6/27/2023
为什么不让 FK 和 FK 坐到桌子上呢?transaction_pairsbuy_idsell_idraw_transactions
0赞 Virgilio Gonzenbach 6/27/2023
因为在我的用例(加密税务报告)中,我需要进一步拆分原始交易。例如,假设您以两种不同的价格购买 2 BTC (1) $30k 和 (2) $60k。然后,您卖出 0.5 BTC @ 45k (3),总共 3 笔原始交易。为了优化损失,卖出交易将以相同的方式报告,但配对买入将来自第二个@ 60k,它仅占买入总金额的0.5 [显示损失0.5 * (60k - 45k)]。因此,引用 and 表而不是 .sellsraw_transactiontransaction_pairsbuyssellsraw_transactions
0赞 Virgilio Gonzenbach 6/27/2023
我也可能遇到销售被拆分的情况。通常,in 和 中的行数会比 in 多得多。buyssellsraw_transactions

答:

0赞 Huzaifa 6/27/2023 #1

目前,您有两个相同的表(买入和卖出)。您可以进一步规范化它,您可以拥有单个主键,在所有其他表中作为外键引用。

例如:有另一个表,其中包含“买入”和“卖出”表的共同信息。此表中的每一行都将具有唯一的 id(主键),该 id 在其他表中将是外键。

另外:无法实现 100% 的数据库规范化。

评论

0赞 Virgilio Gonzenbach 6/27/2023
嗯,我可以在 和 中创建一个主键,然后将其引用为 和 中的外键。我的后续问题是,表(例如)没有主键(?transaction_pairsbuyssellsbuys