无关联表的多对多关系

问题描述 投票:0回答:2

据我所知,如果您建立多对多关系,我通常会使用association table。不过,现在我有业务需求(不确定他们是否具有数据库知识)直接在两个表之间创建relationships。对我来说这是不可能的。他们说我必须执行以下操作,例如,他们说的是:

TableA
ID (PK)
refKey

TableB
ID (PK)
refKey

TableA.refKeyTableB.refKey.之间多对多是可能的吗?我已经尝试过了,但是postgres让其创建了unique。并且..如果我以我的知识为unique中的任何一个创建refKey,它将为1:M or M:1。我想念什么吗?但是,如果您说有可能,请根据该特定示例使用示例代码来启动这种连接。

sql postgresql many-to-many
2个回答
1
投票

您是对的,只有一对多或一对多的关系。您需要的是联接表,例如:

create table A_B (
    A_id bigint references A,
    B_id bigint references B
)

然后,您可以根据需要拥有任意多个具有相同A_idB_id的行。这导致了多对多关系。


0
投票

可以仅使用两个表创建多对多关系。这不是最佳做法,但在某些情况下可能是可行的。

在Postgres中,最简单的方法是拥有一个引用第二个表的ID数组:

create table a (
   a_id int generated always as identity,
   b_ids[] int
);

为什么这通常是个坏主意?

  • 您无法轻松验证外键约束。 (嗯,您可以使用触发器或UDF。)
  • 您无法轻易保证唯一性。 (好吧,您可以使用奇特的check约束。)
  • 您无法轻易看到“反”关系。 (好,您可以使用unnest()。)
  • 您无法轻松索引a中的数组元素。

换句话说,当您这样做时,很多“内置”功能会丢失。

我应该注意,您也可以使用JSON和数组来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.