Postgresql 在两个圆相交区域中搜索公共对象
我正在解决一个可以用一系列要点来描述的任务:Postgresql 在两个圆相交区域中搜索公共对象,postgresql,algorithm,search,Postgresql,Algorithm,Search,我正在解决一个可以用一系列要点来描述的任务: 两种用户类型:战斗机,竞技场 每个战斗机都可以在注册过程中自由设置其地理位置和首选搜索半径(稍后他们可以在设置中更改这些值)。搜索半径,如名称所示,是用户可以搜索潜在对手的半径 每个Arena对象都有其地理位置和可用时间段 如果两个战机的搜索圈相交,且相交区域至少包含一个竞技场,则两个战机匹配 竞技场可供战斗机在其搜索半径内使用 我正在实现匹配逻辑。因此,需要实现匹配算法。我正在努力找到正确的方法 据我所知,一切都可以简化为寻找共同的Are
战斗机
,竞技场
战斗机
都可以在注册过程中自由设置其地理位置和首选搜索半径(稍后他们可以在设置中更改这些值)。搜索半径,如名称所示,是用户可以搜索潜在对手的半径
Arena
对象都有其地理位置和可用时间段
竞技场
,则两个战机匹配
竞技场
可供战斗机
在其搜索半径内使用
Arena
s。换言之,可能有许多表格可以提供每个战斗机可以使用的竞技场
的信息。这就是说,例如,一个战斗机
具有id
98具有Arena
s具有id
34,57,22,另一个具有id
17的用户具有Arena
s具有id
156,57
userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];
通过比较可用的Arena
s的id
,我们可以看到它们有一个共同的Arena
,其id
为57。所以我假设,基于这个事实,可以安全地说,他们的搜索圈相交,有一个竞技场
可能发生战斗事件
我认为这种方法可以用来确定战斗机是否匹配。我很想这样做,但我不能说基于这个想法的搜索是否有效,我看到了以下困难:所有那些竞技场
列表都应该为每个战斗机
/竞技场
提供支持。因此,如果,比方说,一些新的竞技场
被添加到数据库中,打个比方,所有那些战斗机
的可用竞技场
列表必须立即更新……这也可能是一个非常耗时的操作。如果注册了新的战斗机
,则必须计算其可用竞技场
的个人列表。如果已经存在的战斗机
改变了其地理位置,则其竞技场
也必须重新计算,以此类推
另一种方法可能是这样做,但不将那些Arena
sid
存储在数据库中。根据战斗机的(long,lat,r)
参数和竞技场的(long,lat)
参数,在飞行中进行所有计算
我相信有一些更好的方法。我想听听你对我的看法,如果你知道更好的方法,我也想知道
我正在使用PostgreSQL
13作为数据库管理系统。如果采用这种结构,我认为解决方案不多。您可以尝试将竞技场位置分组(按区域、锚定位置或类似位置),以查看是否可以减少搜索的权重。
另一个想法是为每个竞技场存储一个可用的战士列表。每次战斗机飞行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它会向他们发送一条信息,以便从列表中删除。那么这个竞技场中所有可能的战斗都是其可用战机中所有可能的组合
看看PostGIS扩展。使用点几何图形的空间索引和st_dwithin
,您可以非常方便地获得结果efficiently@JGH谢谢你的提示,我会仔细检查文档。听起来很有趣,谢谢你的想法。我还考虑过以这种或那种方式对它们进行分组,但我发现很难评估这将如何影响总体效率。似乎不努力是很难做到的。