PostgreSQL中的无方向关系失败

PostgreSQL中的无方向关系失败,sql,database,postgresql,join,edb,Sql,Database,Postgresql,Join,Edb,我试图在PostgreSQL中为我的3个对象创建一个双向关系表。这个想法源于下面的问题,我还想存储行之间的关系及其反向关系 对于我的数据库上的上下文:对象1,它包含(aka涉及许多)object2。反过来,这些Object2也与许多Object3相关。一对多关系(对象1到对象2)和多对多关系(对象2到对象3) 每个对象都在其他表中分配了一个UUID,这些表包含关于它们的信息。基于它们的UUID,我希望能够查询它们并获得关联的对象UUID。这反过来将向我显示关联,并通过知道UUID指示我应该查看哪

我试图在PostgreSQL中为我的3个对象创建一个双向关系表。这个想法源于下面的问题,我还想存储行之间的关系及其反向关系

对于我的数据库上的上下文:对象1,它包含(aka涉及许多)object2。反过来,这些Object2也与许多Object3相关。一对多关系(对象1到对象2)和多对多关系(对象2到对象3)

每个对象都在其他表中分配了一个UUID,这些表包含关于它们的信息。基于它们的UUID,我希望能够查询它们并获得关联的对象UUID。这反过来将向我显示关联,并通过知道UUID指示我应该查看哪个对象的位置、信息等

请注意-一个盒子可能有10个插槽。因此,为该框指定的一个UUID将在我的UUID1列中出现10次!!这是必须的

我的下一步是尝试使用以下查询创建无方向关系:

CREATE TABLE bridge_x 
(uuid1 UUID NOT NULL REFERENCES temp (uuid1), uuid2 UUID NOT NULL REFERENCES  temp (uuid2), 
PRIMARY KEY(uuid1, uuid2), 
CONSTRAINT  temp_temp_directionless 
FOREIGN KEY (uuid2, uuid1) 
REFERENCES bridge_x (uuid1, uuid2)
);

是否有其他方法可以存储所有提到的信息并能够查询UUID以查看对象之间的关系?

您需要在桥接表中使用复合主键。例如,使用一夫多妻制婚姻:



temp.uuid1不是唯一的。这个问题不会因为它而变得更好。很难弄清楚你的数据意味着什么,你想做什么。建议:描述您试图解决的潜在问题。@wildplasser是否有解决方法?因为我不能将temp.uuid1作为唯一的,但仍然需要一个无方向的relationship@laurenzalbe实际上,因为我的数据都是相关/关联的,所以我需要一个可以查询UUID1的表,它会在结果中为我提供关联的对象。您需要UUID1和uuid2的组合是唯一的。(你不需要uuid3和uuid4在桥接表中)你的目标不明确。您的解决方案开始看起来像一个x/y问题。请先说明你的目标,否则没有人能回答你的问题。请在问题中说明你的解释。还要解释uuid[1234]的含义,以及您需要它们的原因。还有:什么是无方向性?
CREATE TABLE person
        (person_id INTEGER NOT NULL PRIMARY KEY
        , name varchar NOT NULL
        );

CREATE TABLE marriage
        ( person1 INTEGER NOT NULL
        , person2 INTEGER NOT NULL
        , comment varchar
        , CONSTRAINT marriage_1 FOREIGN KEY (person1) REFERENCES person(person_id)
        , CONSTRAINT marriage_2 FOREIGN KEY (person2) REFERENCES person(person_id)
        , CONSTRAINT order_in_court CHECK (person1 < person2)
        , CONSTRAINT polygamy_allowed UNIQUE (person1,person2)
        );

INSERT INTO person(person_id,name) values (1,'Bob'),(2,'Alice'),(3,'Charles');

INSERT INTO marriage(person1,person2, comment) VALUES(1,2, 'Crypto marriage!') ; -- Ok
INSERT INTO marriage(person1,person2, comment) VALUES(2,1, 'Not twice!' ) ; -- Should fail
INSERT INTO marriage(person1,person2, comment) VALUES(3,3, 'No you dont...' ) ; -- Should fail
INSERT INTO marriage(person1,person2, comment) VALUES(2,3, 'OMG she did it again.' ) ; -- Should fail (does not)
INSERT INTO marriage(person1,person2, comment) VALUES(3,4, 'Non existant persons are not allowed to marry !' ) ; -- Should fail

SELECT p1.name, p2.name, m.comment
FROM marriage m
JOIN person p1 ON m.person1 = p1.person_id
JOIN person p2 ON m.person2 = p2.person_id
        ;
CREATE TABLE
CREATE TABLE
INSERT 0 3
INSERT 0 1
ERROR:  new row for relation "marriage" violates check constraint "order_in_court"
DETAIL:  Failing row contains (2, 1, Not twice!).
ERROR:  new row for relation "marriage" violates check constraint "order_in_court"
DETAIL:  Failing row contains (3, 3, No you dont...).
INSERT 0 1
ERROR:  insert or update on table "marriage" violates foreign key constraint "marriage_2"
DETAIL:  Key (person2)=(4) is not present in table "person".
 name  |  name   |        comment        
-------+---------+-----------------------
 Bob   | Alice   | Crypto marriage!
 Alice | Charles | OMG she did it again.
(2 rows)