我想存储无向图边(例如,对于朋友).要存储和检索节点的所有朋友a,可以使用:
每个边创建两行,每个节点在一列上查询:
+--------------------------+
| id | from_node | to_node |
+--------------------------+
| 1 | a | b |
| 2 | b | a |
+--------------------------+
SELECT * FROM `x` WHERE from_node = a
Run Code Online (Sandbox Code Playgroud)
每条边创建一行,使用OR:
+--------------------------+
| id | node_a | node_b |
+--------------------------+
| 1 | a | b |
+--------------------------+
SELECT * FROM `y` WHERE node_a = a OR node_b = a
Run Code Online (Sandbox Code Playgroud)
这样可以提高查找效率?
x包含2n行,索引from_node和to_node,以及在一列上查找y包含n行,索引node_a和node_b,以及使用两列查找OR这可能已经过时而无用,但我会发布以防它帮助其他人!
我像你的第二个例子一样存储无向图,并且有一个约束,node_a 必须小于 node_b。然后,您可以轻松地UNIQUE对该对设置约束,并知道数据是一致的。通过将 node_a 与 {a,b} 和 node_b 中的较小值进行比较,查询需要做更多的工作。PostgreSQL(我最了解的数据库)提供的功能GREATEST()和LEAST()功能在这里有所帮助。