目标:用户提交他们的通讯录,然后应用程序根据他们的电话号码查找用户之间的联系。类似于“6次握手”的想法(https://en.wikipedia.org/wiki/Six_degrees_of_separation)。
问题:使这个查询性能接近实时。当用户提交他的电话号码并获得其他电话的完整列表时,他可能知道。普通列表 - 没有连接(图形顶点等),但完整,没有分页(这里要求是因为原始目标更复杂)。
问题:是否有可能使用纯关系数据库实现接近实时的性能,而无需图形数据库(Neo4j 等)、图形扩展(bitnine agensgraph)或工作流重新设计?任何非规范化都是可能的,但据我所知,它无济于事。
鉴于:
test=# select * from connections;
user_phone | friend_phone
------------+--------------
1 | 2
1 | 3
1 | 4
2 | 6
2 | 7
2 | 8
8 | 10
8 | 11
8 | 12
20 | 30
40 | 50
60 | 70
Run Code Online (Sandbox Code Playgroud)
我希望使用电话 === 1 的用户收到以下连接:
friend_phone
--------------
2
3
4
6
7
8
10
11
12
(9 rows)
Run Code Online (Sandbox Code Playgroud)
估计真实世界的连接数真的很困难。但我至少在测试: