数据库 – 是否有一种优雅的方式来存储双重关系(即用户1和用户2是朋友)

我本月在两个不同的工作中遇到了同样的问题:
Version 1: User 1 & User 2 are friends
Version 2: Axis 1 & Axis 2 when graphed should have the quadrants colored...

问题是,我没有看到使用RDBMS来存储和查询此信息的优雅方式.

有两种明显的方法

方法1:

store the information twice (i.e. two db rows rows per relationship):
u1,u2,true 
u2,u1,true
u..n,u..i,true
u..i,u..n,true

have rules to always look for the inverse on updates: 
on read,no management needed
on create,create inverse
on delete,delete inverse
on update,update inverse

Advantage:    management logic is always the same.
Disadvantage: possibility of race conditions,extra storage (which is admittedly cheap,but feels wrong)

方法2:

store the information once (i.e. one db row per relationship)
u1,true

have rules to check for corollaries:
on read,if u1,u2 fails,check for u2,u1 
on create u1,u2: check for u2,if it doesn't exist,create u1,u2
on delete,no management needed
on update,optionally redo same check as create

Advantage: Only store once
Disadvantage: Management requires different set of cleanup depending on the operation

我想知道是否有第三种方法沿着“使用f(x,y)的关键线,其中f(x,y)对于每个x,y组合是唯一的,y)=== F(Y,X)”

我的直觉告诉我应该有一些可以满足这些要求的按位运算组合.类似于两列的东西:

key1 = x&& ÿ
key2 = x y

我希望那些花更多时间在数学系的人,以及更少的时间在社会学系已经看到了这种可能性或不可能性的证据,并且可以提供一个快速的“[你好白痴],它很容易被证明(即时通讯)可能,请看这个链接“(名字叫可选)

任何其他优雅的方法也将非常受欢迎.

谢谢

解决方法

还有一种方法可以通过添加额外约束来使用第二种方法.检查u1< U2:
CREATE TABLE User
( Name VARCHAR(10) NOT NULL,PRIMARY KEY (Name)
) ;

CREATE TABLE MutualFriendship
( u1 VARCHAR(10) NOT NULL,u2 VARCHAR(10) NOT NULL,PRIMARY KEY (u1,u2),FOREIGN KEY (u1) 
    REFERENCES User(Name),FOREIGN KEY (u2) 
    REFERENCES User(Name),CHECK (u1 < u2) 
) ;

读取,创建,插入或更新的规则必须使用(LEAST(u1,GREATEST(u1,u2)).

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03