提问人:Virgilio Gonzenbach 提问时间:6/27/2023 最后编辑:philipxyVirgilio Gonzenbach 更新时间:8/4/2023 访问量:65
PostgreSQL 中的规范化 - 跨表共享主键?
Normalization in PostgreSQL - share a primary key across tables?
问:
我正在设计一个包含三个表的 PostgreSQL 数据库:、 和 。在每个 和 表中,我都有一个唯一的标识符列。buys
sells
transaction_pairs
buys
sells
id
在表中,我有 和 列,它们分别充当 和 表字段的外键。表格:pairs
buy_id
sell_id
id
buys
sells
transaction_pairs
编号 | filing_year | buy_id | sell_id |
---|---|---|---|
1 | 2020 | 1 | 1 |
2 | 2020 | 2 | 2 |
3 | 2020 | 3 | 3 |
4 | 2020 | 4 | 4 |
表中的值与 和 表中的相同值相对应。因此,我正在考虑是否可以通过在所有三个表之间共享主键来消除冗余。id
pairs
id
buys
sells
(这些数字匹配的原因是我将原始交易拆分为买入与卖出配对。因此,与表和三个表的一对多关系,并且具有相同的行数。raw_transactions
buys
sells
transaction_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将始终具有相同的值。
我们可以进一步减少它吗?
答:
0赞
Huzaifa
6/27/2023
#1
目前,您有两个相同的表(买入和卖出)。您可以进一步规范化它,您可以拥有单个主键,在所有其他表中作为外键引用。
例如:有另一个表,其中包含“买入”和“卖出”表的共同信息。此表中的每一行都将具有唯一的 id(主键),该 id 在其他表中将是外键。
另外:无法实现 100% 的数据库规范化。
评论
0赞
Virgilio Gonzenbach
6/27/2023
嗯,我可以在 和 中创建一个主键,然后将其引用为 和 中的外键。我的后续问题是,表(例如)没有主键(?transaction_pairs
buys
sells
buys
评论
transaction_pairs
buy_id
sell_id
raw_transactions
sells
raw_transaction
transaction_pairs
buys
sells
raw_transactions
buys
sells
raw_transactions